zsh完全态的保持态

zsh完全态的保持态,zsh,zsh-completion,Zsh,Zsh Completion,我想为具有以下调用约定的程序编写zsh补全: program [generaloptions] operation [operationoptions] 其中操作是-install,-upgrade 到目前为止,我拥有的是一般选项和操作选项。我的代码如下所示: local generaloptions; generaloptions=(...) local installoptions; installoptions=(...) local upgradeoptions; upgradeopt

我想为具有以下调用约定的程序编写zsh补全:

program [generaloptions] operation [operationoptions]
其中操作是-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
问题是,在我键入操作和第一个操作选项后,状态会重置为*情况

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

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

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
查找不带破折号的第一个参数,因为它必须是子命令 基于子命令向该子命令的命令行参数分派。 所以git在每次调用完成函数时都会分派,这就是我保持状态的意思

我解决这个问题的方法是通过查看许多完成函数并找到一个具有类似调用约定的命令。我发现最有用的命令是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选项从一般情况移动到了操作情况。如果你不这样做,如果你想在安装或升级后完成,你就失去了这个论点