compctl -x
nicht vorbei.
Wichtige allgemeine Regeln beim Schreiben einer Vervollständigung:
--
muß immer vor dem Befehl kommen, den man
vervollständigen will.
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
Die Option
Wenn man mehrere Einträge mit -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.
-X
erlaubt es, fuer den Aufrufenden des Kommandos
eine Mitteilung auf den Bildschirm zu senden.
-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 - \
Hängt man am Ende noch ein
's[-N]' -k zweite_liste + -f -- befehl + -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.