Skip to content

把我的 .zshrc 讲透:按“原文一段 + 中文解释一段”逐节拆解 ​

1) locale / editor ​

zshrc 原文 ​

zsh
# ===== locale / editor =====
# 设置语言、编辑器和基础目录变量。
export LANG=en_US.UTF-8
export LC_CTYPE=$LANG
export EDITOR=nano
export VISUAL=$EDITOR
export XDG_CACHE_HOME=${XDG_CACHE_HOME:-$HOME/.cache}
export DEV49_HOME=${DEV49_HOME:-$HOME/dev49}
export TMP49_DIR=${TMP49_DIR:-$HOME/tmp49}

中文解释 ​

这段是“环境基线层”:

  • LANG + LC_CTYPE:统一字符编码环境,降低终端乱码概率。
  • EDITOR + VISUAL:统一 CLI 工具打开编辑器的行为。
  • XDG_CACHE_HOME:给缓存目录统一入口,减少散落。
  • DEV49_HOME、TMP49_DIR:后续函数依赖的根路径变量。

${VAR:-default} 是“有值沿用、无值兜底”的写法,提升可迁移性。


2) platform ​

zshrc 原文 ​

zsh
# ===== platform =====
# 检测当前是否处于 WSL 环境。
export IS_WSL=$([[ -r /proc/version ]] && grep -qi microsoft /proc/version && echo 1 || echo 0)

中文解释 ​

这行把“是否在 WSL”做成可复用变量:

  • 命中 WSL 特征:IS_WSL=1
  • 否则:IS_WSL=0

后续任何 WSL 分支逻辑都可直接读这个变量,避免重复探测。


3) path ​

zshrc 原文 ​

zsh
# ===== path =====
# 去重 path/fpath/cdpath/manpath,并提前注入常用目录。
typeset -gU path fpath cdpath manpath
path=(
  $HOME/.local/bin
  $HOME/.local/share/fnm
  $path
)

中文解释 ​

这段核心是“路径卫生”:

  • typeset -gU:对数组去重,保留首次顺序。
  • 把 $HOME/.local/bin 和 $HOME/.local/share/fnm 前置:优先命中用户空间工具。

path/fpath/cdpath/manpath 一起去重,有助于降低路径冲突与排错成本。


4) history ​

zshrc 原文 ​

zsh
# ===== history =====
# 配置历史记录容量与共享策略。
HISTFILE=$HOME/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt APPEND_HISTORY
setopt INC_APPEND_HISTORY
setopt SHARE_HISTORY
setopt EXTENDED_HISTORY
setopt HIST_IGNORE_DUPS
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_FIND_NO_DUPS
setopt HIST_REDUCE_BLANKS
setopt HIST_EXPIRE_DUPS_FIRST
setopt HIST_FCNTL_LOCK

中文解释 ​

这段目标是“历史记录可用且干净”:

  • HISTSIZE/SAVEHIST:控制内存与落盘容量。
  • APPEND_HISTORY/INC_APPEND_HISTORY:尽量减少覆盖写历史。
  • SHARE_HISTORY:多终端共享历史。
  • EXTENDED_HISTORY:记录扩展信息。
  • 多个 HIST_*DUPS*:减少重复命令噪声。
  • HIST_FCNTL_LOCK:并发写历史更稳。

5) shell behavior ​

zshrc 原文 ​

zsh
# ===== shell behavior =====
# 开启更顺手的交互行为。
setopt AUTO_CD
setopt INTERACTIVE_COMMENTS
setopt NO_BEEP

中文解释 ​

这是交互手感优化:

  • AUTO_CD:输入目录名可直接切换目录。
  • INTERACTIVE_COMMENTS:交互模式支持 # 注释。
  • NO_BEEP:关闭蜂鸣音。

6) completion ​

zshrc 原文 ​

zsh
# ===== completion =====
# 设置补全匹配、菜单样式与缓存目录。
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Za-z}'
zstyle ':completion:*' menu select
zstyle ':completion:*' list-colors ''
zstyle ':completion:*' use-cache on
zstyle ':completion:*' cache-path "$XDG_CACHE_HOME/zsh/zcompcache"

中文解释 ​

补全层的关键在于“容错 + 响应”:

  • matcher-list:大小写匹配更宽松。
  • menu select:补全候选可交互选择。
  • list-colors '':使用默认配色策略。
  • use-cache + cache-path:启用并落地缓存,降低重复计算。

