# ---------------------------------------------------------- # Zsh-Konfiguration für René # Oh My Zsh + Powerlevel10k + Micro + Conda # ---------------------------------------------------------- # 1) Powerlevel10k Instant Prompt (muss sehr weit oben stehen) # quiet: cowsay-Begruessung erzeugt Console-Output, Warnung unterdruecken typeset -g POWERLEVEL9K_INSTANT_PROMPT=quiet if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" fi # 1b) Secrets laden (API-Keys etc. — liegt lokal, NICHT im Repo) [[ -f "$HOME/.secrets" ]] && source "$HOME/.secrets" # 2) Oh My Zsh Basis export ZSH="$HOME/.oh-my-zsh" # Theme: Powerlevel10k ZSH_THEME="powerlevel10k/powerlevel10k" # Plugins # - git: Git-Shortcuts # - zsh-syntax-highlighting: farbige Befehle in der Shell plugins=( git zsh-syntax-highlighting zoxide ) # Oh My Zsh laden source "$ZSH/oh-my-zsh.sh" # 3) Powerlevel10k-Konfiguration laden (falls vorhanden) [[ -f "$HOME/.p10k.zsh" ]] && source "$HOME/.p10k.zsh" # 4) Sprache/Lokalisierung (optional, bei Bedarf anpassen) # export LANG=de_DE.UTF-8 # export LC_ALL=de_DE.UTF-8 # 5) Standard-Editor (Mac lokal: micro, SSH-Session: nichts erzwingen) if [[ -z "$SSH_CONNECTION" ]]; then export EDITOR="micro" export VISUAL="micro" fi # 6) Pfade erweitern # LM Studio CLI (bereits vorhanden, übernommen) export PATH="$PATH:$HOME/.lmstudio/bin" export PATH="$HOME/bin:$HOME/.local/bin:$PATH" # 7) Nützliche Aliases # ls-Varianten alias ll='ls -lha' alias la='ls -A' alias l='ls -lh' # Verzeichnisse alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' # Schneller in Konfigdateien alias zshconfig='micro ~/.zshrc' alias p10kconfig='micro ~/.p10k.zsh' # Git-Kurzbefehle alias gs='git status' alias ga='git add' alias gc='git commit' alias gp='git push' alias gl='git log --oneline --graph --decorate' alias gitcheck="~/git-check-all.sh --short" alias gitupdate="~/git-update-all.sh" if [[ "$OSTYPE" == "darwin"* ]]; then alias cb="pbpaste | sed 's/^ //' | pbcopy" else alias cb="xclip -selection clipboard -o | sed 's/^ //' | xclip -selection clipboard -i" fi # Ubuntu-Kompatibilitaet: fd und bat heissen dort anders command -v fdfind &>/dev/null && ! command -v fd &>/dev/null && alias fd='fdfind' command -v batcat &>/dev/null && ! command -v bat &>/dev/null && alias bat='batcat' # Offline-KI Shortcuts alias ki-chat='ki interactive' alias ki-agent='ki interactive --agent-mode' alias ki-rchat='ki --remote interactive' alias ki-ragent='ki --remote interactive --agent-mode' alias ki-commit='ki commit' alias ki-fix='ki fix' alias ki-roast='ki roast' alias ki-docker='ki docker' alias ki-dns='ki dns' alias ki-diff='ki diff' alias ki-wetter='ki wetter' alias ki-tl='ki tl' alias fetch="fastfetch" alias temps="sudo powermetrics -s cpu_power,gpu_power,thermal,battery -i 1000 -n 1" # Cheat-Sheet: statische Referenz (tools-ref für Vollübersicht) tools-ref() { cat <<'TOOLS' ╔══════════════════════════════════════════════════════════════╗ ║ Terminal Cheat-Sheet ║ ╚══════════════════════════════════════════════════════════════╝ GIT ──────────────────────────────────────────────────────────────── gs git status ga git add gc git commit gp git push gl git log (oneline, graph) gd git diff gco git checkout gb git branch gitcheck Status aller Git-Repos pruefen gitupdate alle Git-Repos pullen gitsync alle Repos sync (push+pull) mac-sync git-sync remote ausfuehren PLATFORMIO ──────────────────────────────────────────────────────────────── pio run kompilieren pio run -t upload flashen pio device monitor seriellen Monitor oeffnen pio run -t clean Build-Artefakte loeschen pio lib install Bibliothek installieren pio init --board neues Projekt erstellen NAVIGATION & DATEIEN ──────────────────────────────────────────────────────────────── z zoxide: smart cd (lernt haeufige Pfade) ll / la / l ls-Varianten (-lha / -A / -lh) .. / ... / .... schnell hoch navigieren eza modernes ls (Farben, Icons, Git-Status) eza -la alle Dateien mit Details eza -T Baumansicht bat cat mit Syntax-Highlighting fd schnelles find (z.B. fd '\.txt$') rg blitzschnelles grep (z.B. rg 'TODO' src/) fzf Fuzzy-Finder (Ctrl+T Dateien, Ctrl+R History) ncdu interaktive Festplattennutzung duf schoene Uebersicht freier Speicherplatz yazi Terminal-Dateimanager (q = quit) micro einfacher Editor (Ctrl+S, Ctrl+Q) BILDER (~/bin) ──────────────────────────────────────────────────────────────── h2j / heic2jpg HEIC → JPG konvertieren heic2jpg_resize + verkleinern heic2jpg_delete + HEIC loeschen heic2jpg_resize_delete + beides jpg_resize nur JPG verkleinern SSH-SHORTCUTS ──────────────────────────────────────────────────────────────── ssh ds DiskStation (ds918admin@10.47.11.10) ssh ds "cmd" Befehl remote ausfuehren scp f ds:~/ Datei auf DS kopieren SYSTEM & KONFIG ──────────────────────────────────────────────────────────────── fetch fastfetch (Systeminfo) temps CPU/GPU-Temperatur + Akku (Mac) cb Clipboard bereinigen (2 Leerzeichen weg) zshconfig ~/.zshrc bearbeiten p10kconfig ~/.p10k.zsh bearbeiten tldr Kurzanleitung mit Beispielen CLAUDE CODE ──────────────────────────────────────────────────────────────── claude-priv Claude Code mit Privat-Account (mail@motocamp.de) claude-work Claude Code mit Work-Account (rene@rm202.de) claude-account priv|work Re-Login: abmelden, Browser, neu anmelden MACBOOK-SETUP (curl | bash) ──────────────────────────────────────────────────────────────── setup-base.sh <13|16> Basis-Setup (als root) setup-desktop.sh Desktop + Apps (als user) OFFLINE-KI (LM Studio) ──────────────────────────────────────────────────────────────── ki-chat interaktiver Chat (Streaming) ki-agent Agent-Modus (Dateizugriff, Shell) ki-rchat Chat ueber ki.motocamp.de (VPN) ki-ragent Agent ueber ki.motocamp.de (VPN) ki-commit Commit-Message generieren + committen ki-fix letzten fehlgeschlagenen Befehl fixen ki-roast humorvolles Code-Review ki-docker DS Container-Status (logs, check) ki-dns DNS-Check motocamp.de Subdomains ki-diff Git-Diff mit KI-Zusammenfassung ki-wetter Wetter + KI-Kommentar ki-tl Too Long: Dateien/Text zusammenfassen ki explain ! letzten Shell-Befehl erklaeren ki cow "..." Chat mit Cowsay-Ausgabe ki foreach "*.py" "Finde Bugs" Prompt pro Datei ki watch log "Erklaere Fehler" Datei ueberwachen ki pipe stdin -> KI -> stdout ki status Dashboard ki models verfuegbare Modelle ki skills Skills auflisten ki skill -f Skill ausfuehren NEUE TOOLS ──────────────────────────────────────────────────────────────── lg lazygit: Git-TUI (space=stage, c=commit, p=push, ?=Hilfe) - einzelne Zeilen selektiv stagen - interaktiver Rebase ohne scary Kommandos git diff/log automatisch via delta (side-by-side, n/N=naechster Block) Ctrl+R atuin: fuzzy History-Suche mit Zeitstempel + Exit-Code mise use Tool-Versionen pro Projekt (mise use python@3.12) Stats Menüleisten-Monitor (CPU/RAM/Netz/Akku) SPASS ──────────────────────────────────────────────────────────────── cmatrix Matrix-Regen (q = quit) asciiquarium Aquarium im Terminal (q = quit) pipes.sh animierte Rohre (q = quit) cbonsai -l wachsender Bonsai-Baum (q = quit) ls | nms Sneakers-Entschlüsselungseffekt fortune | cowsay zufaelliger Spruch mit Kuh TOOLS } # Kurzform alias tr='tools-ref' # Terminal-Screensaver: zufaellig cmatrix oder asciiquarium nach 5 Min Idle TMOUT=300 TRAPALRM() { local screensavers=() command -v cmatrix &>/dev/null && screensavers+=("cmatrix -sab") command -v asciiquarium &>/dev/null && screensavers+=("asciiquarium") command -v pipes.sh &>/dev/null && screensavers+=("pipes.sh -t 0 -p 4") command -v cbonsai &>/dev/null && screensavers+=("cbonsai -l") (( ${#screensavers[@]} )) && eval "${screensavers[$((RANDOM % ${#screensavers[@]} + 1))]}" } # Begruessung: zufaellig Systemstatus, Spruch oder Witz if [[ -o interactive ]] && command -v cowsay &>/dev/null; then _greet() { local all_cows=(default tux sheep elephant dragon gnu koala) local cow_files=() local cowpath cowpath=$(cowsay -l 2>/dev/null | tail -n +2 | tr ' ' '\n') for c in "${all_cows[@]}"; do echo "$cowpath" | grep -qx "$c" && cow_files+=("$c") done (( ${#cow_files[@]} == 0 )) && cow_files=(default) local cow="${cow_files[$((RANDOM % ${#cow_files[@]} + 1))]}" case $((RANDOM % 3)) in 0) # Systemstatus local host load host=$(hostname -s) load=$(uptime | sed 's/.*average[s]*: *\([^ ]*\).*/\1/') echo "$host | load $load" | cowsay -f "$cow" ;; 1) # Datum-Spruch local day=$(date +%u) msg case $day in 1) msg="Montag... Kaffee ist Pflicht!" ;; 2) msg="Dienstag - immerhin kein Montag mehr." ;; 3) msg="Mittwoch - Bergfest!" ;; 4) msg="Donnerstag - morgen ist fast Wochenende!" ;; 5) msg="Freitag! Die Woche gehoert dir." ;; 6) msg="Samstag - Zeit fuer Projekte!" ;; 7) msg="Sonntag - entspann dich mal." ;; esac echo "$msg ($(date '+%d.%m.%Y, %H:%M'))" | cowsay -f "$cow" ;; 2) # Witz/Spruch via fortune if command -v fortune &>/dev/null; then fortune -s 2>/dev/null | cowsay -f "$cow" else echo "Keine Witze installiert. Sad." | cowsay -f "$cow" fi ;; esac } _greet unfunction _greet fi # Git-Updates beim Shell-Start prüfen (Hintergrund, kein Output wenn alles aktuell) if [[ -o interactive ]] && [[ -f "$HOME/git-projekte/dotfiles-rene/bin/git-notify.sh" ]]; then ("$HOME/git-projekte/dotfiles-rene/bin/git-notify.sh" &) fi alias gitsync="~/git-projekte/dotfiles-rene/bin/git-sync-all.sh" alias mac-sync="curl -fsSL https://git.motocamp.de/rene/dotfiles-rene/raw/branch/main/bin/git-sync-all.sh | bash" alias zert-check="~/git-projekte/dotfiles-rene/bin/zert-check" # 8) Conda-Initialisierung # ---------------------------------------------------------- # Dieser Block wurde ursprünglich von `conda init` erzeugt. # Wenn Conda-Updates irgendwann meckern, einfach erneut: # conda init zsh # laufen lassen. # ---------------------------------------------------------- __conda_setup="$('/Users/rene/miniconda3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "$__conda_setup" else if [ -f "/Users/rene/miniconda3/etc/profile.d/conda.sh" ]; then . "/Users/rene/miniconda3/etc/profile.d/conda.sh" else export PATH="/Users/rene/miniconda3/bin:$PATH" fi fi unset __conda_setup # <<< conda initialize <<< # 9) Kleine Qualität-of-Life-Einstellungen für Zsh # Bessere History HISTFILE="$HOME/.zsh_history" HISTSIZE=5000 SAVEHIST=5000 setopt HIST_IGNORE_DUPS # keine direkt aufeinanderfolgenden Duplikate setopt HIST_IGNORE_SPACE # Befehle, die mit Leerzeichen beginnen, nicht speichern setopt SHARE_HISTORY # History zwischen mehreren Zsh-Sessions teilen # Automatisches cd wenn nur ein Verzeichnisname eingegeben wird setopt AUTO_CD # Autokorrektur bei Tippfehlern (optional, wenn es nervt, auskommentieren) # setopt CORRECT # 10) Prompt-Titel schön halten (Fenster-/Tab-Titel) # Zeigt user@host:pfad an precmd() { print -Pn "\e]0;%n@%m: %~\a" } export COLORTERM=truecolor test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh" # 11) Tool-Integrationen eval "$(atuin init zsh)" eval "$(mise activate zsh)" # delta als Git-Pager git config --global core.pager delta git config --global interactive.diffFilter "delta --color-only" git config --global delta.navigate true git config --global delta.side-by-side true # lazygit Alias alias lg='lazygit' # claude-profiles-start alias claude-priv='CLAUDE_CONFIG_DIR=~/.claude-priv command claude' # mail@motocamp.de alias claude-work='CLAUDE_CONFIG_DIR=~/.claude-work command claude' # rene@rm202.de alias claude='echo "Bitte claude-priv oder claude-work verwenden."' claude-account() { local profile="$1" if [[ "$profile" != "priv" && "$profile" != "work" ]]; then echo "Verwendung: claude-account priv|work" return 1 fi local config_dir="$HOME/.claude-${profile}" echo "==> Claude Code abmelden (${profile})..." CLAUDE_CONFIG_DIR="$config_dir" command claude /logout echo "" echo "==> Browser oeffnen - bitte ab- und neu anmelden..." open "https://console.anthropic.com" read -r "?Wenn im Browser fertig, Enter druecken..." echo "" echo "==> Claude Code anmelden (${profile})..." CLAUDE_CONFIG_DIR="$config_dir" command claude /login } # claude-profiles-end nvim-cheats() { echo -e "\e[1;36m=== NVIM CHEAT SHEET ===\e[0m\n" # Navigation echo -e "\e[1mNAVIGATION & POSITIONIERUNG\e[0m" echo "-------------------------------------------" echo "h/j/k/l : Links/Unten/Oben/Rechts bewegen" echo "w/b : Zum nächsten/vorherigen Wort springen" echo "gg/G : Anfang / Ende der Datei" echo ":Nr : Zur Zeilenummer Nr springen (z.B. :42)\n" # LÖSCHEN (Neu hinzugefügt) echo -e "\e[1;33mLÖSCHEN & BEARBEITEN\e[0m" # Gelb für Hervorhebung echo "-------------------------------------------" echo "dd : Ganze Zeile löschen" echo "dw : Wort löschen" echo "D / d$ : Alles nach Cursor bis Zeilenende löschen" echo "d0 : Alles vor Cursor bis Zeilenbeginn löschen" echo "x : Zeichen unter dem Cursor löschen" echo "X : Zeichen vor dem Cursor löschen\n" # EDITING & UNDO echo -e "\e[1mEDITING & RÜCKGÄNGIG\e[0m" echo "-------------------------------------------" echo "i/a : Einfügemodus (vor/nach Cursor)" echo "o/O : Neue Zeile öffnen (unter/über)" echo "Esc : In den Normalmodus zurückkehren" echo "u : Rückgängig machen (Undo)" echo "Ctrl-r : Wiederherstellen (Redo)\n" # VISUELL & COPY/PASTE echo -e "\e[1mVISUELL WÄHLEN & KOPIEREN\e[0m" echo "-------------------------------------------" echo "v : Visueller Modus starten" echo "yy/yw : Kopieren (Yank) Zeile/Wort" echo "p/P : Einfügen (Paste) nach/vor Cursor\n" # CHANGE (Löschen + Einfügemodus) echo -e "\e[1mCHANGE (Löschen & direkt tippen)\e[0m" echo "-------------------------------------------" echo "cw : Wort ab Cursor ersetzen" echo "cc / S : Ganze Zeile ersetzen" echo "ci\" : Inhalt in Anführungszeichen ersetzen" echo "ci( : Inhalt in Klammern ersetzen" echo "C / c\$ : Alles nach Cursor bis Zeilenende ersetzen\n" # SUCHE & ERSETZEN echo -e "\e[1mSUCHE & ERSETZEN\e[0m" echo "-------------------------------------------" echo "/suche : Suche vorwärts" echo "?suche : Suche rückwärts" echo "n/N : Nächsten/vorherigen Treffer anspringen" echo "* : Wort unter Cursor suchen" echo ":%s/alt/neu/g : Ersetzen (global in Datei)\n" # DATEI & FENSTER echo -e "\e[1mDATEI & FENSTER\e[0m" echo "-------------------------------------------" echo ":wq / :x : Speichern und schließen" echo ":q! : Änderungen verwerfen & schließen" echo ":sp file : Split horizontal (neues Fenster unten)" echo ":vs file : Split vertikal (neues Fenster rechts)\n" }