macOS 自带的终端工具够用,但”够用”和”好用”之间差了一个 Homebrew。本文介绍 9 个经过实战检验的 CLI 工具,覆盖文件浏览、内容搜索、目录跳转、版本管理等日常高频场景,帮你把终端效率拉满。
一键安装
1
| brew install eza bat fd ripgrep fzf zoxide atuin starship mise
|
Nerd Font 提示:eza 和 starship 依赖 Nerd Font 才能正确显示图标。推荐安装 JetBrainsMono Nerd Font:
1
| brew install --cask font-jetbrains-mono-nerd-font
|
安装后在终端偏好设置中将字体切换为 JetBrainsMono Nerd Font。
1. eza — 更好的 ls
eza 是 ls 的现代替代品,支持颜色、图标、Git 状态和 tree 视图。
推荐配置
在 ~/.zshrc 中添加别名:
1 2 3
| alias ls="eza --icons --group-directories-first" alias ll="eza -alh --icons --group-directories-first --git" alias tree="eza --tree --icons --level=3"
|
常用选项
| 选项 |
说明 |
--icons |
显示文件类型图标(需 Nerd Font) |
-l |
长格式 |
-a |
显示隐藏文件 |
--git |
显示 Git 状态 |
--tree |
树状视图 |
--level=N |
树状视图深度 |
--group-directories-first |
目录排在前面 |
--sort=modified |
按修改时间排序 |
使用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| eza --tree --level=2 --icons
eza -alh --git --icons
eza -l --sort=modified --reverse
eza -D --icons
eza -lh --header --icons
|
2. bat — 带语法高亮的 cat
bat 为 cat 添加了语法高亮、行号和 Git diff 标记。
推荐配置
创建配置文件 ~/.config/bat/config:
1 2 3 4 5
| --theme="Catppuccin Mocha" --style="numbers,changes,header,grid" --italic-text=always --map-syntax "*.conf:INI" --map-syntax ".ignore:Git Ignore"
|
在 ~/.zshrc 中添加别名:
1
| alias cat="bat --paging=never"
|
常用选项
| 选项 |
说明 |
--theme=NAME |
设置主题(bat --list-themes 查看) |
--style=COMPONENTS |
显示组件:numbers, changes, header, grid |
-p / --plain |
纯文本输出,不显示装饰 |
-l LANG |
指定语言高亮 |
--paging=never |
不使用分页器 |
-r N:M |
只显示第 N 到 M 行 |
--diff |
只显示 Git 修改的行 |
使用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| bat nginx.conf
bat -r 20:40 main.go
bat --diff src/app.ts
curl -s https://api.example.com/data | bat -l json
bat --list-themes | head -20
|
3. fd — 更简单的 find
fd 是 find 的替代品,语法更直观,默认忽略 .gitignore 中的文件,速度更快。
推荐配置
创建配置文件 ~/.config/fd/ignore,添加额外的忽略规则:
1 2 3 4 5
| node_modules .git target dist build
|
在 ~/.zshrc 中添加别名:
常用选项
| 选项 |
说明 |
-e EXT |
按扩展名过滤 |
-t f / -t d |
只找文件 / 只找目录 |
-H |
搜索隐藏文件 |
-I |
不忽略 .gitignore |
-d N |
限制搜索深度 |
-x CMD |
对每个结果执行命令 |
-X CMD |
对所有结果批量执行命令 |
-E PATTERN |
排除匹配的路径 |
使用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| fd -e go
fd test
fd --changed-within 1d
fd Dockerfile -x bat {}
fd -t f -S +10m
|
4. ripgrep (rg) — 极速文本搜索
ripgrep 是 grep 的替代品,速度极快,默认递归搜索且遵守 .gitignore。
推荐配置
创建配置文件 ~/.config/ripgrep/config,并设置环境变量:
1 2
| export RIPGREP_CONFIG_PATH="$HOME/.config/ripgrep/config"
|
1 2 3 4 5 6
| # ~/.config/ripgrep/config --smart-case --hidden --glob=!.git --max-columns=200 --max-columns-preview
|
常用选项
| 选项 |
说明 |
-i |
忽略大小写 |
-S / --smart-case |
智能大小写(有大写则精确匹配) |
-w |
全词匹配 |
-t TYPE |
指定文件类型(如 -t py) |
-g GLOB |
用 glob 过滤文件 |
-l |
只显示匹配的文件名 |
-c |
显示每个文件的匹配数 |
-C N |
显示上下文行数 |
--json |
输出 JSON 格式 |
使用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| rg TODO
rg "func\s+handleRequest"
rg "import.*React" -t tsx -t jsx
rg -c "fmt.Println" -t go
rg -l "oldFunc" | xargs sed -i '' 's/oldFunc/newFunc/g'
|
5. fzf — 模糊搜索粘合剂
fzf 是一个通用的模糊查找器,可以和几乎任何命令组合,充当交互式过滤器。
推荐配置
在 ~/.zshrc 中添加:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| export FZF_DEFAULT_OPTS=" --height=60% --layout=reverse --border=rounded --prompt='❯ ' --pointer='▶' --marker='✓' --preview-window=right:60%:wrap "
export FZF_DEFAULT_COMMAND="fd --type f --hidden --exclude .git"
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" export FZF_CTRL_T_OPTS="--preview 'bat --color=always --style=numbers --line-range=:500 {}'"
export FZF_ALT_C_COMMAND="fd --type d --hidden --exclude .git" export FZF_ALT_C_OPTS="--preview 'eza --tree --level=2 --icons {}'"
source <(fzf --zsh)
|
常用选项
| 选项 |
说明 |
--height=N% |
占用终端高度比例 |
--layout=reverse |
从顶部开始显示 |
--preview=CMD |
右侧预览窗口 |
--multi / -m |
允许多选(Tab 选中) |
--query=STR |
初始搜索关键词 |
--filter=STR |
非交互式过滤 |
--bind=KEY:ACTION |
自定义键绑定 |
使用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| vim $(fzf)
git branch -a | fzf | xargs git checkout
ps aux | fzf | awk '{print $2}' | xargs kill
history | fzf --tac | awk '{$1=""; print $0}' | bash
fd -t f | fzf -m | xargs rm
|
6. zoxide — 智能 cd
zoxide 记录你访问过的目录,让你用部分路径名就能跳转到目标目录。
推荐配置
在 ~/.zshrc 中添加:
1 2 3 4
| eval "$(zoxide init zsh)"
alias cd="z"
|
常用命令
| 命令 |
说明 |
z keyword |
跳转到匹配的最高权重目录 |
z keyword1 keyword2 |
多关键词缩小范围 |
zi |
交互式选择(需要 fzf) |
zoxide query keyword |
查看匹配结果但不跳转 |
zoxide edit |
编辑数据库 |
使用示例
1 2 3 4 5 6 7 8 9 10 11
| z myproject
z repo frontend
zi
zoxide query blog --list
|
7. atuin — Shell 历史数据库
atuin 将 shell 历史存储在 SQLite 数据库中,支持全文搜索、跨会话同步和统计分析。
推荐配置
配置文件路径:~/.config/atuin/config.toml
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [settings]
search_mode = "fuzzy"
filter_mode = "global"
style = "compact"
inline_height = 20
exit_filter = "success"
|
在 ~/.zshrc 中添加:
1
| eval "$(atuin init zsh)"
|
常用选项
| 命令 / 快捷键 |
说明 |
Ctrl+R |
交互式搜索历史 |
atuin search keyword |
搜索历史命令 |
atuin stats |
显示命令使用统计 |
atuin history list |
列出历史记录 |
atuin import auto |
从现有 shell 历史导入 |
使用示例
1 2 3 4 5 6 7 8 9 10 11
| atuin search docker
atuin stats
atuin search --cwd ~/project docker
atuin import auto
|
8. starship — 美化命令提示符
starship 是一个极快的、可定制的跨 shell 提示符,自动显示 Git 状态、语言版本、执行时间等信息。
推荐配置
配置文件路径:~/.config/starship.toml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| format = """ $directory\ $git_branch\ $git_status\ $nodejs\ $python\ $golang\ $java\ $rust\ $docker_context\ $cmd_duration\ $line_break\ $character"""
[character] success_symbol = "[❯](bold green)" error_symbol = "[❯](bold red)"
[directory] truncation_length = 3 truncate_to_repo = true style = "bold cyan"
[git_branch] format = "[$symbol$branch]($style) " symbol = " "
[git_status] format = '([\[$all_status$ahead_behind\]]($style) )'
[cmd_duration] min_time = 2_000 format = "[$duration]($style) "
[nodejs] format = "[$symbol($version)]($style) " symbol = " "
[python] format = "[$symbol($version)]($style) " symbol = " "
[golang] format = "[$symbol($version)]($style) " symbol = " "
[java] format = "[$symbol($version)]($style) " symbol = " "
|
在 ~/.zshrc 中添加:
1
| eval "$(starship init zsh)"
|
常用配置项
| 模块 |
说明 |
[directory] |
当前路径显示 |
[git_branch] |
Git 分支名 |
[git_status] |
Git 状态(修改、暂存等) |
[cmd_duration] |
命令执行时间 |
[nodejs] / [python] / [golang] |
语言版本 |
[docker_context] |
Docker 上下文 |
[character] |
提示符字符 |
使用示例
1 2 3 4 5 6 7 8 9 10 11
| starship preset gruvbox-rainbow -o ~/.config/starship.toml
starship module --list
starship timings
starship explain
|
9. mise — 开发工具版本管理
mise(前身为 rtx)管理 Node.js、Python、Go、Java 等开发工具的多版本,兼容 .tool-versions 和 .node-version 等格式。
推荐配置
在 ~/.zshrc 中添加:
1
| eval "$(mise activate zsh)"
|
全局配置文件:~/.config/mise/config.toml
1 2 3 4 5 6 7 8
| [tools] node = "lts" python = "3.12" golang = "1.22" java = "21"
[settings] experimental = true
|
常用命令
| 命令 |
说明 |
mise use node@20 |
在当前目录设置 Node.js 版本 |
mise use -g node@lts |
设置全局默认版本 |
mise install |
安装当前配置所需的所有工具 |
mise ls |
列出已安装的工具和版本 |
mise ls-remote node |
查看可安装的远程版本 |
mise current |
显示当前激活的版本 |
mise prune |
清理未使用的版本 |
使用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| cd ~/project mise use node@20.11.0
mise current
mise use python@3.11 python@3.12 mise use python@3.12
mise exec node@18 -- node -e "console.log(process.version)"
mise prune
|
组合技
单独使用这些工具已经很好,组合起来才是真正的效率飞跃。
1. fd + fzf + bat — 模糊搜索文件并预览
1 2
| fd --type f | fzf --preview "bat --color=always --style=numbers {}" | xargs vim
|
用途:在大型项目中快速定位并打开文件。
2. rg + fzf + bat — 交互式代码搜索
1 2 3 4 5 6
| rg --line-number --color=always "" | fzf --ansi --delimiter=: \ --preview "bat --color=always --highlight-line {2} {1}" \ --preview-window=right:60%:+{2}-10 | awk -F: '{print "+"$2, $1}' | xargs vim
|
用途:在项目中搜索代码片段,预览上下文后直接跳转到对应行编辑。
3. fd + rg — 精确范围搜索
1 2 3 4 5
| fd -e go | xargs rg "if err != nil"
fd --changed-within 2d | xargs rg "TODO"
|
用途:先缩小文件范围,再精确搜索内容。
4. zoxide + fzf — 交互式目录跳转
用途:当你记不清完整路径时,交互式浏览并跳转到历史目录。
5. eza + fzf + bat — 浏览目录并预览文件
1 2
| eza --icons -1 | fzf --preview "bat --color=always {} 2>/dev/null || eza --tree --level=2 --icons {}"
|
用途:在当前目录中快速浏览,文件显示内容预览,目录显示结构预览。
6. mise + starship — 版本信息自动显示
只要在项目目录中配置了 .mise.toml 或 .tool-versions,mise 会自动激活对应版本,starship 会在提示符中实时显示当前语言版本。无需额外配置,开箱即用。
1
| ~/code/my-project (main) v20.11.0 v3.12.0 ❯
|
最佳实践
1. Nerd Font 是基础
eza 的图标和 starship 的符号都依赖 Nerd Font。推荐 JetBrainsMono Nerd Font,等宽且图标覆盖完整。安装后务必在终端 app(iTerm2 / Terminal / Warp)中切换字体。
2. Shell 初始化顺序
~/.zshrc 中各工具的初始化顺序会影响功能。推荐顺序:
1 2 3 4 5
| eval "$(mise activate zsh)" eval "$(zoxide init zsh)" eval "$(starship init zsh)" eval "$(atuin init zsh)" source <(fzf --zsh)
|
3. 渐进式采纳
不要一口气替换所有命令。建议先用独立别名熟悉,确认顺手后再覆盖原命令:
1 2 3 4 5 6 7 8 9
| alias ll="eza -alh --icons --git" alias rgl="rg -l"
alias ls="eza --icons --group-directories-first" alias cat="bat --paging=never" alias find="fd" alias cd="z"
|
4. 配置文件纳入版本管理
将 dotfiles 用 Git 管理,方便在多台机器间同步:
1 2 3 4 5 6
| ~/.zshrc ~/.config/starship.toml ~/.config/atuin/config.toml ~/.config/bat/config ~/.config/mise/config.toml
|
5. 性能注意事项
starship 的模块按需加载,不用的模块设为 disabled = true 可加速提示符渲染
eza --git 在超大仓库中可能较慢,可按需使用
fzf 的 --preview 对大文件可能卡顿,建议加 --line-range=:500 限制预览范围
atuin 的 sync 功能需要网络,离线环境可关闭
完整 .zshrc 配置
以下是可直接复制的完整配置块:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
eval "$(mise activate zsh)"
eval "$(zoxide init zsh)"
eval "$(starship init zsh)"
eval "$(atuin init zsh)"
source <(fzf --zsh)
export RIPGREP_CONFIG_PATH="$HOME/.config/ripgrep/config"
export FZF_DEFAULT_OPTS=" --height=60% --layout=reverse --border=rounded --prompt='❯ ' --pointer='▶' --marker='✓' --preview-window=right:60%:wrap " export FZF_DEFAULT_COMMAND="fd --type f --hidden --exclude .git" export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" export FZF_CTRL_T_OPTS="--preview 'bat --color=always --style=numbers --line-range=:500 {}'" export FZF_ALT_C_COMMAND="fd --type d --hidden --exclude .git" export FZF_ALT_C_OPTS="--preview 'eza --tree --level=2 --icons {}'"
alias ls="eza --icons --group-directories-first" alias ll="eza -alh --icons --group-directories-first --git" alias tree="eza --tree --icons --level=3" alias cat="bat --paging=never" alias find="fd" alias cd="z"
|