7) oh-my-zsh ​

zshrc 原文 ​

zsh
# ===== oh-my-zsh =====
# 加载 Oh My Zsh、主题和插件。
export ZSH=$HOME/.oh-my-zsh
ZSH_THEME=robbyrussell
plugins=(
  sudo
  extract
  z
)
zstyle ':omz:update' mode reminder
source $ZSH/oh-my-zsh.sh

中文解释 ​

这一段定义 shell 框架层:

  • ZSH:框架目录。
  • ZSH_THEME:主题选择。
  • plugins:启用 sudo/extract/z 三个插件。
  • :omz:update mode reminder:仅提醒更新。
  • source ...oh-my-zsh.sh:实际加载入口。

8) fnm ​

zshrc 原文 ​

zsh
# ===== fnm =====
# 加载 fnm 环境并启用目录切换自动版本识别。
(( $+commands[fnm] )) && eval "$(fnm env --use-on-cd --shell zsh)"

中文解释 ​

先判断 fnm 是否存在,再注入环境。--use-on-cd 让目录切换时自动匹配 Node 版本,适合多项目并行开发。


9) fzf ​

zshrc 原文 ​

zsh
# ===== fzf =====
# 加载 fzf 的 zsh 集成脚本。
(( $+commands[fzf] )) && source <(fzf --zsh)

中文解释 ​

同样是条件加载策略:

  • 有 fzf 就启用集成
  • 没有 fzf 也不影响 shell 启动

兼顾能力增强与启动稳定性。


10) aliases ​

zshrc 原文 ​

zsh
# ===== aliases =====
# 定义高频命令别名。
alias q='exit 0'
alias sudo='sudo '
alias c='clear'
alias -- -='cd -'
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias ..='cd ..'
alias ...='cd ../..'
alias grep='grep --color=auto'
alias igrep='grep -i'

中文解释 ​

这一段是输入效率优化:

  • q/c/.. 属于高频动作压缩。
  • alias -- -='cd -':输入 - 可直接回到上个目录。
  • grep 默认彩色,igrep 快速大小写不敏感搜索。
  • alias sudo='sudo ' 末尾空格是有意设计,允许继续 alias 展开。

11) utils 函数区 ​

11.1 penv() ​

zshrc 原文 ​

zsh
# 以对齐方式打印所有环境变量。
penv() {
  printenv | sort | awk -F= '
    { a[NR]=$0; if (length($1)>m) m=length($1) }
    END {
      for (i=1; i<=NR; i++) {
        split(a[i], b, "=")
        key=b[1]
        sub(/^[^=]*=/, "", a[i])
        printf "\033[32m%-*s\033[0m = %s\n", m, key, a[i]
      }
    }'
}

中文解释 ​

将环境变量做排序、对齐和彩色展示。用途是排查变量覆盖时提高可读性。


11.2 ppath() ​

zshrc 原文 ​

zsh
# 按序号打印 path,并标记目录是否存在。
ppath() {
  local i=1 dir color sign
  for dir in $path; do
    if [[ -d $dir ]]; then
      color=32
      sign=OK
    else
      color=31
      sign=NO
    fi
    printf '\e[%sm[%2d] %s\e[0m %s\n' $color $i $sign $dir
    ((i++))
  done
}

中文解释 ​

逐项输出 PATH 并标记目录存在性,快速定位“配置了路径但目录实际不存在”的问题。


11.3 mkcd() ​

zshrc 原文 ​

zsh
# 创建目录并立即进入。
mkcd() {
  mkdir -p -- "$1" && cd -- "$1"
}

中文解释 ​

封装“创建目录 + 进入目录”组合操作。-- 用于避免参数被误判为选项。


11.4 tmp49() ​

zshrc 原文 ​

zsh
# 清空临时目录并进入。
tmp49() {
  rm -rf -- $TMP49_DIR
  mkdir -p -- $TMP49_DIR
  cd -- $TMP49_DIR
}

中文解释 ​

用于重置临时工作区。包含 rm -rf,应确保 TMP49_DIR 始终指向可控临时目录。


11.5 pps() ​

zshrc 原文 ​

