我试图按照我的意愿弯曲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'并完成基本文件)。我可能根本没有搜索正确的术语或术语组合,或者可能在相当复杂的文档中错过了涵盖此内容的内容,但再次,只有几天的经验深入研究,我就迷失了。
答案 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