2016-11-29 2 views
0

Ich versuche, zsh, meine Shell der Wahl, zu meinem Willen zu biegen, und bin völlig ratlos bei der Syntax und dem Ablauf der Vervollständigungen. Mein Anwendungsfall ist dies: Ich möchte Beendigungen haben für ‚ansible-Textbuch‘ unter der ‚-e‘ Option Unterstützung drei Varianten:Zsh-Vervollständigungen mit mehreren wiederholten Optionen

  • Normale Datei Abschluss: ansible-playbook -e vars/file_name.yml
  • Vorangestellter Datei Abschluss: ansible-playbook -e @vars/file_name.yml
  • Willkürliche Strings: ansible-playbook -e key=value

begann ich mit https://github.com/zsh-users/zsh-completions/blob/master/src/_ansible-playbook aus, die anständig gearbeitet, aber Änderungen erforderlich, um die Präfix-Datei Wegfindung zu unterstützen. Um dies zu erreichen geändert ich die folgenden Zeilen (die -e Linie):

... 
"(-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]'\ 

dazu:

... 
"(-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]'\ 

und hinzugefügt, um die Funktion '__at_files':

__at_files() { 
    compset -P @; _files 
} 

Dies kann sehr noobish, aber für jemanden, der das noch nie zuvor erlebt hat, war ich froh, dass dies mein Problem gelöst hat, oder zumindest dachte ich.

Dies schlägt fehl, wenn ich mehrere '-e' Parameter habe, was ein vollständig unterstütztes Modell ist (ähnlich wie Docker mehrere Argumente -v oder -p erlaubt). Was das bedeutet ist, dass der erste '-e' -Parameter meine Präfix-Abschlussarbeit haben wird, aber alle '-e'-Parameter nach diesem Punkt' dumm 'werden und nur normale' _files'-Vervollständigung erlauben, was ich sagen kann. So wird das Folgende nicht richtig abgeschlossen:

ansible-playbook -e key=value -e @vars/file 

aber dies würde komplett für die Datei selbst:

ansible-playbook -e key=value -e vars/file 

Habe ich mess up? Ich sehe die gleiche Art von Verhalten für die Option '-M' dieses speziellen Completion-Plugins (es wird auch 'dumm' und erledigt die grundlegende Dateivervollständigung). Ich habe vielleicht einfach nicht nach der richtigen Terminologie oder Kombination von Begriffen gesucht, oder vielleicht in der ziemlich komplizierten Dokumentation verpasst, was dies abdeckt, aber wieder, mit nur ein paar Tagen Erfahrung darin, bin ich verloren.

Antwort

1

Wenn mehrere -e Optionen gültig sind, sollte die _arguments Spezifikation mit * beginnen so statt:

"(-e --extra-vars)"{-e,--extra-vars}"[EXTR .... 

Verwendung:

\*{-e,--extra-vars}"[EXTR ... 

Der (-e --extra-vars) Teil zeigt eine Liste der Optionen, die nicht folgen Sie dem angegebenen. Dies wird nicht mehr benötigt, weil es vermutlich gültig ist, z. B .:

ansible-playbook -e key-value --extra-vars @vars/file 
Verwandte Themen