还在用 iTerm2?分享下我的现代终端配置
iTerm2 配一套默认 zsh,我用了好几年没怎么动过。最近抽时间把终端从里到外换了一遍------终端本身、提示符、到天天敲的那些命令,每一层都换成了更现代、更快的替代,用下来顺手太多。
这篇就记录我现在这套:Ghostty 做终端,oh-my-zsh 加 Powerlevel10k 管 shell 和提示符,再加 ripgrep、fd、eza、zoxide 这批 Rust 工具替掉 grep、find、ls、cd。Mac 和 Linux 通用,三层相互独立,你挑想要的抄。
举个最直观的:同一个 4 万文件、1.3G 的仓库,grep -r 搜一次 8 秒,换成 rg 是 0.03 秒。这类提速来自命令行工具、跟终端本身无关,但确实是日常体感差距最大的一块。
懒人版:把这段丢给 AI
不想一步步手动装,可以把下面整段复制给能跑命令的 AI(Claude Code、Cursor、Gemini CLI 等),它会按这套配置帮你装好、改好 ~/.zshrc 并验证。它会先备份你的 .zshrc、按你的系统选安装命令,也不会覆盖 cat / ls / grep 这些标准命令。
text
帮我在这台机器上配置一套现代终端环境。先检测系统(macOS 还是 Linux)和包管理器,
据此选安装命令;每步先说要做什么,改 ~/.zshrc 前先备份成 ~/.zshrc.bak.<时间戳>。
所有往 .zshrc 追加的内容都用 command -v 守卫,保证重复运行不会重复添加。
按以下清单做:
1. 终端 Ghostty(macOS: brew install --cask ghostty;已装跳过)。
2. 字体 MesloLGS NF(Nerd Font);装完提醒我去终端设置里手动把字体选成它。
3. oh-my-zsh(已装跳过)。
4. Powerlevel10k 主题,设 ZSH_THEME="powerlevel10k/powerlevel10k",
装完让我自己跑 p10k configure。
5. omz 插件 zsh-autosuggestions、zsh-syntax-highlighting,clone 到 custom/plugins,
写成 plugins=(git zsh-autosuggestions zsh-syntax-highlighting),
syntax-highlighting 必须放最后。
6. 现代命令行工具:eza bat fd fzf zoxide git-delta bottom ripgrep。
macOS 用 brew;Debian/Ubuntu 用 apt(注意 bat 装出来叫 batcat、fd 叫 fdfind);
Arch 用 pacman。
7. 在 ~/.zshrc 末尾追加工具初始化:batcat/fdfind 的 fallback 别名、zoxide init、
fzf init、eza 别名(ll/la/lt)、bat 别名(catp)。
关键原则:绝不用别名覆盖 cat/ls/find/grep/cd 等标准命令,现代工具只挂独立别名。
8. git diff 用 delta:配 core.pager=delta、interactive.diffFilter、delta.navigate、
delta.line-numbers、merge.conflictStyle=zdiff3。
9. 如果装了 nvm,把它改成懒加载;并在 source oh-my-zsh.sh 之前加 ZSH_DISABLE_COMPFIX=true。
10. 如果之前用过 omz 的 z 插件,从 plugins 删掉 z,
并提示我可以用 zoxide import --from z ~/.z 导入旧跳转历史。
全部做完后验证一遍:各工具 --version、新开 zsh 测启动耗时、确认别名生效,
把结果列给我。过程中不要覆盖任何标准命令,不确定的地方先问我再动。
想自己一步步来、或者只取其中几样,接着往下看。
准备:包管理器和字体
macOS 装 Homebrew:
bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Linux 用自带的 apt / dnf / pacman。
字体得装 Nerd Font,不然提示符和文件图标会显示成方块。我用的是 MesloLGS NF:
bash
# macOS
brew install --cask font-meslo-lg-nerd-font
# Linux:从 github.com/ryanoasis/nerd-fonts 下 Meslo,
# 放进 ~/.local/share/fonts/ 后 fc-cache -f
装完在终端设置里把字体选成 MesloLGS NF。
终端:Ghostty
GPU 渲染,滚动和大量输出比 iTerm2 顺。
bash
# macOS
brew install --cask ghostty
# Linux:官网有 GTK 版,部分发行版有仓库包,也可源码编译
默认就能用。我额外写了个配置 ~/.config/ghostty/config 让字体和 p10k 对齐:
ini
font-family = MesloLGS NF
font-size = 14
theme = catppuccin-mocha
background-opacity = 0.96
window-padding-x = 12
window-padding-y = 8
copy-on-select = true
改完 Cmd+Shift+, 重载。主题用 ghostty +list-themes 看。
shell 框架:oh-my-zsh
Linux 上先 sudo apt install zsh 再 chsh -s $(which zsh),macOS 自带。
bash
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
omz 启动开销大概 20ms,我觉得为了插件生态这点不算什么。拖慢启动的其实是 nvm 和补全系统,往下第七、第九节会处理。想要更精简的框架,第八节有 Zimfw 的写法。
提示符:Powerlevel10k
bash
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git \
${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
~/.zshrc 里设:
bash
ZSH_THEME="powerlevel10k/powerlevel10k"
重开终端进配置向导,或手动 p10k configure,结果存在 ~/.p10k.zsh。
p10k 有 instant prompt,提示符在 shell 没加载完时就先画出来,所以体感零延迟;git 状态交给后台守护进程 gitstatusd 异步算,大仓也不卡。这也是我没换 Starship 的原因------Starship 跨 shell、配置简单,但每次渲染都同步跑一遍 git,纯速度不如 p10k。
补全和高亮
一个补全(输入时灰字提示历史命令,右方向键接受),一个语法高亮(对的绿、错的红)。这俩是我最离不开的:
bash
git clone https://github.com/zsh-users/zsh-autosuggestions \
${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting \
${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
~/.zshrc 插件行,syntax-highlighting 放最后:
bash
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
现代命令行工具
bash
# macOS
brew install eza bat fd fzf zoxide git-delta bottom ripgrep
# Debian / Ubuntu
sudo apt install bat fd-find fzf zoxide ripgrep
# eza / git-delta / bottom 旧仓库里可能没有,用 cargo 或下 release 二进制
# Arch
sudo pacman -S eza bat fd fzf zoxide git-delta bottom ripgrep
| 工具 | 替代 | 用途 | 备注 |
|---|---|---|---|
ripgrep(rg) |
grep -r |
搜代码 | 大仓快两三个数量级 |
| fd | find |
找文件 | 语法是正则,不是 -name |
| eza | ls |
列目录 | 带图标和 git 状态 |
| bat | cat |
看文件 | 语法高亮 |
zoxide(z) |
cd |
目录跳转 | 按访问频率记忆 |
| fzf | --- | 模糊查找 | Ctrl-R 搜历史、Ctrl-T 找文件 |
| git-delta | git 默认 diff | 看 diff | 彩色带行号 |
bottom(btm) |
top |
系统监控 | --- |
我只给这些工具挂独立别名(ll、z、catp),不覆盖 ls、cat、find、grep。这样脚本和自动化工具拿到的还是标准命令的行为,不会被花哨输出搞乱。
rg 和 fd 有两个默认行为得记住:它们默认跳过 .gitignore 和隐藏文件,搜 node_modules、dist 会查无结果,全量搜分别加 -uu 和 -HI;rg 默认把 pattern 当正则,搜带括号点号的字面串(config.get())要加 -F。
.zshrc 里接好工具
加到 ~/.zshrc 末尾。头两行让同一份配置在 Mac 和 Linux 都能用------Debian/Ubuntu 上 bat、fd 被装成了 batcat、fdfind:
bash
# Debian/Ubuntu 上 bat/fd 改了名,透明 fallback
command -v batcat >/dev/null && ! command -v bat >/dev/null && alias bat='batcat'
command -v fdfind >/dev/null && ! command -v fd >/dev/null && alias fd='fdfind'
# zoxide:智能 cd,提供 z 和 zi
command -v zoxide >/dev/null && eval "$(zoxide init zsh)"
# fzf:Ctrl-R 历史 / Ctrl-T 文件 / Alt-C 目录
command -v fzf >/dev/null && source <(fzf --zsh) 2>/dev/null
# eza:只加别名,不动 ls
if command -v eza >/dev/null; then
alias ll='eza -l --git --icons --group-directories-first'
alias la='eza -la --git --icons --group-directories-first'
alias lt='eza --tree --level=2 --icons'
fi
# bat:只加别名,不动 cat
if command -v bat >/dev/null; then
alias catp='bat -pp'
export BAT_THEME="ansi"
fi
用过 omz 的 z 插件的话,从 plugins=(...) 删掉 z,不然和 zoxide 抢命令。旧跳转历史可以导过来:zoxide import --from z ~/.z。
可选:Zimfw 替代 oh-my-zsh
想要更快的启动和更干净的配置,可以用 Zim 替掉 omz。它把模块预编译成字节码,冷启动常在 50ms 以内,配置是声明式的,换机器丢一份 .zimrc 加 zimfw install 就装齐,做 dotfiles 比 omz 省事。生态比 omz 小是它的代价。
我前面最看重的补全和跳转换框架不会丢:zoxide 是独立二进制跟框架无关,autosuggestions 在 Zim 里也有同款模块。
bash
curl -fsSL https://raw.githubusercontent.com/zimfw/install/master/install.zsh | zsh
~/.zimrc 里声明模块,提示符仍用 p10k:
bash
zmodule romkatv/powerlevel10k --use degit
zmodule git
zmodule zsh-users/zsh-completions --fpath src
zmodule zsh-users/zsh-autosuggestions
zmodule zsh-users/zsh-syntax-highlighting
zmodule zsh-users/zsh-history-substring-search
然后 zimfw install。第六、七节那批工具和 zoxide/fzf 的初始化照搬,跟框架无关。
omz 现在用着顺手的话其实不用折腾,换 Zim 省下的就几十毫秒。
git diff:delta
bash
git config --global core.pager "delta"
git config --global interactive.diffFilter "delta --color-only"
git config --global delta.navigate true
git config --global delta.line-numbers true
git config --global merge.conflictStyle zdiff3
git 检测到输出不是终端时会自动关 pager,所以管道和脚本里 git diff | xxx 不会被 delta 干扰。
启动提速(装了 nvm 的话)
nvm 每次启动全量加载,拖大概 50ms。改成用到时才加载,把 ~/.zshrc 里原来的 nvm 块换成:
bash
export NVM_DIR="$HOME/.nvm"
nvm() {
unset -f nvm
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh" # macOS
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # Linux
nvm "$@"
}
再在 source $ZSH/oh-my-zsh.sh 之前加一行,跳过补全目录的安全审计:
bash
ZSH_DISABLE_COMPFIX=true
启动从约 190ms 到约 110ms。体感其实不强,instant prompt 早把提示符画出来了,顺手做掉而已。
可选:给 AI 工具写使用约定
用 Claude Code、Kiro CLI 这类工具的话,它们也会调这些命令行工具,但常因不懂默认行为而用错。写份约定给它们读:Claude Code 放 ~/.claude/CLI-TOOLS.md,在 ~/.claude/CLAUDE.md 加一行 @CLI-TOOLS.md;Kiro CLI 放 ~/.kiro/steering/modern-cli-tools.md,默认 agent 会自动加载。
讲清三件事就够:rg/fd 默认跳过 .gitignore 和隐藏文件,全量搜加 -uu / -HI;rg 默认按正则解释,字面串加 -F;解析内容用标准 cat 不用 bat。
Mac 和 Linux 的差异
通用为主,要留意的就几处:装法 brew 换成 apt/dnf/pacman,eza/delta/bottom 旧发行版可能得用 cargo 或下二进制;Debian/Ubuntu 上 bat 是 batcat、fd 是 fdfind,第七节的 fallback 别名已经兜住;.zshrc 里 /opt/homebrew 和 nvm 的 Homebrew 路径是 Mac 专属,Linux 改成 ~/.nvm 那套;字体在 Linux 手动装到 ~/.local/share/fonts/。
速查
| 想做的事 | 命令 |
|---|---|
| 列目录(详细 / 含隐藏 / 树) | ll / la / lt |
| 看文件(解析 / 阅读) | cat 文件 / bat 文件 |
| 搜代码 | rg 关键词,字面串 rg -F |
| 搜被忽略的文件 | rg -uu 关键词 |
| 找文件 | fd 名字,全量 fd -HI |
| 跳目录 / 交互选 | z 项目名 / zi 项目名 |
| 搜历史命令 | Ctrl-R |
| 看 git diff | git diff |
| 系统监控 | btm |
踩过的坑
图标变方块:Nerd Font 没装或终端没选它。
z 跳不准:zoxide 要先学习,手动 cd 进几次,或 zoxide import --from z ~/.z 导旧数据。
rg 搜不到 node_modules:默认跳过 .gitignore,加 -uu。
改完 .zshrc 没生效:exec zsh 或新开终端,改前先 cp ~/.zshrc ~/.zshrc.bak。