내 zshrc에서 다음을 사용하고 있습니다.
zstyle ':completion:*' matcher-list 'm:{[:lower:]}={[:upper:]} r:|?=**'
(이건 덕분이다.말론)
그런데 이상한 행동을 발견했습니다. 예를 들어 다음 테스트 사례를 살펴보겠습니다.
% tree zsh-test
zsh-test
├── a-xx
├── b-xx
└── somefile
그런 다음 가능성으로 연결될 것으로 예상되는 항목을 입력 ls zsh-test/xx
하고 클릭합니다 . 대신 아무것도 나열되지 않습니다.Taba-xx
b-xx
그리고xx
제가 입력한 부분은삭제됨!
내 생각에 무슨 일이 일어나고 있는지 xx
두 가지 옵션이 생성된 다음 zsh가 공통 접두사를 찾고 있지만 하나를 찾지 못해 내 텍스트를 아무것도 대체하지 않는다는 것입니다. 이것은별로 도움이되지 않습니다. 나는 가지고있다RTM그러나 이는 직관적인 퍼지 일치 패턴을 찾는 목표를 달성하는 데 도움이 되지 않습니다.
내 패턴을 제거하지 않고 패턴과 일치하는 후보를 표시하는 방법이 있습니까?
이 동작의 이상한 점은 익숙해지지도 않는다는 것입니다. 왜냐하면 디렉터리 내부에 있고 zsh-test
무언가를 입력하면 ls xx
Tab예상대로 작동하기 때문입니다. 두 후보가 표시됩니다!
답변1
이는 Zsh가 zsh-test/
첫 번째 경우에는 이를 명시적인 접두사로 처리하지만 두 번째 경우에는 명시적인 접두사가 없기 때문에 발생합니다. (예, 명시적인 접미사가 있지만 불행하게도 Zsh는 이에 대해 아무 작업도 수행하지 않습니다.) 기본적으로 Zsh에서 명시적인 접두사를 발견하면 처음 누를 때 Tab해당 접두사를 삽입하기만 하면 기존 문자 입력이 삭제될 수 있습니다.
셸에 다음을 입력하여 이를 테스트할 수 있습니다.
autoload -Uz compinit && compinit
zstyle ':completion:*' matcher-list 'm:{[:lower:]}={[:upper:]} r:|?=**'
bindkey '^I' complete-word
zle -C complete-word complete-word complete-word
complete-word() {
_main_complete;
compadd -x "unambiguous prefix: '${compstate[unambiguous]}'";
compstate[list]='list force';
}
그런 다음 두 가지 사례를 다시 시도해 보세요. 첫 번째 경우에는 이 표시됩니다 unambiguous prefix: 'zsh-test/'
. 두 번째 경우에는 이 표시됩니다.unambiguous prefix: ''
안타깝게도 방법이 없습니다구성원하는 동작을 얻으려면 Zsh를 사용하십시오. 그러나 토끼 구멍을 더 깊이 파고들고 싶다면 .zshrc
파일에 다음 스크립트를 추가하여 원하는 동작을 얻을 수 있습니다.
zmodload -i zsh/complist
autoload -Uz compinit && compinit
zstyle ':completion:*' matcher-list 'm:{[:lower:]}={[:upper:]} r:|?=**'
bindkey '^I' complete-word
zle -C complete-word menu-select complete-word
complete-word() {
_main_complete;
compstate[list]='list';
local word=$PREFIX$SUFFIX
(( compstate[unambiguous_cursor] <= ${#word} )) && compstate[insert]='menu';
}
compstate[list]='list'
일치하는 항목이 여러 개인 경우 완료 항목이 자동으로 나열되는지 확인하세요.- 마지막 줄에서는 기본 동작이 커서 아래에 있는 현재 단어의 일부를 삭제하는지 여부를 확인하고, 그렇다면 목록의 첫 번째 항목을 삽입합니다.
- 그런 다음 ( 에서
menu-select
제공zsh/complist
)을zle -C complete-word menu-select complete-word
사용하면 선택한 항목을 사용 Tab하거나 arrow keys목록에서 다른 항목을 선택할 수 있습니다.
이러한 방식으로 Zsh의 완성 시스템을 적용하는 것은 상당히 복잡해질 수 있으며, 그 중 많은 부분이 잘 문서화되어 있지 않습니다. 제 글을 꼭 확인해 보시길 권합니다zsh-autocomplete
끼워 넣다, 이는 대부분의 사람들이 즉시 수행할 것으로 기대하는 작업을 수행하도록 Zsh 완성 시스템을 사용자 정의합니다.
답변2
메뉴를 완성하면 두 개의 zsh-test/a-xx
합계를 얻게 됩니다 zsh-test/b-xx
. xx가 삭제된 이유를 알 수 없습니다. 하지만 당신이 말하는 내용에 따르면 퍼지 일치를 얻으려는 것처럼 들리며 아마도 더 쉬운 방법이 있을 것입니다.
'r:|?=**'
꽤 공격적입니다. 퍼지의 경우 입력한 각 문자 사이에 추가 문자를 허용하지만 대체 문자와 같은 것은 처리하지 않습니다. Just를 사용 'b:=*'
하면 부분 문자열과 _approximate
완성자가 좀 더 제어된 방식으로 근사값을 처리할 수 있으며 수정이 덜 필요한 일치 항목을 선호합니다.