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!)
Zeigt alle Kommandos die mit ls
anfangen
Zweites Experiment: ls â„â„
Das zeigt bei mir:
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.
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.
Ein ls -â„ergibt sofort eine Optionsliste - kurz und lang - mit einer Kurzbeschreibung was dieses Schalter tun. Ein zweites Minus und Tab
ls --â„` zeigt nur noch die langen Optionen an:
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