# ============================================================================= # .zshrc — gnu-plus-dotfiles (chezmoi-managed) # Refactored from miche's original to use os_family for OS-specific bits. # Sync source: https://git.melonbread.xyz/rain/gnu-plus-dotfiles # ============================================================================= # --------------------------------------------------------------------------- # Oh My Zsh # --------------------------------------------------------------------------- export ZSH="$HOME/.oh-my-zsh" # No theme — using starship ZSH_THEME="" # Plugins (loaded before starship so prompt is clean) plugins=( git fzf sudo # ESC ESC to add sudo tmux systemd rust rsync command-not-found zsh-syntax-highlighting # fish-style live colors — MUST be near last zsh-history-substring-search # fish-style Up/Down history search zsh-autosuggestions # fish-style ghost completions — MUST be last ) source $ZSH/oh-my-zsh.sh # --------------------------------------------------------------------------- # History # --------------------------------------------------------------------------- setopt EXTENDED_HISTORY # write timestamp + duration setopt HIST_IGNORE_DUPS # don't save consecutive duplicates setopt HIST_IGNORE_ALL_DUPS # remove older duplicates of new commands setopt HIST_IGNORE_SPACE # commands starting with space → not saved setopt HIST_REDUCE_BLANKS # trim whitespace setopt SHARE_HISTORY # share history across sessions in real time setopt INC_APPEND_HISTORY # append immediately HISTSIZE=10000 SAVEHIST=10000 HISTFILE=~/.zsh_history # --------------------------------------------------------------------------- # Shell options — make zsh feel like fish # --------------------------------------------------------------------------- setopt AUTO_CD # `dirname` to cd (like fish) setopt AUTO_PUSHD # cd pushes to dir stack setopt PUSHD_IGNORE_DUPS setopt INTERACTIVE_COMMENTS # # comments in interactive shell setopt EXTENDED_GLOB setopt NO_BEEP # Ctrl+Space to accept autosuggestion (like fish) bindkey '^ ' autosuggest-accept # Up/Down arrows → history substring search (like fish) # Both raw form (foot, kitty, alacritty, xterm default) and app-cursor form # (some terminals in DECCKM mode). Unquoted so $terminfo expands. bindkey '^[[A' history-substring-search-up bindkey '^[[B' history-substring-search-down # App-cursor mode: some terminals send ${terminfo[kcuu1]} when DECCKM is set. # Guard so an unset terminfo entry doesn't warn at startup. if (( ${+terminfo[kcuu1]} )) && [[ -n "${terminfo[kcuu1]}" ]]; then bindkey "${terminfo[kcuu1]}" history-substring-search-up fi if (( ${+terminfo[kcud1]} )) && [[ -n "${terminfo[kcud1]}" ]]; then bindkey "${terminfo[kcud1]}" history-substring-search-down fi # --------------------------------------------------------------------------- # Environment Variables # --------------------------------------------------------------------------- export EDITOR=nvim export LANG=en_US.UTF-8 export TMUX_PLUGIN_MANAGER_PATH=~/.tmux/plugins/tpm {{ if eq .os_family "arch" -}} # ROCm — on Arch/CachyOS, system handles ROCM_PATH and library paths via # /etc/profile.d/rocm.sh + /etc/ld.so.conf.d/rocm.conf. {{ else if eq .os_family "debian" -}} # Debian: ROCm only relevant if you install it. Leave default until needed. {{ end -}} # --------------------------------------------------------------------------- # PATH (auto-deduplicated) # --------------------------------------------------------------------------- typeset -U path path=( $HOME/.local/bin $HOME/.bin $path ) # --------------------------------------------------------------------------- # Aliases — common + OS-specific # --------------------------------------------------------------------------- # Directory navigation alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' alias .....='cd ../../../..' # Modern CLI replacements alias cat='bat' alias ls='eza -al --color=always --group-directories-first --icons' alias ll='eza -l --color=always --group-directories-first --icons' alias la='eza -a --color=always --group-directories-first --icons' alias lt='eza -aT --color=always --group-directories-first --icons' {{ if eq .os_family "arch" -}} # Pacman / system (Arch-base only) alias update='sudo pacman -Syu' alias cleanup='sudo pacman -Rns $(pacman -Qtdq)' alias fixpacman='sudo rm /var/lib/pacman/db.lck' alias mirror='sudo cachyos-rate-mirrors || sudo pacman -Syy' alias please='sudo' alias jctl='journalctl -p 3 -xb' alias psmem='ps auxf | sort -nr -k 4' alias psmem10='ps auxf | sort -nr -k 4 | head -10' alias hw='hwinfo --short' alias gitpkg='pacman -Q | grep -i "\-git" | wc -l' {{ else if eq .os_family "debian" -}} # Apt / system (Debian-base only) alias update='sudo apt update && sudo apt upgrade' alias please='sudo' alias jctl='journalctl -p 3 -xb' alias psmem='ps auxf | sort -nr -k 4' alias psmem10='ps auxf | sort -nr -k 4 | head -10' {{ end -}} # Utilities alias weather='curl wttr.in' alias wget='wget -c ' alias untar='tar -zxvf ' alias tarnow='tar -acf ' # Media alias yt-dlp-mp4="yt-dlp --format 'bestvideo[height<=720]+bestaudio[ext=m4a]/best[ext=mp4]' --merge-output-format mp4 --remux-video mp4 --audio-quality 128k" alias yt-dlp-mp4-fedi="yt-dlp --format 'bestvideo[height<=480]+bestaudio[ext=m4a]/best[ext=mp4]' --merge-output-format mp4 --remux-video mp4 --audio-quality 128k" # Personal alias toolbox='distrobox' alias huggingface-cli='hf' # Quick reload / edit alias zshsource='source ~/.zshrc' alias zshconfig='chezmoi edit ~/.zshrc' # --------------------------------------------------------------------------- # TERM / TTY fixes (ported from fish config) # --------------------------------------------------------------------------- if [[ -z "$TERM" || "$TERM" == "foot-extra" || "$TERM" == "foot+base" ]]; then if [[ -n "$WAYLAND_DISPLAY" ]] && infocmp foot >/dev/null 2>&1; then export TERM=foot elif [[ "$(tty 2>/dev/null)" == /dev/tty* ]]; then export TERM=linux elif infocmp xterm-256color >/dev/null 2>&1; then export TERM=xterm-256color fi fi if [[ -z "$COLORTERM" && -n "$WAYLAND_DISPLAY" ]]; then export COLORTERM=truecolor fi # TTY tint (only on real text TTY) if [[ -z "$DISPLAY" && "$(tty 2>/dev/null)" == /dev/tty* ]]; then setterm -background black -foreground white 2>/dev/null export LS_COLORS='di=33:ln=36:ex=32:so=35:bd=33;1:cd=33:pi=33:fi=0:*.tar=31:*.zip=31:*.gz=31:*.tgz=31:*.jpg=35:*.png=35:*.gif=35:*.mp3=36:*.mp4=36:*.conf=37:*.log=33:*.sh=32:*.py=32' fi # --------------------------------------------------------------------------- # Integrations # --------------------------------------------------------------------------- eval "$(starship init zsh)" eval "$(zoxide init zsh)" eval "$(fzf --zsh 2>/dev/null)" # --------------------------------------------------------------------------- # Custom functions — sourced if present (host-specific, not chezmoi-managed) # --------------------------------------------------------------------------- [[ -f ~/.config/zsh/functions.zsh ]] && source ~/.config/zsh/functions.zsh # --------------------------------------------------------------------------- # Bun (if installed) # --------------------------------------------------------------------------- [[ -d "$HOME/.bun/bin" ]] && export PATH="$HOME/.bun/bin:$PATH" # --------------------------------------------------------------------------- # Engram persistent memory — default points at kaiser.local:7438 if unset # --------------------------------------------------------------------------- export ENGRAM_URL="${ENGRAM_URL:-http://kaiser.local:7438}" # --------------------------------------------------------------------------- # Fastfetch — run on every interactive shell start # --------------------------------------------------------------------------- if command -v fastfetch >/dev/null 2>&1; then fastfetch fi