zsh
# 搜索进程;有参数时模糊搜,没有参数时列全量。
pps() {
  (( $# )) && pgrep -af -i -- "$*" || ps -ef
}

中文解释 ​

有参数时查匹配进程,无参数时回退到全量进程列表,单函数覆盖两类常用场景。


11.6 cdwin() ​

zshrc 原文 ​

zsh
# 把 Windows 路径转成 WSL 路径并进入。
cdwin() {
  cd -- "$(wslpath -u "$1")"
}

中文解释 ​

把 Windows 路径转换为 WSL 路径后直接进入,是 WSL 场景下的高频桥接函数。


11.7 cddd() ​

zshrc 原文 ​

zsh
# 快速进入 Windows 下载目录。
cddd() {
  cdwin "C:\Users\<your-user>\Downloads"
}

中文解释 ​

典型的个人快捷入口。迁移到其他机器时主要替换用户名路径。


11.8 git-web() ​

zshrc 原文 ​

zsh
# 输出当前 Git 仓库 origin 的网页地址。
git-web() {
  git remote get-url origin | sed -E \
    's#^git@([^:]+):#https://\1/#; s#^ssh://git@#https://#; s#\.git$##'
}

中文解释 ​

将常见 Git 远程地址形式转换为浏览器可访问 URL,便于快速打开仓库网页。


11.9 update_binaries() ​

zshrc 原文 ​

zsh
# 执行自定义 Python 工具更新脚本。
update_binaries() {
  uv run "$DEV49_HOME/python/update_binaries.py"
}

中文解释 ​

通过 uv run 运行更新脚本,减少对系统 Python 状态的直接耦合。


11.10 kan() ​

zshrc 原文 ​

zsh
# 查看命令的所有来源与最终解析结果。
kan() {
  print '显示所有定义:'
  type -a "$1"
  print
  print '最终执行结果:'
  command -V "$1"
}

中文解释 ​

用于命令解析排查:先看所有定义,再看最终解析目标。适合定位 alias/function 覆盖问题。


11.11 gitignore() ​

zshrc 原文 ​

zsh
# 下载指定模板名的 .gitignore。
gitignore() {
  curl -fsSL "https://raw.githubusercontent.com/github/gitignore/main/$1.gitignore" -o .gitignore
}

中文解释 ​

快速拉取官方模板 .gitignore。注意会覆盖当前目录已有同名文件。


11.12 up-pb() ​

zshrc 原文 ​

zsh
# 上传文件或标准输入到 fars.ee。
up-pb() {
  curl -fsS -F "c=@${1:--}" -F p=1 'https://fars.ee/?u=1'
}

中文解释 ​

把文件或标准输入上传到外部服务。适合临时分享,不建议用于敏感信息。


11.13 favicons49() ​

zshrc 原文 ​

zsh
# 下载指定网站的 favicon。
favicons49() {
  local url=$1 size=${2:-64} host out
  host=${url#http://}
  host=${host#https://}
  host=${host%%/*}
  out=${host:-favicon}
  curl -fsSL "https://www.google.com/s2/favicons?sz=$size&domain_url=$url" -o "$out.jpg"
}

中文解释 ​

先从 URL 提取域名,再按域名命名输出文件,最后下载 favicon。默认尺寸是 64。


11.14 allinboom() ​

zshrc 原文 ​

zsh
# 执行整套仓库同步与备份流程。
allinboom() {
  tmp49
  update_binaries
  zsh ~/dev49/scripts/1-clone-all.sh
  zsh ~/dev49/scripts/2-pull-all.sh
  zsh ~/dev49/scripts/3-update-all.sh
  zsh ~/dev49/scripts/4-backup-all.sh
  zsh ~/dev49/AI49/claude.zsh
  print -n '\a'
}

中文解释 ​

这是一键流水线函数:准备临时目录 → 更新工具 → 批量脚本执行 → 完成提示音。依赖本地脚本目录完整可用。


12) tmux / ai 函数区 ​

12.1 ccswitch() + AI_CMD ​

zshrc 原文 ​

zsh
# ===== tmux / ai =====
# 切换 claude配置
ccswitch(){
  cat /mnt/c/Users/<your-user>/.cc-switch/.claude/settings.json > /home/<your-user>/dev49/AI49/claude-settings.json
}
AI_CMD='claude --dangerously-skip-permissions'

中文解释 ​

  • ccswitch():同步配置文件(Windows → WSL 路径)。
  • AI_CMD:定义 AI 会话启动命令,供后续 tmux 函数复用。

12.2 _ta() ​

zshrc 原文 ​

zsh
# 进入 session:在 tmux 内就切换,不在 tmux 内就 attach
_ta() {
  if [[ -n $TMUX ]]; then
    tmux switch-client -t "$1"
  else
    tmux attach-session -t "$1"
  fi
}

中文解释 ​

统一“进入会话”行为:在 tmux 内就切换客户端,不在 tmux 内就附着会话。


12.3 _tpick() ​

zshrc 原文 ​

zsh
# fzf 选择一个 session
_tpick() {
  tmux list-sessions -F '#S' 2>/dev/null | \
    fzf --prompt='tmux session> ' --height=40% --reverse
}

中文解释 ​

把 tmux list-sessions 输出交给 fzf 选择,是 ts / tk 的基础选择器。


12.4 _tai_name() ​

zshrc 原文 ​

zsh
# 当前目录生成 AI session 名
_tai_name() {
  local name=${PWD:t}
  name=${name//[^[:alnum:]_-]/_}
  print -r -- "ai-$name"
}

中文解释 ​

按当前目录自动生成安全会话名,避免手工命名和非法字符问题。


12.5 _tensure() ​

zshrc 原文 ​

zsh
# session 不存在则创建;有命令就用命令启动,没有就启动默认 shell
_tensure() {
  local session=$1
  shift
  tmux has-session -t "$session" 2>/dev/null && return 0
  if (( $# )); then
    tmux new-session -d -s "$session" "$@"
  else
    tmux new-session -d -s "$session"
  fi
}

中文解释 ​

幂等会话确保器:已存在就复用,不存在再创建,并支持可选启动命令。


12.6 tai() ​

zshrc 原文 ​

zsh
# 创建/进入当前目录对应的 AI session
tai() {
  local session=${1:-$(_tai_name)}
  _tensure "$session" "zsh -ic 'exec $AI_CMD'"
  _ta "$session"
}

中文解释 ​

目录级 AI 会话入口:默认按目录名生成会话,缺失时自动创建,再进入会话。


12.7 tnew() ​

zshrc 原文 ​

zsh
# 创建/进入指定 session
tnew() {
  local session=$1
  [[ -z $session ]] && { echo 'usage: tnew <session-name>'; return 1; }
  _tensure "$session"
  _ta "$session"
}

中文解释 ​

显式命名并进入会话;缺参数时立即返回 usage,避免误操作。


12.8 ts() ​

zshrc 原文 ​

zsh
# fzf 选择 session 并进入
ts() {
  local session=$(_tpick)
  [[ -n $session ]] && _ta "$session"
}

中文解释 ​

交互选择会话并进入,适合会话较多时快速跳转。


12.9 tk() ​

zshrc 原文 ​

zsh
# fzf 选择 session 并杀掉
tk() {
  local session=$(_tpick)
  [[ -n $session ]] && tmux kill-session -t "$session"
}

中文解释 ​

交互选择后删除会话。删除不可逆,执行前应确认选择对象。


13) doctor ​

zshrc 原文 ​

zsh
# ===== doctor =====
# 检查当前 shell、WSL 状态、path 和关键命令。
zshrc-doctor() {
  print '== shell =='
  print $SHELL
  print
  print '== wsl =='
  print "IS_WSL=$IS_WSL"
  print
  print '== path =='
  ppath
  print
  print '== commands =='
  local cmd
  for cmd in zsh git tmux node npm python3 uv fzf fnm yazi; do
    (( $+commands[$cmd] )) \
      && printf '[OK] %s -> %s\n' "$cmd" "$commands[$cmd]" \
      || printf '[NO] %s\n' "$cmd"
  done
}

中文解释 ​

这是整份配置的自检入口,覆盖四个维度:

  1. 当前 shell
  2. WSL 状态
  3. PATH 健康度(调用 ppath)
  4. 关键命令可用性与实际路径

适合新环境初始化和日常故障排查。


结语 ​

这份 .zshrc 的核心不是“命令多”,而是分层清晰:

  • 先稳定基础环境
  • 再优化交互体验
  • 最后把高频动作函数化

按这个顺序组织 shell 配置,可维护性和复用性都会明显提升。

Nine and AI — Licensed under the MIT License