2017-09-20 11 views
1

他のフラグの値に応じて補完の1つが動的に生成される補完を作成しようとしています。たとえば、ZSH前のフラグに基づいて完了

local state 

_arguments \ 
    '-f[fabric]:fabric:->fabrics' \ 
    '-c[containers/application where log resides]:container:->containers' \ 
    '-l[name of log file]:log:->logs' 

case "$state" in 
    (fabrics) 
     _values 'fabrics' \ 
      'fab1' \ 
      'fab2' 
    ;; 
(containers) 
    _values 'containers' \ 
     'container1' \ 
     'container2' 
    ;; 
(logs) 
    # show A B C if "-c container1" was entered 
    # show D E F if "-c container2" was entered 
    # show G if "-c" was not provided yet 
esac 

"-l"フラグを動的に生成するのに問題があります。

答えて

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]のようにフラグのリストとみなされます。

からzshparam(1), Subscript Flags, Array Subscripts, Array Parameters

ので、$words[(I)-c]は "アレイ$wordに "-c" の最後の一致した要素のインデックス" である$wordsための "EXP" としてI "フラグ" + -cを意味します。例:

$ 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 
+0

これは素晴らしいです!私はそれを働かせましたが、私は最初のインデックス部分をあまり理解していません。 (I)と-cが何であるか説明できますか? – peter1234

+1

更新;添字フラグを使って配列を検査するためのいくつかの例/用法を追加しました。 – hchbaw

関連する問題