Programmierung von komplexeren Vervollständigungen mit compctl

Vervollständigungen sind eine besondere Stärke der ZSH. Will man wirklich komplexe Vervollständigungen programmieren, dann kommt man an der Funktion compctl -x nicht vorbei. Wichtige allgemeine Regeln beim Schreiben einer Vervollständigung:
  • -- muß immer vor dem Befehl kommen, den man vervollständigen will.
  • In eckigen Klammern darf häufig kein Leerzeichen vorkommen.
  • Die Programmierung von Vervollständigungsalgorithmen gehört zu den spannenden Dingen der ZShell, wenn sie auch nicht zu den leichtesten Uebungen gehört.

    Erst einmal kann man sich die Liste aller Vervollständigungen mit compctl -L auflisten lassen.

    compctl -L alias listet beispielsweise die zu alias vorhandenen Algorithmen auf. compctl -x 'c[-1,-M]' -k liste -- befehl vervollständigt befehl -M [Leerzeichen] mit den Einträgen, die in liste enthalten sind. z.b. liste=(eintrag_eins eintrag_zwei eintrag_drei).

    Auf Klammern und Anführungszeichen samt Dollarzeichen kann man bei einer Liste netterweise verzichten. Die Zsh erkennt auch -k liste.
    Stände statt -1 -2, dann würde das übernächste Wort vervollständigt, nicht das nächste.
    ( Positive Werte machen wenig Sinn, oder doch? )
    Wichtig ist bei -x Compctl-Befehlen außerdem das -- vor befehl. Damit weiß compctl, daß jetzt der Befehl und nicht ein zweiter Fall für Vervollständigung kommt.

    compctl -x 's[-M] -k liste -- befehl vervollständigt befehl -M mit den Einträgen von liste, wenn nach dem -M kein Leerzeichen kommt. Verwendet man statt s S, dann ist das -M schon Teil der Vervollständigung:
    compctl -x 'S[--]' -k "(--version --help)" -- befehl listet alsonach befehl -- TAB nicht noch zusätzlich zwei neue Bindestricke auf.
    compctl -x 'p[1,3]' -k "(wort1 wort2 wort3 wort4)" -- befehl listet bei den 3 ersten Parametern von "befehl" aus der Wortliste Vervollständigungen auf. Ein w vor den eckigen Klammern sucht ein bestimmtes Wort als Parameter. In den eckigen Klammern steht als erstes, an welcher Stelle das Wort gesucht wird und dann, welches Wort: compctl -x 'w[1,tier]' -k "(schwein hahn kuckuck)" -- befehl würde nur dann nach tier [leerzeichen] ein bestimmtes Tier ausgeben, wenn tier als erster Parameter folgt, sonst nicht. Ein großes W statt w vervollständigt nach einem Muster, z.B. tie*.
    Ein n statt w vervollständigt immer dann, wenn das Wort enthalten ist.
    compctl -x 'n[1,tier]' -k "(schwein hahn kuckuck)" -- befehl
    Hier würde auch dann vervollständigt werden, wenn der 1. Parameter haustier wäre und zwar direkt nach tier ohne Leerzeichen. compctl -x 'N[1,tier]' -k "(schwein hahn kuckuck)" -- befehl
    vervollständigt immer dann, wenn irgendwo als 1. Parameter der Buchstabe t, i , e oder r steht. "tier" ist hier also eine Buchstaben-Klae. Auch hier wird direkt ohne Leerzeichen vervollständigt.
    compctl -x 'r[anfang,ende]' -k "(schwein hahn kuckuck)" -- befehl
    In diesem Fall wird immer dann vervollständigt, wenn das Stichwort anfang gefallen ist. Es wird solange vervollständigt, bis das Stichwort "ende" als Parameter gefallen ist.
    Ein großes R führt statt anfang, ende auch mit *fa, *nde, also mit Mustern die Vervollständigung durch.

    Die Option -X erlaubt es, fuer den Aufrufenden des Kommandos eine Mitteilung auf den Bildschirm zu senden.

    Wenn man mehrere Einträge mit -x machen will, fügt man einfach ein [leerzeichen] [bindestrich] [leerzeichen] [backslash] am Ende der Zeile ein und fährt dann auf der nächsten Zeile fort.
    compctl -x 's[-M]' -k liste - \
    's[-N]' -k zweite_liste + -f -- befehl
    Hängt man am Ende noch ein + -f an, dann werden zusätzlich noch die Dateinamen des aktüllen Ordners aufgelistet, wenn die nach -x aufgeführte Bedingung zutrifft. ( Im Beispiel also befehl -M [kein leerzeichen] ) compctl -x \ 'c[-1,-M]' \ -k "(eins zwei)" - \ 'c[-1,-n]' \ -k "(drei vier )" - \ 'c[-1,-o]' \ -k "(fünf sechs)" - \ 's[-]' \ -k "(sieben acht)" - \ -- befehl Das obere Beispiel stellt dar, wie man für 4 verschiene Optionen vervollständigen lassen kann.