devAlice
← Mac

zsh anpassen — starship-Prompt, Verlauf, Aliase, Plugins

Das macOS-Standard-zsh in 30 Minuten zu einer produktiven Shell machen. starship + Verlaufssuche + autosuggestions + Syntax-Highlighting.

macOS liefert seit Catalina zsh als Standard-Shell aus, doch die Out-of-the-Box-Konfiguration lässt viel Potenzial ungenutzt. Das vollständige Oh My Zsh zu installieren fügt Gewicht hinzu und verlangsamt den Shellstart. Dieser Leitfaden passt nur das an, was wirklich gebraucht wird — starship-Prompt, Verlaufssuche, autosuggestions, Syntax-Highlighting, fzf und fünf nützliche Aliase.

Ich glaube, was eine gute Shell-Konfiguration ausmacht, ist nicht die Anzahl der installierten Plugins, sondern die Startzeit und die tägliche Reibung — weil eine Shell, die 500 ms zum Starten braucht, jedes Mal unbewusst stört, statt unsichtbar zu bleiben. Früher hatte ich Oh My Zsh mit Dutzenden Plugins; heute ist starship mit drei gezielten Plugins mein Standard, da ich die Startzeit von ~800 ms auf ~80 ms reduziert habe.

Die Zielgruppe sind Leute, die die Mac-Ersteinrichtung abgeschlossen haben und zsh polieren möchten — einschließlich der Synchronisierung von .zshrc auf andere Geräte über dotfiles.

TL;DR

  1. starship — schneller, ansprechender Prompt (leichter als Oh My Zsh)
  2. zsh-autosuggestions — graue verlaufsbasierte Vorschläge (fish-Stil)
  3. zsh-syntax-highlighting — Befehle beim Tippen einfärben
  4. fzf Shell-Integration — moderner Ctrl+R Verlaufssuche
  5. .zshrc über dotfiles in chezmoi committen, damit andere Geräte es aufgreifen

Voraussetzungen

1. Warum das Standard-zsh nicht reicht

  • Keine Git-Info im Prompt — Branch / geänderter Zustand unsichtbar
  • Schwache VerlaufssucheCtrl+R existiert, aber kein Fuzzy
  • Begrenzte Autovervollständigung — Tab funktioniert, aber keine fish-ähnlichen grauen Vorschläge
  • Kein Syntax-Highlighting — Tippfehler zeigen sich erst nach dem Absenden

Das zu beheben zahlt sich täglich aus.


2. starship-Prompt (5 Min.)

starship.rs — ein schneller, plattformübergreifender Prompt, in Rust geschrieben. Leichter als Oh My Zshs Powerlevel10k, der Start-Overhead ist nahezu null.

2.1 Installieren

brew install starship

Am Ende von .zshrc:

eval "$(starship init zsh)"

Neues Terminal öffnen — sofort angewendet.

2.2 Nerd Font (für Icons)

Um starships Git-Branch- und Sprachsymbole zu sehen, brauchst du eine Nerd Font.

brew install --cask font-jetbrains-mono-nerd-font

Die Schrift deines Terminals auf JetBrainsMono Nerd Font ändern. (Siehe den WezTerm-Leitfaden.)

2.3 Anpassungen (optional)

~/.config/starship.toml:

# Zweizeiliger Prompt — Info oben, Eingabe unten
add_newline = true
format = """
$directory$git_branch$git_status$nodejs$python$rust$line_break$character"""
 
[character]
success_symbol = "[➜](bold green)"
error_symbol = "[✗](bold red)"
 
[directory]
truncation_length = 3
truncate_to_repo = true
 
[git_branch]
symbol = " "
style = "bold purple"
 
[git_status]
conflicted = "⚠️ "
ahead = "⇡${count} "
behind = "⇣${count} "
staged = "[+${count}](green) "
modified = "[!${count}](yellow) "
untracked = "[?${count}](red) "

Die Standardwerte sind ausgezeichnet — zunächst ohne starship.toml starten und nur das anpassen, was stört.


3. Verlauf — schlechte Standardwerte korrigieren

Zu .zshrc hinzufügen:

