我有一个程序,该程序以“-”开头的“全局”可选参数可以放在非可选子命令之前或之后。我对zsh自动完成配置的尝试以令人惊讶的方式失败了:
在这里,我将尽可能简单地演示自动完成配置:
#compdef myprog
local curcontext="$curcontext" state line
typeset -A opt_args
local -a opts; opts=('--first' '--second')
_arguments -C -s -S $opts ':cmd:->cmds' '*::args:->args'
case $state in
cmds)
local -a cmds;
cmds=('piano:play the piano'
'synth:play the synth')
_describe -t cmds "command" cmds;;
args)
case $line[1] in
piano) __piano;;
synth) __synth;;
esac;;
esac
__piano() {
opts+=('--third' '--fourth')
_arguments -C -s -S $opts
}
__synth() {
opts+=('--fifth' '--sixth')
_arguments -C -s -S $opts
}
当我在子命令“ piano”之后按Tab时,将得到我期望的所有四个选项:
> myprog piano --<TAB>
--first --fourth --second --third
此外,如果我在__piano()中添加了一个选项之后又进行了制表,那么我仍然可以得到其余的三个,正如我期望的那样:
> myprog piano --third --<TAB>
--first --fourth --second
现在,当我在“顶级”选项a(在此情况下为--first或--second)中的一个选项卡之后切换时,自动完成功能认为--second是剩下的唯一选项,并且将其填充。是:
> myprog piano --first --<TAB>
导致:
> myprog piano --first --second
,并且进一步的自动完成功能为空。所以我的问题是,在完成定义中我在做什么错?如何获得可选参数以在子命令的两侧自动完成?