고쳐 쓰다:

고쳐 쓰다:

내 사용자 정의 스크립트에는 zsh 완료 규칙이 있습니다 h.

#compdef h

_arguments -S : \
    '-A+:' \
    '-B+:' \
    '-C+:' \
    '-i' \
    '-w'

내 사용자 정의 스크립트는 위에 표시된 옵션과 하나 이상의 임의 문자열을 사용합니다. 문자열이 제공되지 않으면 완성이 작동합니다.

h <TAB>
-A  -B  -C  -i  -w  

그러나 문자열을 제공하면 완성이 더 이상 작동하지 않습니다.

h foo -<TAB>

아무것도 없습니다.

하나 이상의 문자열을 제공하는 경우에도 완성을 어떻게 사용합니까?

고쳐 쓰다:

'*:string:'@Gilles가 제안한 대로 추가했습니다.

#compdef h

_arguments -S : \
    '*:string:' \
    '-A+:' \
    '-B+:' \
    '-C+:' \
    '-i' \
    '--color' \
    '-w'

그런데 완료 동작이 이상하네요. 내가 할 때 :

h some text -<TAB>

실제로 사용할 수 있는 옵션이 나열되어 있지만 완료되지는 않습니다.

내가 할 때 :

h some text --co<TAB>

사용 가능한 --color 옵션을 표시하지만 옵션이 모호하지 않더라도 나머지는 완료하지 않습니다.

답변1

사람의 마음 속 깊은 곳에서 선택의 zshcompsys(1)여지가 있을 수 있습니다.-A_arguments

-A pat Do not complete options after the first non-option argument
       on the line. pat is a pattern matching all strings which are
       not to be taken as arguments. For example, to make _arguments
       stop completing options after the first normal argument, but
       ignoring all strings starting with a hyphen even if they are
       not described by one of the optspecs, the form is `-A "-*"'.

거부는 도움이 되지 않습니다. 어쨌든 패턴은 *"아무것도 매개변수로 간주되지 않음"을 의미하는 것으로 보이므로 옵션은 옵션이 아닌 매개변수 다음에 완료되어야 합니다.

#compdef h
local ret=1
_arguments -A "*" -S : \
    '-A+:' \
    '-B+:' \
    '-C+:' \
    '-i' \
    '-w' \
    && ret=0
return $ret

사용법( _h완성 스크립트가 다음 위치에 있다고 가정) ~/.zsh/functions:

% zsh -f
lion% print $fpath
lion% fpath=( ~/.zsh/functions $fpath )
lion% autoload -U compinit
lion% compinit
lion% h -w foo -
-A  -B  -C  -i

-ZSH는 사용 가능한 옵션을 완료한 후 즉시 커서를 사용합니다. 완료 스크립트가 시작되었는지 확인합니다(뒤쪽에다음을 통해 명령에서 Tab 키를 누릅니다.

lion% which _h
_h () {
        local ret=1
        _arguments -A "*" -S : '-A+:' '-B+:' '-C+:' '-i' '-w' && ret=0
        return $ret
}

관련 정보