# Verlaufsgrößen
HISTSIZE=50000              # Zeilen im Speicher
SAVEHIST=100000             # Zeilen in der Datei gespeichert
HISTFILE="$HOME/.zsh_history"
 
# Deduplizieren + sofortiges Speichern
setopt HIST_IGNORE_ALL_DUPS  # Duplikate verwerfen
setopt HIST_REDUCE_BLANKS    # Nur-Leerzeichen-Diffs zusammenführen
setopt HIST_VERIFY           # `!42`-artige Erweiterungen nicht auto-ausführen
setopt SHARE_HISTORY         # Alle zsh-Instanzen teilen Verlauf
setopt INC_APPEND_HISTORY    # Sofort an Verlaufsdatei anhängen
setopt EXTENDED_HISTORY      # Zeitstempel + Dauer
 
# Hoch/Runter — Präfix-Übereinstimmungssuche
autoload -U up-line-or-beginning-search down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search    # Hoch
bindkey "^[[B" down-line-or-beginning-search  # Runter

Effekt: git c eingeben und ↑ drücken — es werden nur vergangene Befehle durchlaufen, die mit git c beginnen.


4. zsh-autosuggestions (3 Min.)

Fish-ähnliche graue Vorschläge für den nächsten Befehl. Tab oder → zum Akzeptieren.

brew install zsh-autosuggestions

Am Ende von .zshrc:

