186 lines
8.1 KiB
Bash
186 lines
8.1 KiB
Bash
# ╔══════════════════════════════════════════════════════════════════╗
|
||
# ║ 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
|