ZSH完成基于之前的标志

时间:2017-09-20 00:41:46

标签: zsh oh-my-zsh zsh-completion

我正在尝试创建一个完成,其中我的一个完成将根据其他标志的值动态生成。例如

2 inches
4 inches
aldosta, Georgia
iami, Florida

我无法获得" -l"要动态生成的标志。

1 个答案:

答案 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