zsh 补全:以任意顺序提供文件和 --options 的补全

zsh 补全:以任意顺序提供文件和 --options 的补全

我有示例命令foo,它采用一个或多个文件名,以及 3 个 --options 的任意组合。此外,可以在命令行上的任何位置(文件名之前、之后或之间)指定选项。

foo --bbb file.txt --aaa file2.txt --ccc

我有这个完成文件,我在其中指定了药水:

#compdef foo

 local -a args

 args+=(
    '--aaa'
    '--bbb'
    '--ccc'
 )

我必须在末尾添加什么,以便使用我的 --options 完成本地文件?

答案1

您可以致电compadd您想要声明更多完成次数就可以内置多次。通常,这通过多种方式之一发生“新”完成系统的辅助功能

您可以做的最简单的事情就是同时调用compadd_files

#compdef foo
local -a args
args=(--aaa --bbb --ccc)
compadd -- $args
_files

您应该compadd调用辅助函数,例如_describe它允许根据上下文配置完成并具有描述。

#compdef foo
local args
args=('--aaa:Enable aye' '--bbb:Enable bee' '--ccc:Enable sea')
_describe -o 'Options' args
_files

_argumentsfunction 通常可以更轻松地指定命令的完成,尽管在简单的情况下并没有太多好处。如果您的命令支持--指示后面的所有内容--都是文件名而不是选项(即使它以破折号开头),请务必使用它 - 这就是_argumentss -Soption 的作用。 before选项*表示该选项可能出现多次;如果没有它,如果该选项已经存在,则不会再次提供该选项。

#compdef foo
_arguments -S \
    '*--aaa[Enable aye]' \
    '*--bbb[Enable bee]' \
    '*--ccc[Enable sea]' \
    '*:file:_files'

如果您的命令支持--help以足够接近 GNU 建立的事实标准的格式打印帮助,您可以告诉_arguments解析 的输出--help,然后您只需要指定无法从--help输出中推断出的更精细的行为。

#compdef foo
_arguments --

如果您不需要从--help输出中推断出的内容之外的任何内容,则无需定义完成函数:只需声明_gnu_generic作为命令的完成函数。

compdef _gnu_generic foo

相关内容