具有多个重复选项的Zsh补全

具有多个重复选项的Zsh补全,zsh,ansible-playbook,oh-my-zsh,tab-completion,Zsh,Ansible Playbook,Oh My Zsh,Tab Completion,我正试图让我选择的shell zsh屈服于我的意愿,我完全不知道补全的语法和操作。 我的用例是这样的:我希望在“-e”选项下完成“ansible playbook”,支持三种变体: 正常文件完成:ansible playbook-e vars/file\u name.yml 前置文件完成:ansible playbook-e@vars/file_name.yml 任意字符串:ansible playbook-e key=value 我开始使用它,它工作得很正常,但需要修改以支持带前缀的文件路

我正试图让我选择的shell zsh屈服于我的意愿,我完全不知道补全的语法和操作。 我的用例是这样的:我希望在“-e”选项下完成“ansible playbook”,支持三种变体:

  • 正常文件完成:
    ansible playbook-e vars/file\u name.yml
  • 前置文件完成:
    ansible playbook-e@vars/file_name.yml
  • 任意字符串:
    ansible playbook-e key=value
我开始使用它,它工作得很正常,但需要修改以支持带前缀的文件路径。为了实现这一点,我修改了以下几行(e行):

为此:

...
"(-D --diff)"{-D,--diff}"[when changing (small files and templates, show the diff in those. Works great with --check)]"\
"(-e --extra-vars)"{-e,--extra-vars}"[EXTRA_VARS set additional variables as key=value or YAML/JSON]:extra vars:__at_files"\
'--flush-cache[clear the fact cache]'\
并添加了“\u在\u文件”功能:

__at_files () {
  compset -P @; _files
}
这可能是非常愚蠢的,但对于一个从未遇到过这种情况的人来说,我很高兴这解决了我的问题,至少我是这么想的

如果我有多个'-e'参数,这将使我失败,这完全是一个受支持的模型(类似于docker允许多个-v或-p参数)。这意味着第一个'-e'参数将以我的完成工作为前缀,但在该点之后的任何'-e'参数都将变为“哑”参数,并且根据我的判断,只允许正常的'\u文件'完成。因此,以下内容将无法正确完成:

ansible-playbook -e key=value -e @vars/file
但这将完成文件本身:

ansible-playbook -e key=value -e vars/file

我搞砸了吗?我看到这个特殊的完成插件的'-M'选项有相同类型的行为(它也会变成'dumb'并完成基本的文件完成)。我可能只是没有搜索正确的术语或术语组合,或者可能在相当复杂的文档中没有找到涵盖这一点的内容,但同样地,由于只有几天的挖掘经验,我迷失了方向。

如果多个-e选项有效,则_arguments规范应该以*开始,而不是:

"(-e --extra-vars)"{-e,--extra-vars}"[EXTR ....
使用:

(-e--extra vars)
部分表示一个选项列表,该列表不能跟在所指定的选项后面。因此不再需要这样做,因为这样做可能是有效的,例如:

ansible-playbook -e key-value --extra-vars @vars/file

如果多个-e选项有效,_arguments规范应以*so开头,而不是:

"(-e --extra-vars)"{-e,--extra-vars}"[EXTR ....
使用:

(-e--extra vars)
部分表示一个选项列表,该列表不能跟在所指定的选项后面。因此不再需要这样做,因为这样做可能是有效的,例如:

ansible-playbook -e key-value --extra-vars @vars/file