Block > Schalen
5 min (946 Wörter, 6160 Zeichen)
Inhaltsverzeichnis
Zu Beginn meiner Linuxnutzung hatte ich die Bash als meine Shell genutzt (war bzw. ist ja auch Standard), teilweise auch mit oh-my-bash . Irgendwann bin ich dann ueber Zsh und oh-my-zsh gestolpert und habe das dann hauptsaechlich genutzt. Auf Arbeit war es weiterhin ueberall Bash.
Ca. 2015 (?), nachdem ich meinen Terminal Emulator geaendert hatte (auf xiate , Blockpost in Arbeit), musste (?) auch die Zsh dran glauben. Denn ich hatte zwischenzeitlich immer mal wieder was von fish gehoert, aber der Mut zu aendern war nicht so gross 😉
fish #
Dank noqqe (mal wieder) wollte ich fish ca. 2018 nun doch mal etwas laenger austesten. Anscheinend wollte ich damals oh-my-zsh loswerden. Die Gruende weiss ich leider nicht mehr.
fish habe ich dann auch jahrelang eingesetzt (nicht nur unter Arch Linux sondern auch auf dem Arbeitsrechner (diverse MacBook Pros) und diversen Raspberry Pis ).
Der Wechsel war natuerlich einfach (auch dank dem hervorragenden Arch Linux Wiki ):
brew install fish
sudo pacman -S fish
sudo apt-get install fish
Allerdings habe ich nicht fish als Standardshell genutzt (sondern nur
als interaktive Shell) indem ich weiterhin Bash als Standard hatte und
eine simple .bashrc
mit exec fish
als Inhalt.
fisher #
Zur Pluginverwaltung kam bei mir fisher zum Einsatz. Zuletzt hatte ich folgende Plugins (andere Favoriten ) in Benutzung:
$ fisher ls
tohn/fish-git-util # Convenient git utility functions
barnybug/docker-fish-completion # Completion for Docker
jorgebucaran/autopair.fish # Auto-complete matching pairs
orefalo/g2 # einfachere git Befehle
jorgebucaran/fisher # fisher selbst
markcial/cprintf # Printf with colors
jethrokuan/fzf # fuzzy-finder
brgmnn/fish-docker-compose # docker-compose completions
jethrokuan/z # Pure-fish z directory jumping
oh-my-fish gibt es uebrigens auch. Z ist schon (statt autojump, fasd oder v) ziemlich cool, besonders in Verbindung mit fzf (hier ein alternatives Plugin fuer fish).
Weitere Links fuer fish #
Damals hatten mich neben dem Beitrag von noqqe auch folgende Links zu einem Wechsel bewogen:
- https://www.slant.co/versus/523/1602/~zsh_vs_fish
- https://www.reddit.com/r/linux/comments/2gfpps/why_did_you_choose_fish_shell_over_zsh/
- https://jvns.ca/blog/2017/04/23/the-fish-shell-is-awesome/
- https://www.makeuseof.com/tag/x-reasons-install-fish-shell/
- https://jbrio.net/posts/switching-from-zsh-to-fish/
Zsh (again) #
Allerdings hatte ich immer so meine Probleme mit fish. Zum einen konnte ich mich einfach nicht an die Syntax gewoehnen, wenn ich quasi ueberall sonst (in Scripts oder auf Arbeit) Bashsyntax verwende. In meinem Terminal waren Schleifen, Subshells usw. immer ein Problem (fuer mich) und ich musste daher immer extra kleine Scripte schreiben.
Auch sowas wie die Installation von z.B. conda waren immer
aufwaendig/unmoeglich (wahrscheinlich weil fish nur als interaktive
Shell gesetzt war). Und bis heute nutze ich den Hack, dass meine
Standardshell immer noch Bash ist, indem in der .bashrc
nach vielen
Exports ein exec fish
drin steht. Also irgendwie war ich nie rundum
gluecklich. Auch ein paar Kleinigkeiten wie Tab Completions in/mit
Ordnern und fehlende Completions bei git commit
, wenn die Datei gerade
mit git add
hinzugefuegt wurde.
tl;dr es wurde Zeit fuer einen Wechsel. Da Zsh seit 5 Jahren die Standardshell unter macOS ist, habe ich sie auch wieder auserkoren. Mal sehen, was mich damals gestoert hatte 😅
Zumindest die Installation ist wieder recht einfach:
brew install zsh
sudo pacman -S zsh
sudo apt-get install zsh
# danach (OS unabhaengig)
chsh -s $(which zsh)
Danach habe ich einfach mal zsh
eingegeben (ohne ~/.zshrc
). Und bin
damit die Installation ganz normal durchgegangen mit den Standardwerten.
Allerdings sind die Defaults ziemlich langweilig. Also nutzen wir Plugins ✨
Plugins #
Erstmal brauchen wir einen Pluginmanager oder Framework. Nachdem ich einen Tag lang oh-my-zsh installiert hatte (und mich auch hier die Defaults genervt hatten) und Antigen leider nicht mehr weiterentwickelt wird, habe ich mich dank dem Artikel im Arch Linux Wiki fuer Zim entschieden (das war eine gute Entscheidung ).
Natuerlich wollte ich moeglichst viele Sachen von fish auch wieder in Zsh haben, z.B. Aliase (meistens Abkuerzungen fuer haeufig genutzte Befehle), aber auch:
- Rueckwaertssuche in der History mit fzf
- Tab Completions (u.a. fuer ssh)
Im Moment sieht meine ~/.zimrc
so aus:
zmodule environment
zmodule input
zmodule direnv
zmodule fzf
#zmodule git # finde grosses G bisschen seltsam
#zmodule homebrew # ebenso hier mit brew
zmodule ssh
zmodule utility
zmodule termtitle
zmodule prompt-pwd
zmodule git-info
zmodule duration-info
zmodule zsh-users/zsh-completions --fpath src
zmodule zsh-users/zsh-syntax-highlighting
zmodule zsh-users/zsh-autosuggestions
zmodule ohmyzsh/ohmyzsh --root plugins/brew
#zmodule ohmyzsh/ohmyzsh --root plugins/docker
zmodule ohmyzsh/ohmyzsh --root plugins/docker-compose
zmodule ohmyzsh/ohmyzsh --root plugins/globalias
zmodule ohmyzsh/ohmyzsh --root plugins/z
zmodule hlissner/zsh-autopair
zmodule joke/zim-starship
zmodule /Users/uxgch/path/to/zsh-plugin # lokaler Kram (hauptsaechlich Aliases)
zmodule completion # muss fast ans Ende
zmodule ohmyzsh/ohmyzsh --root plugins/git
Zim ist fuer Zsh was Vundle fuer (neo)vim ist. Recht easy 😊
Weitere (Plugin)sammlungen:
Prompts/Themes #
Das ist echt ein Thema fuer sich. Bisher sah jede Prompt bei mir anders aus (und war meist eine geaenderte Version von oeffentlich verfuegbaren), aber ich glaube ich haette gerne etwas, was crossplattform ist.
Etwa eine Stunde lang hatte ich dank Zim bira (weitere Themes ) genutzt 😅
Und bin dann dank Modul fuer Zim zu Starship gewechselt. Als Vorlage habe ich mir Gruvbox Rainbow runtergeladen 🌈
Zusaetzlich dazu habe ich mir eine Nerdfont (genauer die “Hack Nerd Font”) installiert und in iTerm2 eingerichtet .
Sonstiges #
SSH #
Meine SSH-Config ist etwas umfangreicher (mehrere Includes, eigene UserKnownHostsFiles, mehrere Identities, mehrere Namen in einer Host-Zeile usw.)
Sehr aufgehalten hat mich die UserKnownHostsFiles. Die Hosts wurden
naemlich einfach nicht angezeigt bei der Completion. Beheben konnte ich
das durch folgende Zeile in der ~/.zshrc
:
zstyle ':completion:*:(ssh|scp|sftp|rsh|rsync):*' hosts ${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_,~/.ssh/ssh-config/.known_}hosts{,_*}(|2)(N) /dev/null)"}%%[# ]*}//,/ }
History #
Bei der Migration von fish zu zsh bin ich grob dieser Anleitung gefolgt . Ich wollte eigentlich auch die History migrieren, hatte auch dieses kleine Programm dafuer genutzt. Allerdings gab es anscheinend irgendwo in meiner History einen Fehler und es konnte leider keine History migriert werden. Ist aber auch ok, ich hab sie ja noch als Datei in meinem Dateisystem rumfliegen.