具有多个重复选项的 Zsh 补全
Zsh completions with multiple repeated options
我正试图让我的 shell 选择 zsh 屈服于我的意志,并且完全不知道补全的语法和操作。
我的用例是这样的:我希望在“-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”选项,我看到了相同类型的行为(它也变为 'dumb' 并执行基本文件完成)。我可能只是没有搜索正确的术语或术语组合,或者可能在相当复杂的文档中遗漏了涵盖此内容的内容,但同样,只有几天的经验,我迷路了。
如果多个 -e 选项有效,_arguments 规范应以 * 开头,而不是:
"(-e --extra-vars)"{-e,--extra-vars}"[EXTR ....
使用:
\*{-e,--extra-vars}"[EXTR ...
(-e --extra-vars)
部分表示不能跟在指定选项之后的选项列表。所以不再需要了,因为它可能是有效的,例如:
ansible-playbook -e key-value --extra-vars @vars/file
我正试图让我的 shell 选择 zsh 屈服于我的意志,并且完全不知道补全的语法和操作。 我的用例是这样的:我希望在“-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”选项,我看到了相同类型的行为(它也变为 'dumb' 并执行基本文件完成)。我可能只是没有搜索正确的术语或术语组合,或者可能在相当复杂的文档中遗漏了涵盖此内容的内容,但同样,只有几天的经验,我迷路了。
如果多个 -e 选项有效,_arguments 规范应以 * 开头,而不是:
"(-e --extra-vars)"{-e,--extra-vars}"[EXTR ....
使用:
\*{-e,--extra-vars}"[EXTR ...
(-e --extra-vars)
部分表示不能跟在指定选项之后的选项列表。所以不再需要了,因为它可能是有效的,例如:
ansible-playbook -e key-value --extra-vars @vars/file