子命令后的自动完成标志

子命令后的自动完成标志

我调用了一个程序luarocks,其中包含一系列子命令,例如buildinstallmake,其后带有标志。最后,命令如下:

# luarocks install varargs --server=https://example.com/`
$ luarocks make ./varargs.rockspec
$ luarocks pack ./varargs.rockspec

zsh autocomplete 命令_arguments能够获取诸如-s和之类的标志列表,--long并为它们创建描述,如下所示:

_arguments "-s[short flag]" "--long[long flag]"

install但是,如果命令中包含类似的子命令,则此方法效果不佳,因此当您键入 时luarocks install <tab>,不会出现标志列表。如何让_argument忽略未包含在标志列表中的任何子命令?

作为参考,这是我当前的代码:

#compdef luarocks

local curcontext="$curcontext" state line
typeset -A opt_args

local -a lr_commands
lr_commands=(
  build config doc
  download help install lint
  list make new_version pack
  path purge remove search
  show unpack upload write_rockspec
)

local -a generic_args
generic_args=(
  "--long[long]"
  "-s[short]"
)

_arguments \
  '1: :->cmd'\
  '*: :->args'

case $state in
  cmd)
    _arguments "1:Commands:($lr_commands)"
    ;;
  args)
    _arguments $generic_args
    ;;
esac

相关内容