在zsh完成中保持状态

时间:2014-07-23 17:11:59

标签: zsh zsh-completion

我想为具有以下调用约定的程序编写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

如何设置下一个状态与旧状态相同?哪个命令具有类似的调用约定,所以我可以查看该命令的完成代码?

1 个答案:

答案 0 :(得分:0)

主要问题是操作以--开头,因此在参数中更难找到它们。例如,在git中,所有子命令都只是一个没有破折号的单词。所以git解决了这个问题:

  1. 找到没有短划线的第一个参数,因为它必须是子命令
  2. 根据子命令调度该子命令的命令行参数。
  3. 所以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之后完成

    ,你就会失去参数