
Ich habe eine Zsh-Vervollständigung für benutzerdefinierte Skripte, bei der ein Parameter eine URL (also eine Zeichenfolge) sein muss und es dann mehrere optionale Parameter gibt: --AAA --BBB --CCC:
_arguments -S : \
'--AAA' \
'--BBB' \
'--CCC' \
'1: :'
Die Vervollständigung funktioniert allerdings nur, nachdem der URL-Parameter angegeben wurde, also:
myscript URL --A<TAB>
Dies wird automatisch vervollständigt--AAA
Aber wenn ich:
myscript --A<TAB>
dann wird die einzige passende Option aufgelistet --AAA, aber sie wird nicht automatisch vervollständigt, auch wenn ich das tue --AA<TAB>
. Ich muss es manuell eingeben.
Wenn ich mein Vervollständigungsskript ändere wie folgt:
_arguments -S : \
'--AAA' \
'--BBB' \
'--CCC'
Die automatische Vervollständigung der Parameter funktioniert, aber sobald ich die URL angebe, werden keine anderen Optionen vervollständigt.
Wie teile ich also der ZSH-Vervollständigung mit, dass mein Skript eine URL erwartet (d. h. ein String-Argument – ich möchte nicht, dass Zsh mit der Vervollständigung von Filenemes am aktuellen Speicherort beginnt) und optionale Parameter entweder vor oder nach dieser URL vervollständigt werden können?
Hinweis: Ich versuche nicht, die URL automatisch zu vervollständigen. Ich versuche nur, die Vervollständigung sowohl vor als auch nach dieser einen URL-Zeichenfolge zu erreichen.
Antwort1
Mit dem geposteten Code myscript --A
Tabversucht zsh nach entweder ein optionales oder ein nicht optionales Argument Nummer 1 zu vervollständigen. Die Aktion für Argument 1 ist leer, was in den Bereich fällt, in dem dieHandbuchbeschreibt unter „(einzelnes nicht in Anführungszeichen gesetztes Leerzeichen)“ (dieser Fall wird tatsächlich ausgelöst, wenn die Aktion ausschließlich aus null oder mehr Leerzeichen besteht):
Dies ist nützlich, wenn ein Argument erforderlich ist, es aber nicht möglich oder wünschenswert ist, Übereinstimmungen dafür zu generieren. Die Nachricht wird angezeigt, es werden jedoch keine Vervollständigungen aufgelistet.
Es gibt keine anzuzeigende Nachricht: Die Nachrichteneingabe ist ein einzelnes Leerzeichen, daher hat die Aktion „Anzeigen“ keine visuelle Wirkung. Die internen Aktionen zum Anzeigen einer Nachricht (in_message
) durchgeführt werden, und insbesonderecompstate[insert]
ist auf leer gesetzt. Dies signalisiert der Benutzeroberfläche der Vervollständigung, dass die Vervollständigung mehrdeutig ist, auch wenn sich herausstellt, dass es nur eine einzige gültige Vervollständigung gibt.
Die Lösung besteht darin, explizit dafür zu sorgen, dass zsh denkt, dassEs gibt keine Abschlüsse, anstatt es denken zu lassen, dassEs gibt Vervollständigungen, aber sie können nicht generiert werden. Eine der folgenden Möglichkeiten ist geeignet:
_arguments … '1: :()'
_arguments … '1: :{}'
_arguments … '1: : true'
Beachten Sie, dass Sie wahrscheinlich verwenden sollten, wenn das Argument eine URL ist _urls
. Dies führt nach der Eingabe weiterhin nur zu Vervollständigungen für Optionen -
(sofern keine URL mit einem beginnt -
oder Sie sehr aggressive Einstellungen für die Teilzeichenfolgenvervollständigung haben).