탭 완료 시 와일드카드를 확장하지 마세요.

탭 완료 시 와일드카드를 확장하지 마세요.

어떻게 구성해야 하는지 궁금합니다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).

  1. 정의부터 시작해 보겠습니다.

    zle -C complete-glob menu-complete compglob
    

    새로운 위젯이 소개됩니다.완전한 글로브, 이는 다음과 같이 동작합니다.메뉴 완성그리고쉘 기능 compglob일치 항목을 생성합니다.

    [ 참고: 메뉴 완성을 원하지 않으면 훨씬 더 기본적인 옵션을 사용하십시오.완전한 단어또는목록 선택]

  2. 이 새로운 위젯을 다음과 같은 편리한 바로가기에 바인딩하세요 CTRL+K.

    bindkey "^K" complete-glob
    

    TAB현재 형태의 위젯은 파일만 완성하므로 이것을 에 바인딩하지 마십시오 !

  3. 쉘 함수 정의compglob실제 작업은 다음과 같습니다.

    compglob () {
        setopt localoptions globsubst
        compset -P '*'
        files=(${IPREFIX}*) 
        display=(${files/${IPREFIX}/${(q)IPREFIX}}) 
        glob=(${files/${IPREFIX}/}) 
        compadd -d display -- $glob
    }
    
  4. 데모:

    $ 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 zshcompwidzsh의 완성 작업은 꽤 복잡하므로 이를 수행할 수 있는 방법이 있을 것으로 추측됩니다.

또한 다소 관련된 질문에 유의하십시오.

bash처럼 와일드카드를 완성하기 위해 zsh의 자동 완성을 어떻게 얻나요?

관련 정보