
어떻게 구성해야 하는지 궁금합니다zsh에게~ 아니다파일 이름에서 와일드카드를 확장합니다. 예를 들어 다음과 같은 이름의 수백 개의 파일이 포함된 디렉터리가 있습니다.
a.foo-bar a.foo b.foo-bar b.foo c.foo-bar c.foo
탭 완성 매칭을 수행하고 싶습니다.~ 후에와일드카드이므로
cat *.foo-< tab > => cat *.foo-bar
대신에 내가 얻는 것은 다음과 같습니다.
$ 고양이 *.foo- => 고양이 a.foo-bar 파일 a.foo-bar b.foo-bar c.foo-bar
답변1
TAB
한 가지 옵션은 키 에 대한 기본 키 바인딩을 바꾸는 것입니다.
bindkey "^I" expand-or-complete
~와 함께
bindkey "^I" complete-word
일치하는 모든 파일로 확장되지는 않지만 *
별표는 그대로 유지됩니다. 이렇게 하면 끝이 없는 목록을 제거할 수 있지만 여전히 globbing 표현식을 완성하지는 못합니다.
이 문제를 해결하는 것은 훨씬 더 까다롭습니다. 당신은 당신 자신을 작성해야합니다완성 위젯(보다 man zshcompwid
).
정의부터 시작해 보겠습니다.
zle -C complete-glob menu-complete compglob
새로운 위젯이 소개됩니다.완전한 글로브, 이는 다음과 같이 동작합니다.메뉴 완성그리고쉘 기능 compglob일치 항목을 생성합니다.
[ 참고: 메뉴 완성을 원하지 않으면 훨씬 더 기본적인 옵션을 사용하십시오.완전한 단어또는목록 선택]
이 새로운 위젯을 다음과 같은 편리한 바로가기에 바인딩하세요
CTRL+K
.bindkey "^K" complete-glob
TAB
현재 형태의 위젯은 파일만 완성하므로 이것을 에 바인딩하지 마십시오 !쉘 함수 정의compglob실제 작업은 다음과 같습니다.
compglob () { setopt localoptions globsubst compset -P '*' files=(${IPREFIX}*) display=(${files/${IPREFIX}/${(q)IPREFIX}}) glob=(${files/${IPREFIX}/}) compadd -d display -- $glob }
데모:
$ touch a.foo-bar a.foo b.foo-bar b.foo c.foo-bar c.foo $ cat *.f<CTRL+K> $ cat *.foo \*.foo \*.foo-bar
내가 보는 유일한 결함은
\
제시된 목록에서 별 앞에 있다는 것입니다. 그러나 이것은 완성이 정확하기 때문에 광학적 결함일 뿐입니다.*.foo
또는*.foo-bar
.
답변2
나는 그것이 가능하다고 생각하지 않습니다. 당신은 "와일드카드 확장에 따라 유효한" 파일을 사용하고 싶지 않은 파일을 파악하도록 쉘에 요청할 뿐만 아니라 쉘이 확장할 "최상의" 와일드카드 표현을 파악하기를 원합니다. 이 방법. 두 번째 부분은 NP-완전일 것으로 예상됩니다.
답변3
아직 원하는 것을 얻을 수 있는 방법은 없지만 다음을 통해 약간의 수정(도움이 될 수도 있고 도움이 되지 않을 수도 있음)을 얻을 수 있습니다. setopt GLOB_COMPLETE
이렇게 하면 확장팩이 하나만 제공됩니다. 그런 다음 탭을 통해 탭으로 이동하거나 해당 항목만 편집하여 *
다시 만들 수 있습니다. 이는 최소한 작은 개선이 될 수 있습니다.
man zshoptions
, 및/또는 유사한 내용을 man zshcompctl
살펴볼 수도 있습니다 . man zshcompwid
zsh의 완성 작업은 꽤 복잡하므로 이를 수행할 수 있는 방법이 있을 것으로 추측됩니다.
또한 다소 관련된 질문에 유의하십시오.