neovim-ide/dotfiles/.zshrc

186 lines
8.1 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ╔══════════════════════════════════════════════════════════════════╗
# ║ arch-dev :: zshrc ║
# ║ Kanagawa Wave · 256-color · mobile-aware · AUR-powered ║
# ╚══════════════════════════════════════════════════════════════════╝
# ── Environment ───────────────────────────────────────────────────────────────
export EDITOR=nvim
export VISUAL=nvim
export PAGER="less"
export MANPAGER="nvim +Man!"
export TERM=xterm-256color
export PATH="$HOME/.local/bin:$HOME/perl5/bin:/usr/local/bin:$PATH"
export DOCKER_BUILDKIT=1
# NO truecolor — Termius renders hex RGB as purple
unset COLORTERM
# ── History ───────────────────────────────────────────────────────────────────
HISTSIZE=50000
SAVEHIST=50000
HISTFILE="${HISTFILE:-$HOME/.zsh_history}"
setopt share_history hist_ignore_dups hist_ignore_space
setopt hist_reduce_blanks extended_history
# ── ZSH Options ───────────────────────────────────────────────────────────────
setopt auto_cd correct interactive_comments no_beep
# ── Completion ────────────────────────────────────────────────────────────────
autoload -Uz compinit && compinit
zstyle ':completion:*' menu select
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
zstyle ':completion:*:descriptions' format '%F{yellow}── %d ──%f'
# ── Plugins ───────────────────────────────────────────────────────────────────
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
source /usr/share/zsh/plugins/zsh-history-substring-search/zsh-history-substring-search.zsh
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down
# ── zsh-syntax-highlighting: 256-color only (no hex/truecolor) ────────────────
# Kanagawa Wave approximations in 256-color palette
# 110 = steel blue (crystalBlue) 106 = olive green (springGreen)
# 139 = medium purple (oniViolet) 173 = tan (boatYellow)
# 167 = indian red (peachRed) 66 = cadet blue (waveAqua)
ZSH_HIGHLIGHT_STYLES[default]='none'
ZSH_HIGHLIGHT_STYLES[unknown-token]='fg=167,bold'
ZSH_HIGHLIGHT_STYLES[reserved-word]='fg=139'
ZSH_HIGHLIGHT_STYLES[command]='fg=110'
ZSH_HIGHLIGHT_STYLES[builtin]='fg=110'
ZSH_HIGHLIGHT_STYLES[function]='fg=110'
ZSH_HIGHLIGHT_STYLES[alias]='fg=106'
ZSH_HIGHLIGHT_STYLES[path]='fg=66'
ZSH_HIGHLIGHT_STYLES[single-quoted-argument]='fg=173'
ZSH_HIGHLIGHT_STYLES[double-quoted-argument]='fg=173'
ZSH_HIGHLIGHT_STYLES[comment]='fg=242'
ZSH_HIGHLIGHT_STYLES[globbing]='fg=139'
# ── Autosuggestion style ──────────────────────────────────────────────────────
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=242'
ZSH_AUTOSUGGEST_STRATEGY=(history completion)
ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=20
# ── Smart Tools ───────────────────────────────────────────────────────────────
eval "$(zoxide init zsh)"
source <(fzf --zsh)
# FZF — 256-color theme
export FZF_DEFAULT_OPTS="
--color=bg+:236,bg:234,spinner:139,hl:173
--color=fg:250,header:242,info:110,pointer:167
--color=marker:139,fg+:250,prompt:110,hl+:167
--border=rounded --prompt=' ' --pointer='▶' --marker='✔'
"
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'
# ── Mobile Detection ──────────────────────────────────────────────────────────
if [[ "${MOBILE:-0}" == "1" ]]; then
export STARSHIP_CONFIG="$HOME/.config/starship-mobile.toml"
alias mux='screen -RD'
alias muxls='screen -ls'
if [[ -z "$STY" && -z "$TMUX" ]]; then
screen -RD arch-dev 2>/dev/null || screen -S arch-dev
fi
else
export STARSHIP_CONFIG="$HOME/.config/starship.toml"
alias mux='tmux new-session -A -s main'
alias muxls='tmux ls'
fi
# ── Prompt ────────────────────────────────────────────────────────────────────
eval "$(starship init zsh)"
# ── Aliases ───────────────────────────────────────────────────────────────────
source ~/.aliases
# ── arch-dev snapshot system ──────────────────────────────────────────────────
# Git-backed rollback for /home/dev. State lives in ~/.arch-dev-state/
# (separate git dir so it doesn't conflict with project git repos).
export ARCH_DEV_GITDIR="$HOME/.arch-dev-state"
_archdev_git() {
git --git-dir="$ARCH_DEV_GITDIR" --work-tree="$HOME" "$@"
}
# Take a named snapshot
snapshot() {
if [[ -z "$1" ]]; then
echo "usage: snapshot <name> [message]"
echo " e.g. snapshot node-working 'NodeJS environment with nvm + pnpm'"
return 1
fi
local name="$1"
local msg="${2:-snapshot: $name}"
_archdev_git add -A
_archdev_git commit -q -m "$msg" || { echo "nothing to snapshot"; return 1; }
_archdev_git tag -f "$name"
echo "✓ snapshot '$name' saved"
}
# List snapshots
snapshots() {
echo "── arch-dev snapshots ──"
_archdev_git tag -l --format=' %(refname:short) %(taggerdate:short) %(subject)'
echo ""
echo "── recent commits ──"
_archdev_git log --oneline -10
}
# Roll back to a snapshot
rollback() {
if [[ -z "$1" ]]; then
echo "usage: rollback <name>"
snapshots
return 1
fi
local name="$1"
if ! _archdev_git rev-parse "$name" >/dev/null 2>&1; then
echo "✗ snapshot '$name' not found"
snapshots
return 1
fi
echo "⚠ rolling back to '$name' will discard uncommitted changes"
echo -n " proceed? [y/N] "
read -r reply
[[ "$reply" =~ ^[Yy]$ ]] || { echo "cancelled"; return 1; }
# Auto-snapshot current state before rollback
_archdev_git add -A 2>/dev/null
_archdev_git commit -q -m "auto: pre-rollback $(date +%Y%m%d-%H%M%S)" 2>/dev/null || true
_archdev_git reset --hard "$name"
echo "✓ rolled back to '$name'"
}
# What's changed since last snapshot
diff-state() {
_archdev_git status --short
echo ""
_archdev_git diff --stat HEAD
}
# Delete a snapshot
unsnapshot() {
if [[ -z "$1" ]]; then
echo "usage: unsnapshot <name>"
return 1
fi
_archdev_git tag -d "$1" && echo "✓ snapshot '$1' removed"
}
# Show what's in a snapshot
show-snapshot() {
if [[ -z "$1" ]]; then
echo "usage: show-snapshot <name>"
return 1
fi
_archdev_git show --stat "$1"
}
# ── Key Bindings ──────────────────────────────────────────────────────────────
bindkey -e
bindkey '^[[1;5C' forward-word
bindkey '^[[1;5D' backward-word