내 사용자 정의 스크립트에는 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
}