source $(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh
 
# Grauer Ton (Standard ist zu dunkel)
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=#5f5f5f'
 
# Vorschläge bei sehr langen Befehlen überspringen (Performance)
ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=80

Neues Terminal öffnen → Befehl tippen → grauer Vorschlag erscheint = OK.


5. zsh-syntax-highlighting (2 Min.)

Befehle beim Tippen einfärben — gültig grün, ungültig rot, Optionen gelb usw.

brew install zsh-syntax-highlighting

Am Ende von .zshrc — muss nach zsh-autosuggestions kommen:

source $(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

Reihenfolge wichtig:

  1. autosuggestions
  2. syntax-highlighting (muss zuletzt stehen)

In umgekehrter Reihenfolge brechen beide gelegentlich.


6. fzf — moderner Ctrl+R Verlaufssuche

Das Standard-Ctrl+R geht Zeile für Zeile zurück. fzf gibt dir Fuzzy-Suche + Vorschau.

brew install fzf
$(brew --prefix)/opt/fzf/install --all

Das Installationsskript fügt dies zu .zshrc hinzu:

[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
  • Ctrl + R — Fuzzy-Verlaufssuche
  • Ctrl + T — Fuzzy-Datei im aktuellen Verzeichnis auswählen (z. B. vim <Ctrl+T>)
  • Alt + C — Fuzzy cd

Mehr: Mac-Ersteinrichtung §3.2.


7. Fünf nützliche Aliase

.zshrc oder eine separate ~/.zsh_aliases (empfohlen):

# git
alias g='git'
alias gs='git status -s'
alias gd='git diff'
alias gco='git checkout'
alias gp='git push'
alias gl='git log --oneline --graph --decorate -20'
 
# Dateisystem (eza — modernes ls)
alias ls='eza --git --group-directories-first'
alias ll='eza -l --git --group-directories-first --icons'
alias la='eza -la --git --group-directories-first --icons'
alias tree='eza --tree --level=3'
 
# Verzeichnisnavigation
alias ..='cd ..'
alias ...='cd ../..'
 
# Neu laden
alias zrl='source ~/.zshrc'
 
# Editor (VS Code oder Cursor)
alias c='code .'

Einbuchstabige Aliase bergen Kollisionsgefahr. g (git) und c (code) sind unbedenklich, solange die Absicht klar ist.


8. Verzeichnisspringen — zoxide

Statt cd /Users/me/projects/myapp einfach z myapp tippen und in einem Schritt dorthin springen. zoxide lernt dabei häufig besuchte Verzeichnisse.

brew install zoxide

.zshrc:

eval "$(zoxide init zsh --cmd cd)"  # cd selbst durch zoxide ersetzen

cd wie gewohnt verwenden; zoxide lernt. Dann springt cd myapp über Teilnamen.


9. Vollständiges .zshrc-Beispiel

Eine vollständige Referenz, die das Obige kombiniert:

# ~/.zshrc
 
# ─────────────────────────────────────────────
# PATH
# ─────────────────────────────────────────────
export PATH="$HOME/.local/bin:$PATH"
 
# ─────────────────────────────────────────────
# Verlauf
# ─────────────────────────────────────────────
HISTSIZE=50000
SAVEHIST=100000
HISTFILE="$HOME/.zsh_history"
setopt HIST_IGNORE_ALL_DUPS HIST_REDUCE_BLANKS HIST_VERIFY
setopt SHARE_HISTORY INC_APPEND_HISTORY EXTENDED_HISTORY
 
# Hoch/Runter — Präfix-Suche
autoload -U up-line-or-beginning-search down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search
bindkey "^[[B" down-line-or-beginning-search
 
# ─────────────────────────────────────────────
# Aliase
# ─────────────────────────────────────────────
alias g='git'
alias gs='git status -s'
alias gd='git diff'
alias gp='git push'
alias gl='git log --oneline --graph --decorate -20'
alias ls='eza --git --group-directories-first'
alias ll='eza -l --git --group-directories-first --icons'
alias la='eza -la --git --group-directories-first --icons'
alias ..='cd ..'
alias ...='cd ../..'
alias zrl='source ~/.zshrc'
alias c='code .'
 
# ─────────────────────────────────────────────
# Plugins (Reihenfolge wichtig)
# ─────────────────────────────────────────────
source $(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=#5f5f5f'
ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=80
 
source $(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
 
# ─────────────────────────────────────────────
# Tools
# ─────────────────────────────────────────────
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
eval "$(mise activate zsh)"           # Sprach-Versionsmanager — /mac/dev-toolchain
eval "$(zoxide init zsh --cmd cd)"
 
# ─────────────────────────────────────────────
# Prompt
# ─────────────────────────────────────────────
eval "$(starship init zsh)"

10. Verifizieren

# In einem neuen Terminal
type starship              # /opt/homebrew/bin/starship
ZSH_AUTOSUGGEST_USE_ASYNC=true   # autosuggest aktiv
echo $HISTSIZE             # 50000
 
# starship-Prompt
cd ~/work/myrepo           # Prompt zeigt Git-Branch + Sprachsymbole
 
# Vorschläge
git c                      # grauer Vorschlag — Tab zum Akzeptieren
 
# fzf
history | head             # 'git c' tippen dann Ctrl+R — Fuzzy-Suche

11. Problembehandlung

Prompt voll mit kaputten Glyphen (▢▢)

Nerd Font fehlt. font-jetbrains-mono-nerd-font über brew installieren und die Terminal-Schrift ändern.

command not found: starship

  • which starship gibt nichts zurück → ist das brew-Präfix im PATH?
  • Apple Silicon: eval "$(/opt/homebrew/bin/brew shellenv)" sollte in .zprofile sein

Langsamer Start eines neuen Terminals (1 s+)

  • Schwere Befehle (nvm) in .zshrc lazy-loaden (verzögert initialisieren)
  • Mit zprof profilieren: zmodload zsh/zprof am Anfang hinzufügen, zprof | head -20 am Ende

autosuggestions zeigen sich nicht

  • Reihenfolge in .zshrc: syntax-highlighting nach autosuggestions
  • ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE ist möglicherweise zu nah am Hintergrund
  • unset ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE ausprobieren, um den Standard zu verwenden

syntax-highlighting flackert direkt nach dem Tippen

  • „Render fast" in WezTerm/iTerm2 deaktivieren
  • Oder ZSH_HIGHLIGHT_MAXLENGTH=300 setzen, um Highlighting bei sehr langen Zeilen abzuschalten

zsh: no matches found: *.txt

zshs Globbing ist standardmäßig streng. Entweder setopt NULL_GLOB in .zshrc, oder escapen: \*.txt.


12. Nächste Schritte


Referenzen

Changelog

  • 2026-05-16: Erster Entwurf. starship + Verlauf + autosuggestions + syntax-highlighting + fzf + Aliase + zoxide + vollständiges .zshrc-Beispiel + sechs Problembehandlungsfälle.