统一 zsh 配置
这份配置用于 Linux 和 macOS 共用。把它放在 zsh framework 初始化之后:zimfw 先完成
~/.zim/init.zsh 初始化,oh my zsh 先完成 source $ZSH/oh-my-zsh.sh,再放下面这段。
zsh_defer_or_run 只检测当前 shell 里是否已经有 zsh-defer function,不主动加载
zsh-defer 文件。没有 zsh-defer 时会同步执行,保证同一份配置可以兜底运行。
配置片段
cat <<'EOF' >> ~/.zshrc
# ============================================================
# Core
# ============================================================
[[ ":$PATH:" == *":$HOME/.local/bin:"* ]] || export PATH="$HOME/.local/bin:$PATH"
export NVM_DIR="$HOME/.nvm"
zsh_defer_or_run() {
if (( $+functions[zsh-defer] )); then
zsh-defer "$@"
else
"$@"
fi
}
zsh_optional_eval() {
local init_script
init_script="$("$@" 2>/dev/null)" || return 0
[[ -n "$init_script" ]] && eval "$init_script"
}
zsh_optional_source() {
source "$1" >/dev/null 2>&1 || return 0
}
# ============================================================
# Deferred optional integrations
# ============================================================
zsh_defer_or_run zsh_optional_eval fzf --zsh
zsh_defer_or_run zsh_optional_eval zoxide init zsh
zsh_defer_or_run zsh_optional_source "$NVM_DIR/nvm.sh"
zsh_defer_or_run zsh_optional_source "$NVM_DIR/bash_completion"
# ============================================================
# Python venv
# ============================================================
activate_venv() {
local venv_path="${1:-.venv}"
local candidate
local activate=""
local candidates=(
"$venv_path"
"$venv_path/bin/activate"
"$venv_path/.venv/bin/activate"
)
for candidate in "${candidates[@]}"; do
if [[ -f "$candidate" ]]; then
activate="$candidate"
break
fi
done
if [[ -z "$activate" ]]; then
print -u2 "No virtual environment activation script found for '$venv_path'."
return 1
fi
source "$activate"
}
deactivate_venv() {
if (( $+functions[deactivate] )); then
deactivate
return
fi
print "No active Python virtual environment."
}
alias venv="activate_venv"
alias va="activate_venv"
alias vde="deactivate_venv"
# ============================================================
# Aliases
# ============================================================
# zoxide
alias j="z"
alias ji="zi"
# Git
alias g="git"
alias gct="git commit"
alias gs="git stash"
alias gr1="git reset --soft HEAD~1"
alias gp="git pull"
alias ggp="git push"
alias gaa="git add ."
alias gch="git checkout"
# JavaScript runtime
alias nr="npm run"
alias br="bun run"
alias bx="bunx"
# Python
alias uvpy="uv run python"
alias uvpip="uv pip"
# Tools
alias ard="aria2c --summary-interval=10 -x 3 --allow-overwrite=true -Z"
if [[ "$OSTYPE" == linux* ]]; then
alias sdr="systemctl daemon-reload"
alias sr="systemctl restart"
alias jl="journalctl -o cat -fu"
fi
# ============================================================
# Prompt
# ============================================================
# 如果没有使用 zimfw 的 joke/zim-starship,再启用这一行。
# Starship 是 prompt 初始化,不建议用 zsh-defer 延迟加载。
# eval "$(starship init zsh)"
EOF
source ~/.zshrc加载策略
fzf、zoxide 和 nvm 都是 optional integration,失败时静默跳过。它们缺失或版本不支持
不应该打断 shell startup。
alias、PATH、NVM_DIR、venv function 和 Linux-only alias 同步定义。这些配置几乎没有启动
性能成本,同步加载可以保证打开 shell 后立即可用。
Starship 不做 deferred loading。使用 zimfw 时推荐交给 zmodule joke/zim-starship;使用 oh my zsh
或裸 zsh 时,在配置末尾取消 eval "$(starship init zsh)" 的注释。
专项工具的 function 仍放在各自页面,例如 nix 的 nxi、nxs、nxgc 这类 helper 继续放在
nix 页面。
Last updated on