带子命令和继承选项的zsh自动补全

时间:2018-12-05 00:37:10

标签: zsh zsh-completion

我有一个程序,该程序以“-”开头的“全局”可选参数可以放在非可选子命令之前或之后。我对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

,并且进一步的自动完成功能为空。所以我的问题是,在完成定义中我在做什么错?如何获得可选参数以在子命令的两侧自动完成?

0 个答案:

没有答案