Zsh-Aliase mit Autocompletion
Geschrieben am 03-08-2025 - ⧖ 3 minMir ist kein anderer Titel eingefallen, deswegen muss der reichen. Ich habe in meiner ~/.zsh/zshmisc u. a. folgendes stehen:
# Setting abbreviation like 'iab' with Vim.. YES! Zsh _IS_ evil *hr*. I
# use this instead of "global aliases".
# $ Igr<Space>
# will be expanded to
# $ groff -s -p -t -e -Tlatin1 -mandoc
typeset -A myiabs
myiabs=(
"Im" "| more"
"Ia" "| awk"
"Ig" "| grep"
"Ieg" "| egrep"
"Iag" "| agrep"
"Igr" "groff -s -p -t -e -Tlatin1 -mandoc"
"Ip" "| $PAGER"
"Ih" "| head"
"Ik" "| keep"
"It" "| tail"
"Is" "| sort"
"Iv" "| $EDITOR"
"Iw" "| wc"
"Ix" "| xargs"
"Igm" "git commit -m"
)
my-expand-abbrev() {
local MATCH
LBUFFER=${LBUFFER%%(#m)[_a-zA-Z0-9]#}
LBUFFER+=${myiabs[$MATCH]:-$MATCH}
zle self-insert
}
Damit wird z. B. Ih zu | head vervollständigt, sobald ich Ih<Space> eingebe. Das ist alles schön und gut und funktioniert auch soweit, aber das geht auch besser. Nämlich mit zsh-abbr. Damit kann man dann auch Aliase expandieren oder auch nicht; wenn man Ih zu | head ausschreiben will, geht das wie gewohnt mit der Eingabe von Ih<Space> Will man Ih nicht expandieren, dann gibt man einfach Ih<Ctrl+Space> ein. Man hat auch den Cursor an einer bestimmten Stelle positionieren. Ein
$ abbr -s gco="git checkout -b % main"
den Cursor auf den Platzhalter % setzen. Wenn man jedoch
$ abbr -s mkdc='mkdir % && cd $_'
eingibt, bekommt man ein abbr add: Expected one argument, got 2: zu lesen, aber dem kann man mit den Parametern -S -q entgegenwirken. Das einzige "Problem" ist die Kombination aus dem Plugin zsh-autosuggestions und zsh-abbr, aber dafür gibt es Abhilfe. Anstelle von zsh-autosuggestions kann man das Plugin zsh-autosuggestions-abbreviations-strategy verwenden. Das bietet die gleiche Funktionalität, aber halt kompatibel mit zsh-abbr.
Ich dachte eigentlich das ich mit der Konfiguration der Zsh mittlerweile fertig wäre, aber jetzt muss ich meine Aliase umbauen. Sprich ich muss die Aliase der Zsh auf die Syntax von zsh-abbr umschreiben; das ist allerdings schnell erledigt, da die Option import-aliases zur Verfügung steht. Was etwas mehr Aufwand wird, ist das Laden der Aliase. In meinem Fall muss ich auch die "normalen" Aliase nutzen können, wenn zsh-abbr nicht verfügbar ist, da ich die Konfiguration auf verschiedenen Rechnern nutze. Dazu kommt auch, das ich unterschiedliche Betriebssysteme und Distributionen nutze (Artix, Debian, Free-/OpenBSD, ..) und ich z. B. unter OpenBSD kein Alias benötige, das "aptitude update" ausführt (um mal ein blödes Beispiel zu nennen). Das bedeutet das ich zuerst prüfen muss ob zsh-abbr installiert ist um dann die dementsprechende Datei mit den Aliasen zu laden; innerhalb dieser Datei müssen dann die Aliase je nach eingesetztem Betriebssystem geladen werden und.. hab ich schonmal erwähnt das ich keine Lust habe? *sigh*