我正在尝试创建一个完成,其中我的一个完成将根据其他标志的值动态生成。例如
2 inches
4 inches
aldosta, Georgia
iami, Florida
我无法获得" -l"要动态生成的标志。
答案 0 :(得分:1)
我们可以检查$words
:
完成特殊参数
...
在完成小部件内部以及从它们调用的任何函数中,一些参数具有特殊含义;
...
words
此数组包含当前正在编辑的命令行上的单词。-
zshcompwid(1)
: Completion Special Parameters, Completion Widgets
我们可以做这样的事情:
(logs)
local -i index=${words[(I)-c]}
local -i ret=0
if ((index == 0)); then
_values 'logs' F
ret=$?
elif [[ "$words[index+1]" == container1 ]]; then
_values 'logs' A B C
ret=$?
elif [[ "$words[index+1]" == container2 ]]; then
_values 'logs' D E F
ret=$?
fi
return ret
要检查数组,使用数组Subscript Flags:
是很有用的下标标志
如果左括号表达式中的左括号或范围中的逗号后面紧跟一个左括号,则匹配的结束符号字符串将被视为标志列表,如name[(flags)exp]
中所示。 / p>-
zshparam(1)
, Subscript Flags, Array Subscripts, Array Parameters
因此,$words[(I)-c]
表示I
" flag" + -c
as" exp"对于$words
,它是"" -c"的最后匹配元素的索引;在数组$word
"。例如:
$ tmp=(my-test-command -f flag -c container1 -l)
$ echo $tmp[(I)-c]
4
$ echo $tmp[(I)container1]
5
$ tmp=(my-test-command -f flag -c container1 -c container2 -l)
$ echo $tmp[(I)-c]
6