我的自定义脚本有 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
}