缘起
前两天在 B 站刷到一个视频——【2026 终极 Zsh 配置指南:打造比华尔街还炫酷的终端体验】。看了之后发现,视频里的核心理念和我一直在追求的完全一致:
- 不使用任何框架(Oh My Zsh、Zinit、Antidote 等)
- 完全掌控每一行配置
- 模块化拆分,按需加载
- 遵循 XDG 标准,保持
$HOME整洁
于是参考视频的思路,对我的 Zsh 配置做了一次全面升级。本文记录最终方案。
整体架构
配置采用模块化结构,所有文件存放在 ~/.config/zshrc/ 目录下:
~/.config/zshrc/
├── 00-init # 基础配置:历史记录、Shell 选项、补全
├── 05-fzf.zsh # FZF 模糊搜索器配置
├── 10-plugins.zsh # 手动插件加载器
├── 12-bindings.zsh # 快捷键绑定
├── 14-prompt.zsh # Starship 提示符
├── 20-customization # Zoxide 导航 + 便捷函数
├── 25-aliases # 别名集合
├── 30-autostart # 启动任务
└── starship.toml # Starship 主题
加载方式非常简单——我的 .zshrc 只是一个遍历 ~/.config/zshrc/* 的加载器,还会检查 custom/ 目录实现覆盖:
for f in ~/.config/zshrc/*; do
if [ ! -d $f ]; then
c=`echo $f | sed -e "s=.config/zshrc=.config/zshrc/custom="`
[[ -f $c ]] && source $c || source $f
fi
done
环境变量(.zshenv)
~/.zshenv 用于所有 Zsh 会话(包括非交互式),只放环境变量:
# XDG 标准路径
export XDG_CONFIG_HOME="$HOME/.config"
export XDG_CACHE_HOME="$HOME/.cache"
export XDG_DATA_HOME="$HOME/.local/share"
export XDG_STATE_HOME="$HOME/.local/state"
export EDITOR="nvim"
export GPG_TTY=$(tty)
export PATH="$HOME/.local/bin:$PATH"
# Starship 配置与 Zsh 配置同目录管理
export STARSHIP_CONFIG="$XDG_CONFIG_HOME/zshrc/starship.toml"
# Man 手册用 Bat 渲染
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
基础配置(00-init)
历史记录
HISTFILE="$XDG_STATE_HOME/zsh/history"
HISTSIZE=100000
SAVEHIST=100000
setopt APPEND_HISTORY # 追加而非覆盖
setopt SHARE_HISTORY # 多终端共享
setopt EXTENDED_HISTORY # 记录时间戳
setopt HIST_IGNORE_DUPS # 去重
setopt HIST_IGNORE_SPACE # 空格开头的命令不记入
setopt HIST_REDUCE_BLANKS # 保存前去除多余空格
Shell 选项
setopt AUTO_CD # 输入目录名自动 cd
setopt NO_BEEP # 禁掉哔哔声
setopt NUMERIC_GLOB_SORT # 数字排序 1,2,3...10
setopt AUTOPUSHD # cd 时自动入栈
setopt CORRECT # 拼写纠正
补全系统
autoload -Uz compinit
compinit -d "$XDG_CACHE_HOME/zsh/zcompdump"
zstyle ':completion:*' menu select
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'
模糊搜索(05-fzf.zsh)
FZF 替代了传统的 Ctrl+R 历史搜索和文件查找。使用 fzf --zsh 方式加载(比分 OS 判断更简洁):
source <(fzf --zsh 2>/dev/null)
export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --border --tmux --inline-info"
export FZF_CTRL_T_COMMAND="fd --hidden --strip-cwd-prefix"
export FZF_CTRL_T_OPTS="--preview 'bat --style=numbers --color=always {}'"
export FZF_ALT_C_COMMAND="fd --type d --hidden --strip-cwd-prefix"
export FZF_ALT_C_OPTS="--preview 'eza --tree --color=always {} | head -50'"
export FZF_CTRL_R_OPTS="--preview 'echo {}' --preview-window down:3:wrap --tiebreak=index"
--tmux 选项很棒——在 tmux 中打开弹出面板,非 tmux 环境自动降级为普通模式。
手动插件加载(10-plugins.zsh)
这是我个人最喜欢的部分——不使用任何插件管理器,用一个循环搞定:
ZSH_PLUGIN_DIR="$XDG_DATA_HOME/zsh/plugins"
plugins=(
"zsh-users/zsh-syntax-highlighting"
"zsh-users/zsh-autosuggestions"
"zsh-users/zsh-history-substring-search"
"jeffreytse/zsh-vi-mode"
)
for plugin in $plugins; do
local plugin_name="${plugin:t}"
local plugin_dir="$ZSH_PLUGIN_DIR/$plugin_name"
if [[ ! -d "$plugin_dir" ]]; then
echo "Installing plugin: $plugin_name..."
git clone --depth 1 "https://github.com/$plugin.git" "$plugin_dir"
fi
source "$plugin_dir/$plugin_name.zsh" 2>/dev/null || \
source "$plugin_dir/${plugin_name}.plugin.zsh" 2>/dev/null
done
# 一条命令更新所有插件
zplugin-update() {
for plugin_dir in "$ZSH_PLUGIN_DIR"/*/; do
echo "Updating $(basename $plugin_dir)..."
git -C "$plugin_dir" pull
done
}
插件首次使用时自动 git clone,后续自动加载。zplugin-update 一键更新所有插件。干净、透明、零依赖。
快捷键绑定(12-bindings.zsh)
# Vi 模式配置
VI_MODE_SET_CURSOR=true
VI_MODE_HIGHLIGHT=false
# 历史子串搜索(↑↓)
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down
# Ctrl + 左右箭头:单词跳转
bindkey '^[[1;5C' forward-word
bindkey '^[[1;5D' backward-word
# Ctrl+F:FZF 文件搜索
bindkey '^f' fzf-file-widget
# Ctrl+\:切换自动建议接受/拒绝
bindkey '^\' autosuggest-toggle
别名(25-aliases)
# Eza(ls 替代)
alias ls='eza --icons --group-directories-first'
alias ll='eza -l --icons --git --group-directories-first'
alias la='eza -la --icons --git --group-directories-first'
alias lt='eza --tree --icons --group-directories-first'
alias llt='eza -l --icons --git --tree --level=2 --group-directories-first'
# Bat(cat 替代)
alias cat='bat'
alias catp='bat --paging=never'
# ripgrep(grep 替代)
alias grep='rg'
# 导航
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
# Git 快捷
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'
alias gl='git log --oneline --graph'
--group-directories-first 让目录排在前面,找文件不再被一堆目录名淹没。llt 可快速预览两层目录结构。
Starship 提示符(14-prompt.zsh + starship.toml)
Starship 使用 Jetpack 预设,独特的双行布局——命令信息在上排,目录和 Git 状态在右侧,干净有层次感:
starship preset jetpack -o ~/.config/zshrc/starship.toml
配置文件和 Zsh 配置放在同一目录,通过 .zshenv 中的 STARSHIP_CONFIG 指向。激活 Python 虚拟环境时会显示 (venv-name)。上排显示命令耗时 → 主机名 → 用户名 → ❯,右侧显示目录和 Git 状态等信息。
使用指南
📂 文件浏览与查看
进入终端第一件事就是看文件,这应该是最常用的操作。
| 命令 | 作用 | 示例 |
|---|---|---|
ls | 文件列表,带彩色图标 | ls |
ll | 文件列表 + 权限/大小/Git 状态 | ll |
la | 包含隐藏文件(以 . 开头的) | la |
lt | 树形目录结构 | lt |
llt | 两级目录树(最常用) | llt ~/Project |
tree | 完整树形视图 | tree |
cat | 文件内容,语法高亮 | cat main.py |
catp | 文件内容,不分页直接输出 | catp config.json |
文件列表默认目录排在文件前面(--group-directories-first),再不用在一堆目录名里找文件了。lt 和 llt 可以快速看清项目结构.
🔍 搜索与查找
这套配置的搜索能力是提升最大的地方:
模糊搜索历史命令 — Ctrl+R
按 Ctrl+R 弹出 FZF 搜索窗口,输入任意关键词(如 docker),所有匹配的历史命令实时列出,用 ↑/↓ 选择后回车执行。搜索结果是按时间排序的,最近使用的优先。
模糊搜索文件 — Ctrl+T
在当前目录搜索文件(包含隐藏文件),右侧用 bat 实时显示文件内容预览,不用打开就知道是不是要找的那个。
模糊搜索目录 — Alt+C
搜索目录并快速跳转,右侧用 eza 显示目录树预览。
模糊搜索文件(不含隐藏) — Ctrl+F
和 Ctrl+T 一样,但只搜普通文件,不包含隐藏文件。
文本搜索 — grep
grep "error" -r src/ # 递归搜索 src 目录下的所有文件
grep 实际上调用的是 ripgrep(rg),比传统 grep 快得多,支持正则、彩色输出、自动忽略 .gitignore 中的文件。
文件查找 — fd
fd main.py # 查找 main.py
fd "\.toml$" # 查找所有 toml 文件
fd -e md # 查找所有 md 文件
fd 替代了 find,语法更直观,速度更快。
🚀 导航与跳转
Zoxide 智能跳转 — z
Zoxide 是最让人上瘾的工具之一。它自动记录你访问过的目录:
z proj # 跳转到 ~/Project(输入部分路径即可)
z dot # 跳转到 ~/.config/dotfiles
z lug3 # 跳转到 ~/Project/lug3zz.github.io
z dm # 跳转到 ~/Project/DM
用的次数越多,匹配越精准。如果你去过两个名字相似的目录,按 z 后再按 ↑ 会弹出选择菜单。
目录快捷键
.. # 返回上一级
... # 返回上两级
.... # 返回上三级
- # 返回上一个目录
d # 查看目录栈
1 # 跳转到目录栈第 1 个
2 # 跳转到目录栈第 2 个
输入目录名直接回车即可进入——因为启用了 AUTO_CD,不需要打 cd。
mkcd — 创建并进入
mkcd new-project # mkdir -p new-project && cd new-project
🐙 Git 快捷操作
gs # git status
ga # git add(默认加当前目录所有文件)
gc # git commit(打开编辑器写提交信息)
gp # git push
gl # git log --oneline --graph(图形化提交历史)
gd # git diff
🐍 Python 虚拟环境
激活虚拟环境后,提示符右侧会自动显示 (venv-name):
source .venv/bin/activate # 激活后 → 提示符出现 (venv)
deactivate # 退出后 → 提示符自动隐藏
📦 解压文件
extract archive.tar.gz # 自动识别格式并解压
extract file.zip
extract file.7z
支持 .tar.gz、.tgz、.tar.xz、.tar.bz2、.zip、.rar、.7z,不需要记参数。
↩️ 命令历史与补全
自动建议 — 输入命令时,历史中的匹配命令会以灰色显示在光标右侧,按 → 接受建议,按 Ctrl+\ 开关建议功能。
历史子串搜索 — 输入部分命令,按 ↑ 搜索历史中匹配的上一行,按 ↓ 搜索下一行。比如打了 docker 再按 ↑,就能翻出所有以 docker 开头的历史命令。
命令补全 — 按 Tab 弹出交互式补全菜单,用 ↑/↓ 选择。补全是大小写不敏感的,打 CD 也能补全成 cd,打 ZsHrc 也能找到 .zshrc。
⌨️ Vi 模式
按 ESC 进入 Vi 普通模式,可以用 Vi 快捷键编辑命令行:
ESC → h/j/k/l # 左右上下移动
ESC → / # 搜索历史
ESC → dw # 删除一个单词
ESC → dd # 删除整行
ESC → u # 撤销
ESC → Ctrl+R # 重做
i # 回到插入模式
光标样式会自动变化:插入模式为下划线 _,普通模式为块状 █。
🔧 其他常用功能
# 插件管理
zplugin-update # 一键更新所有手动安装的 Zsh 插件
# 代理切换(如果配置了地址)
proxy_toggle # 启用/禁用 HTTP/HTTPS 代理
# 文件管理器(Yazi)
y # 启动终端文件管理器,退出时自动 cd 到所在目录
# man 手册(带语法高亮)
man ls # 用 bat 渲染,彩色输出
📋 部署到新机器
这套配置使用 chezmoi 管理,源码托管在 GitHub。新机器上一行命令即可恢复全部配置:
chezmoi init --apply LuG3Zz
后续更新也很简单:
chezmoi update # 拉取并应用最新配置
chezmoi diff # 查看即将发生的变更
chezmoi apply ~/.zshrc # 只应用单个文件
chezmoi reapply # 重新应用所有配置
总结
这套配置的核心理念很明确:去掉黑盒,完全掌控。
没有 Oh My Zsh 的启动性能损耗,没有插件管理器的复杂 DSL,每个文件、每行配置都清清楚楚。所有文件通过 chezmoi 管理,新机器上 chezmoi init --apply LuG3Zz 一行搞定。
如果你也厌倦了那些厚重的框架,不妨试试这个路子。从零开始搭建的配置,会比任何一个开箱即用的方案都更懂你的需求。