- Einführung, wie sich in Bash und Zsh eine Tab-Vervollständigung implementieren lässt, die auch für bereits vollständig eingegebene Wörter Beschreibungen anzeigt
- Bash und Zsh verwenden unterschiedliche APIs für die Tab-Vervollständigung, und nur Zsh bietet standardmäßig die Funktion Beschreibungen in der Vervollständigung anzuzeigen
- Es wird eine Struktur implementiert, die Kandidaten mit
_generate_foo_completions erzeugt und in Bash über COMPREPLY, in Zsh über compadd zurückgibt
- Um die Beschreibungsfunktion von Zsh auch in Bash umzusetzen, werden Beschreibungen in die Kandidaten-Strings eingebettet und nur bei einem einzelnen Kandidaten wieder entfernt
- Selbst bei einem einzelnen Kandidaten wird die Funktion verbessert, indem absichtlich Mehrdeutigkeit hinzugefügt wird, damit bei Eingabe von
<TAB> eine Beschreibung angezeigt wird
- Das finale Skript bietet in beiden Shells dieselbe User Experience und unterstützt Teil-Vervollständigung, vollständige Vervollständigung und die Anzeige von Kandidaten-Beschreibungen
Hintergrund des Problems
- Tab-Vervollständigung (tab-completion) ist nützlich, um Befehle oder Flags zu erkunden, und hilft besonders dann, wenn man eine API oder ein CLI-Tool zum ersten Mal nutzt
- Zsh zeigt standardmäßig nur dann Beschreibungen an, wenn es mehrere Kandidaten gibt, Bash kann das nur über zusätzliche Konfiguration
- Für bereits vollständig eingegebene Wörter zeigen jedoch beide Shells keine Beschreibungen an
- Dadurch müssen Nutzer, um eine Beschreibung zu sehen, den folgenden umständlichen Ablauf durchlaufen
- Einige Zeichen löschen, sodass mehrere Kandidaten passen
- Die Taste
<TAB> drücken, um die Kandidatenliste anzuzeigen
- Die gewünschte Beschreibung visuell suchen
- Die gelöschten Zeichen erneut eingeben, um den Befehl auszuführen
Überblick über den Lösungsansatz
- Auch bei einem einzelnen Kandidaten wird eine Dummy-Vervollständigung (dummy completion) hinzugefügt, um Mehrdeutigkeit zu erzeugen
- Dadurch geben sowohl Bash als auch Zsh die Kandidatenliste samt Beschreibung aus
- Dabei muss jedoch darauf geachtet werden, dass der Beschreibungstext nicht in den eigentlichen Befehl eingefügt wird
Grundkonzept
- Tab-Vervollständigung arbeitet so, dass bei Eingabe von
<TAB> das aktuelle Wort und die Cursorposition übernommen und anschließend mögliche Kandidatenlisten zurückgegeben werden
- Bash: Kandidaten werden dem Array
COMPREPLY zugewiesen
- Zsh: Kandidaten werden mit dem Befehl
compadd registriert
- Die Funktion
_generate_foo_completions gibt Kandidaten-Strings aus; in der Praxis können diese dynamisch auf Basis des CLI-Status erzeugt werden
Bash und Zsh gleichzeitig unterstützen
- Implementierung passend für jede Shell über die Funktionen
_complete_foo_bash und _complete_foo_zsh
- Unterscheidung über
if [ -n "${ZSH_VERSION:-}" ]; then ... elif [ -n "${BASH_VERSION:-}" ]; then ... fi
- Nutzer registrieren das Skript in
.bashrc oder .zshrc und wenden es anschließend an
Anzeige von Beschreibungen in Zsh
- Für Kandidaten-Strings wird das Format
Name: Beschreibung verwendet
- Zsh: Übergibt Name und Beschreibung als parallele Arrays mit
compadd -d raw -- $trimmed
- Bash: Übergibt nur Kandidaten an
COMPREPLY, bei denen der Beschreibungsteil entfernt wurde (standardmäßig ohne Beschreibungsunterstützung)
Beschreibungen in Bash implementieren
- Bei mehreren Kandidaten werden Strings mit enthaltener Beschreibung unverändert angezeigt
- Nur bei einem einzelnen Kandidaten wird die Beschreibung entfernt
- Dabei wird das Verhalten der Bash-Vervollständigung genutzt, die nur das gemeinsame Präfix einfügt, sodass die Beschreibung nicht in die tatsächliche Eingabe übernommen wird
Beschreibungen auch bei einem einzelnen Kandidaten anzeigen
- Damit auch bei
<TAB> auf einem vollständig vervollständigten Wort eine Beschreibung erscheint, wird ein Dummy-Kandidat ergänzt, um Mehrdeutigkeit zu erzwingen
- Zsh: Fügt den Dummy-Kandidaten sowohl zu den beiden parallelen Arrays
raw und trimmed hinzu
- Bash: Fügt bei einem einzelnen Kandidaten nur den Namen zu
trimmed hinzu
Endergebnis
Noch keine Kommentare.