Die Freuden einer gut eingerichteten Shell: Autocomplete

written by Martin HĂ€cker on

Was ist schlechte VervollstÀndigung?

Um zu verstehen was ich mit guter Auto-Completion fĂŒr Shells meine, brauchen wir erst einmal eine Baseline wie eine schlechte Completion aussieht. Das lĂ€sst sich sehr gut mit Docker demonstrieren: 

docker run --rm -it --hostname shell-completion-demo debian

Erstes Experiment: ls⇄⇄ (kein Leerzeichen vor den Tabs!)

Automatische VervollstÀndigung von Kommandos - unkonfiguriert

Zeigt alle Kommandos die mit ls anfangen Zweites Experiment: ls ⇄⇄ Das zeigt bei mir:

Automatische VervollstÀndigung von Dateien - unkonfiguriert

Schon mal gut, denn hier werden die Dateien im aktuellen Ordner vervollstÀndigt.

NĂ€chste Schwierigkeitsstufe - kurze und lange Optionen: ls -⇄⇄ (Minus vor dem Tab) Das zeigt hier nichts, genauso fĂŒr lange Optionen ls --⇄⇄ (zwei mal Minus vor dem Tab)

Keine Ausgabe. ls ist eigentlich so ungefÀhr das einfachste Programm das jeder Shell beiliegt. Wenn automatische VervollstÀndigung also irgend etwas kann, dann sollte ls gut funktionieren.

Was ist gute VervollstÀndigung?

Dagegen mal ein Beispiel von meinem System:

ls⇄ zeigt die Kommandos die mit ls anfangen, mit einer Kurzbeschreibung was diese Kommandos tun.

VervollstÀndigung von Kommandos mit der Fish-Shell

Schon mit einem Tab sehe ich die Dateien, und zusĂ€tzlich sehe ich als Vorschlag den letzten Befehl den ich mit ls abgesetzt habe und kann diesen mit ⌃→ im ganzen, oder mit → wortweise akzeptieren kann.

Automatische VervollstÀndigung von Dateien mit der Fish Shell

Ein ls -⇄ergibt sofort eine Optionsliste - kurz und lang - mit einer Kurzbeschreibung was dieses Schalter tun. Ein zweites Minus und Tabls --⇄` zeigt nur noch die langen Optionen an:

VervollstÀndigung von Optionen mit der Fish-Shell VervollstÀndigung von langen Optionen mit der Fish-Shell

NatĂŒrlich kann ich mit den Pfeiltasten oder mit Tab eine der Optionen auswĂ€hlen - natĂŒrlich mit ordentlichem Highlighting. So macht arbeiten auf der Shell Spaß!

Falls Ihr verwirrt seid das mein ls andere Optionen anbietet als eures, dann liegt das daran das ich ls durch exa ersetzt habe.

Wie könnt Ihr das bei euch nutzen?

Ich nutze die Fish-Shell, da diese von Haus aus eine sehr gute Autocompletion anbietet. Das ist aber nicht fĂŒr jede, denn die Syntax der Fish Shell ist etwas anders als bei Bash/ZSH - eben nicht posix kompatibel. Ich mag das Weil es logischer und KĂŒrzer ist, aber ich komme auch nicht durcheinander mit den verschiedenen Shell-Syntaxen da ich sie schon so lange verwende.

Fast alle Shell Konfigrurations-Frameworks wie oh-my-zsh oder Prezto bieten zumindest etwas an das diesem Nahe kommen. Alle automatische Konfiguration stĂ¶ĂŸt aber irgendwann an Ihre Grenzen wenn es um die Kommandos geht, die wir tĂ€glich benutzen. docker vervollstĂ€ndigt dann nicht compose und oder kennt die Unterkommandos davon nicht oder nur unvollstĂ€ndig, kubectl und helm sind notorische Kandidaten fĂŒr die man sich selber kĂŒmmern muss.

Jetzt könnte man natĂŒrlich versuchen automatisch aus der Hilfsausgabe dieser Kommandos etwas zu generieren (das macht z.B. die Fish shell von sich aus) oder man schreibt selber etwas (argh).

Oder man wendet sich vertrauensvoll an das tool carapace, mit dem man die Completion fĂŒr Programme komfortabel fĂŒr alle Shells nachrĂŒsten kann. Als Beispiel um die die Autocompletions fĂŒr kubectl nachzurĂŒsten, einfach source <(carapace kubectl zsh) oder carapace kubectl fish | source (je nach shell) eingeben und ausprobieren ob es gefĂ€llt, und wenn ja, diese Zeile in die User-Konfiguration deiner shell eintragen und viel glĂŒcklicher sein.

Obacht: Man kann mit so einem Snippet

# ~/.zshrc 
export CARAPACE_BRIDGES='zsh,fish,bash,inshellisense' # optional
zstyle ':completion:*' format $'\e[2;37mCompleting %d\e[m'
source <(carapace _carapace)

in seiner Shell-Konfiguration alle completer des Carapace Projekts aktivieren. Das hat mir allerdings nicht gefallen,, da ich manche der eingebauten Completer der Fish-Shell noch etwas besser finde als das was Carapace bereit stellt. Aber um LĂŒcken zu ergĂ€nzen? Perfekt!

Meine Shell-Completion Konfiguration (fish!) sieht daher so aus:

# enable shell completions
set --global --export CARAPACE_BRIDGES 'zsh,fish,bash,inshellisense'
# I didn't have much luck enabling all carapace completions, but I do like some of them - especially if there is no built in fish completion for them
# carapace _carapace | source
carapace fd | source
carapace bat | source
carapace brew | source
carapace rg | source
carapace docker | source
uv generate-shell-completion fish | source
yq completion fish | source