【发布时间】:2016-11-29 23:47:26
【问题描述】:
我正试图按照自己的意愿弯曲 zsh,我选择的 shell,但我对补全的语法和操作完全不知所措。 我的用例是这样的:我希望在“-e”选项下完成“ansible-playbook”支持三种变体:
- 正常文件完成:
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 参数的方式),这会让我失败。这意味着 first '-e' 参数将具有我的前缀完成工作,但在那之后的任何 '-e' 参数都变成 'dumb' 并且只允许正常的 '_files' 完成我能说什么。因此以下内容将无法正确完成:
ansible-playbook -e key=value -e @vars/file
但这会为文件本身完成:
ansible-playbook -e key=value -e vars/file
我搞砸了吗?我看到这个特定完成插件的“-M”选项具有相同类型的行为(它也变成“哑”并执行基本文件完成)。我可能只是没有搜索正确的术语或术语组合,或者可能在相当复杂的文档中错过了涵盖此内容的内容,但同样,只有几天的研究经验,我迷失了。
【问题讨论】:
标签: zsh ansible-playbook oh-my-zsh tab-completion