2017-09-20 1 views
1

Ich versuche eine Completion zu erstellen, bei der eine meiner Komplettierungen abhängig von den Werten der anderen Flags dynamisch generiert wird. Zum BeispielZSH Completion basierend auf dem vorherigen Flag

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 

Ich habe Probleme, die "-l" -Flag zu dynamisch generiert werden.

Antwort

1

Wir konnten inspizieren die $words:

Completion Spezielle Parameter
...
Innen Abschluss Widgets und alle von ihnen aufgerufenen Funktionen haben einige Parameter eine besondere Bedeutung;
... words
Dieses Array enthält die Wörter in der Befehlszeile, die gerade bearbeitet werden.

- zshcompwid(1): Completion Special Parameters, Completion Widgets

Wir könnten die Sachen tun, wie folgt:

(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 

Arrays zu kontrollieren, ist es nützlich, das Array Subscript Flags zu verwenden:

Tiefgestellte Flaggen
Wenn der öffnenden Klammer oder dem Komma in einem Bereich in einem beliebigen Indexausdruck direkt eine öffnende Klammer folgt, wird die Zeichenfolge bis zur übereinstimmenden schließenden als eine Liste von Flags angesehen, wie in name[(flags)exp].

- zshparam(1), Subscript Flags, Array Subscripts, Array Parameters

So bedeutet $words[(I)-c]I "Flag" + -c als "exp" für $words die "Last Anpasselement des Index "c" in dem Array $word" ist. Zum Beispiel:

$ 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

Das ist großartig! Ich habe es funktioniert, aber ich verstehe den ersten Indexteil nicht ganz. Kannst du erklären, was (I) und -c ist? – peter1234

+1

Aktualisiert; Ich habe ein Beispiel/eine Verwendung hinzugefügt, um Arrays mit Index-Flags zu untersuchen. – hchbaw

Verwandte Themen