我想为具有以下调用约定的程序编写zsh完成:
program [generaloptions] operation [operationoptions]
其中operation
是--install
,--upgrade
...
到目前为止,我有一般选项和操作选项。我的代码看起来像这样:
local generaloptions; generaloptions=(...)
local installoptions; installoptions=(...)
local upgradeoptions; upgradeoptions=(...)
case "$state" in
(install)
_arguments -s \
"$installoptions[@]" \
&& ret=0
(upgrade)
_arguments -s \
"$upgradeoption[@]" \
&& ret=0
*)
_arguments -s \
"$generaloptions[@]" \
'--install[...]: :->install' \
'--upgrade[...]: :->upgrade' \
&& ret=0
问题是,在我输入操作和第一个操作选项后,状态将重置为*)
情况。
$ program --install --installoption --<tab>
list of general options
如何设置下一个状态与旧状态相同?哪个命令具有类似的调用约定,所以我可以查看该命令的完成代码?
答案 0 :(得分:0)
主要问题是操作以--
开头,因此在参数中更难找到它们。例如,在git中,所有子命令都只是一个没有破折号的单词。所以git解决了这个问题:
所以git在每次调用完成函数时调度(这就是我所说的&#34;持有状态&#34;)。
我解决这个问题的方法是查看许多完成函数并找到具有类似调用约定的命令。我发现最有用的命令是pacman
。以下是我从中提取的内容:
# This somehow disassembles the commandline options
args=( ${${${(M)words:#-*}#-}:#-*}
case $args in
*i)
_arguments -s \
${installoptions} \
'(-i[...]' \
&& ret=0
;;
*u)
_arguments -s \
${upgradeoption} \
'-u[...]' \
&& ret=0
;;
*)
case ${(M)words:#--*} in
*--install*)
_arguments -s \
${installoptions} \
'--install[...]' \
&& ret=0
;;
*--upgrade*)
_arguments -s \
${upgradeoption} \
'--upgrade[...]' \
&& ret=0
;;
*)
_arguments -s \
{generaloptions} \
&& ret=0
;;
esac
esac
我知道,有很多出版物,但我认为你明白了。另请注意,我将--install
和--upgrade
选项从一般情况移到了操作案例中。如果你不这样做,如果你想在--install
或--upgrade
之后完成