Zsh完成了多个重复选项

时间:2016-11-29 23:47:26

标签: zsh ansible-playbook oh-my-zsh tab-completion

我试图按照我的意愿弯曲zsh,我选择的shell,并且在完成语法和操作方面完全不知所措。 我的用例是这样的:我希望完成“ansible-playbook'根据' -e'选项支持三种变体:

  • 正常文件完成:ansible-playbook -e vars/file_name.yml
  • 预先填写的文件:ansible-playbook -e @vars/file_name.yml
  • 任意字符串:ansible-playbook -e key=value

我从https://github.com/zsh-users/zsh-completions/blob/master/src/_ansible-playbook开始,效果不错,但需要修改以支持前缀文件路径。为了达到这个目的,我修改了以下行(-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:(EXTRA_VARS)"\
'--flush-cache[clear the fact cache]'\

到此:

...
"(-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]'\

并添加了' __ at_files'功能:

__at_files () {
  compset -P @; _files
}

这可能是非常无声的,但对于之前从未遇到过这种情况的人来说,我很高兴这解决了我的问题,或者我认为。

如果我有多个' -e'参数,完全是支持的模型(类似于docker允许多个-v或-p参数)。这意味着首先' -e'参数将有我的前缀完成工作,但任何' -e'在那一点之后的参数变得“愚蠢”。并且只允许正常的' _files'从我所知道的完成。因此,以下内容无法正常完成:

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

但这将完成文件本身:

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

我搞砸了吗?对于这个特定的完成插件,我看到了相同类型的行为' -M'选项(它也变成了'dumb'并完成基本文件)。我可能根本没有搜索正确的术语或术语组合,或者可能在相当复杂的文档中错过了涵盖此内容的内容,但再次,只有几天的经验深入研究,我就迷失了。

1 个答案:

答案 0 :(得分:1)

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

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

使用:

\*{-e,--extra-vars}"[EXTR ...

(-e --extra-vars)部分表示不能遵循指定选项的选项列表。所以不再需要了,因为它可能是有效的,例如:

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