终端效率翻倍实战:fzf + zoxide + ripgrep + bat 组合拳,告别重复敲命令
前言:你的手指正在浪费生命
如果你每天要在终端里干这些事:
- 反复
cd一层层钻进深目录(cd ~/work/project-a/src/utils/helpers) - 按
↑翻半天历史命令,只为了找回 3 小时前敲过的那条 - 用
grep搜代码,却因为忽略规则、二进制文件、无高亮而气得跺脚 - 用
cat看文件,长文件刷屏到想砸键盘 - 用
ls看目录,没有 git 状态、没有层级,信息密度低得可怜
那么恭喜你,这篇文章就是为你写的。
我会介绍一套开箱即用的现代终端工具组合 :fzf(模糊查找)、zoxide(智能跳转)、ripgrep(极速搜索)、bat(优雅预览)、eza(现代 ls)、starship(轻量提示符)。它们可以独立使用,但组合起来威力最大------学会之后,你的终端操作速度至少翻一倍。
本文所有命令均在 bash / zsh 下验证,同时给出 Windows PowerShell 的对应方案。代码可以直接复制运行。
一、先安装这六件套
不同系统的安装方式(任选其一):
bash
# macOS
brew install fzf zoxide ripgrep bat eza starship
# Ubuntu / Debian
sudo apt install fzf ripgrep bat
# zoxide / eza / starship 用官方脚本(避免 apt 源版本过老)
curl -sS https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | bash
curl -sS https://eza.rocks/install.sh | bash
curl -sS https://starship.rs/install.sh | sh
# Windows(winget / scoop)
winget install junegunn.fzf zoxide ripgrep sharkdp.bat eza-community.eza starship
# 或 scoop 一条龙:
scoop install fzf zoxide ripgrep bat eza starship
安装后验证版本:
bash
fzf --version && zoxide --version && rg --version | head -1
bat --version && eza --version | head -1 && starship --version
注意:Ubuntu 的
bat包名是bat,但可执行文件叫batcat(避免与bacula的bat冲突)。装完做个软链:ln -s /usr/bin/batcat /usr/bin/bat。
二、fzf:终端里的模糊查找神器
fzf 是一个通用模糊查找器 :你输入几个字符,它实时过滤候选列表,支持预览窗口、多选、键盘操作(Ctrl-J/K 上下、Tab 多选、Enter 确认、Esc 取消)。
2.1 启用三个杀手级快捷键
把下面这行加进 ~/.bashrc 或 ~/.zshrc:
bash
# bash
eval "$(fzf --bash)"
# zsh
eval "$(fzf --zsh)"
之后你立刻获得三个能力:
| 快捷键 | 功能 | 示例 |
|---|---|---|
Ctrl-R |
模糊搜索历史命令 | 敲 docker + Ctrl-R,所有含 docker 的历史命令立刻过滤出来 |
Ctrl-T |
把当前目录下的文件/目录路径插入命令行 | 敲 vim 然后 Ctrl-T,选文件自动补全路径 |
Alt-C |
模糊搜索并跳转目录 | 在任意目录敲 Alt-C,输入关键字即可 cd 过去 |
2.2 让 fzf 更好用的核心配置
bash
export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border --preview-window=right:60%'
# 默认预览:用 bat 高亮显示候选文件内容
export FZF_DEFAULT_COMMAND='rg --files --hidden --follow -g "!{.git,node_modules,vendor,target,dist,build,.venv}"'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_CTRL_T_OPTS='--preview "bat --color=always --line-range=:100 {}"'
这里的关键点:
FZF_DEFAULT_COMMAND让Ctrl-T直接基于ripgrep的文件列表(忽略node_modules、.git等),速度碾压默认的find--preview让选中文件时右侧实时渲染内容预览,不用打开文件就知道里面是什么--layout=reverse让列表从底部向上展开,更符合阅读习惯
2.3 fzf 的进阶玩法
① 模糊搜索并打开文件(配合 vim):
bash
# 在 vim 里按 Ctrl-P 打开文件
vim -o "$(fzf --preview 'bat --color=always {}')"
② git 分支快速切换:
bash
git checkout "$(git branch -a | grep -v HEAD | fzf --preview 'git log --oneline --graph {} | head -20')"
③ 进程 kill:
bash
kill -9 "$(ps -ef | fzf --multi | awk '{print $2}')"
④ 多选批量操作(比如批量删除文件):
bash
fzf --multi | xargs rm -v
三、zoxide:从此告别 cd
zoxide 是一个智能目录跳转工具 ,核心是 z 命令。它用「frecency」算法(频率 + 新鲜度)记住你去过的目录:
bash
# 初始化(加入 shell 配置)
eval "$(zoxide init bash)" # zsh 用 zoxide init zsh
使用方式:
bash
z proj # 跳到最近访问的、名字含 proj 的目录(模糊匹配)
z proj-a src # 多关键字精确跳转:~/work/project-a/src
zi # 交互式选择(基于 fzf 的目录选择器)
z - # 回到上一个 z 跳转的目录
几个真实场景:
bash
# 场景:以前
cd ~/work/project-b/frontend/src/components
# 现在
z proj-b comp
数据存在哪? ~/.local/share/zoxide/db.zo(SQLite),可以用 zoxide query --list 查看所有记录、zoxide add ~/xxx 手动添加、zoxide remove ~/xxx 删除。
Windows PowerShell 用户:
powershell
# PowerShell 配置里加
zoxide init powershell | Invoke-Expression
# 然后用 z 命令即可;Set-Location 语义完全一致
避坑:
z只匹配「你去过」的目录。换新机器或目录被删后记录会失效,属正常现象。配合z -和zi使用体验最佳。
四、ripgrep + bat:搜索与阅读的黄金组合
4.1 ripgrep:现代 grep
rg 相比 grep 的优势:默认递归、默认忽略 .gitignore 中的文件、默认隐藏文件不搜、自动跳过二进制文件、并行执行、输出带颜色。
常用姿势:
bash
rg "TODO" # 全项目搜 TODO
rg -n "login" src/ # 带行号
rg -i "user_id" --type py # 忽略大小写 + 限定 Python 文件
rg -l "error" --glob "*.js" # 只输出文件名
rg -uu "password" # 连被忽略的文件也搜(-uu = 无视 .gitignore)
rg --stats "panic" # 搜完显示统计信息
搜索时同时显示上下文:
bash
rg -C 3 "func main" # 前后各 3 行
rg -A 5 "TODO" # 只看后面 5 行
把 rg 和 fzf 联动------全项目文件内容搜索:
bash
# 搜索所有包含关键字的文件,再在结果里模糊筛选
rg -l "rate_limit" . | fzf --preview 'bat --color=always --line-range=:80 {}'
这是我最常用的一条命令:先粗搜再细筛,比任何 IDE 的全局搜索都快。
4.2 bat:带高亮和行号的 cat
bat 是 cat 的现代替代品:语法高亮、行号、git 变更标记、分页显示。
bash
bat package.json # 自动识别 JSON 语法
bat -l python script.py # 强制指定语言
bat --line-range 10:40 server.js # 只看第 10-40 行
bat --theme="Monokai Extended" app.ts # 换主题
一个特别有用的场景------结合 git diff:
bash
# 用 bat 渲染 git diff(--diff 会隐藏未变更行,聚焦增删)
git diff | bat --diff
Windows PowerShell 提示: bat 在 PS 里默认使用 $env:BAT_THEME,建议设为 ansi 以兼容 PowerShell 的颜色模式。
五、eza:现代版 ls
eza(原 exa)是 ls 的增强版:彩色输出、文件类型图标、git 状态、树形结构。
bash
eza -l --git # 详细列表 + git 状态列
eza -la --icons # 显示图标
eza --tree --level=2 # 树形目录结构(神器)
eza -s modified # 按修改时间排序
配置别名(加入 shell 配置):
bash
alias ls="eza --icons"
alias ll="eza -la --git --icons"
alias lt="eza --tree --level=2 --icons"
对比一下:ls -la 输出一行行枯燥信息;eza -la --git 直接告诉你哪个文件被改动过、是新增还是修改,配合 --tree 看项目结构一目了然。
注意:eza 的图标渲染依赖终端字体支持 Nerd Font。Windows Terminal / VS Code 终端装一个 Nerd Font 即可。
六、starship:轻量且信息密度高的提示符
starship 是一个跨 shell 的提示符工具,特点:快(Rust 写的)、配置简单(TOML)、开箱即用。
bash
# 初始化
starship init bash | source # 或 zsh / fish / powershell
装上后你会立刻看到:git 分支、修改状态、Node/Python/Rust 版本、上条命令耗时......全部自动显示。
定制示例(~/.config/starship.toml):
toml
# 关闭默认的多余换行,节省空间
add_newline = false
# 显示命令耗时(超过 2 秒标红)
[cmd_duration]
min_time = 2000
style = "red bold"
# 目录只显示最后两级,避免路径过长
[directory]
truncation_length = 2
# git 分支加上图标
[git_branch]
symbol = " "
# 自定义一个"注意"提示段
[custom.warning]
command = "test -f .env && echo '⚠️ .env present'"
when = "true"
为什么要用它? 默认 bash 提示符只有 user@host:~$,信息量为零;starship 把「你在哪个分支、环境是否就绪、上条命令多久」都直接摆在你眼前,减少不必要的 git status 和 pwd 次数。
七、组合实战:三个真实场景
场景一:快速定位并修复 bug
bash
# 1. 模糊搜索包含报错关键字的文件
rg -l "TypeError.*undefined" src/ | fzf --preview 'bat --color=always {}'
# 2. 选中后直接 vim 打开
vim "$(!!)" # 或:vim "$(rg -l 'TypeError' src/ | fzf)"
场景二:多项目之间快速切换
bash
# 1. 用 z 跳转(记得先去过的目录)
z my-service
# 2. 在项目内用 eza 树形看结构
lt
# 3. 用 rg 找入口文件
rg -l "createServer|app.listen"
场景三:日志排查
bash
# 实时看日志 + 关键字过滤 + 高亮
tail -f app.log | rg --line-buffered "ERROR|WARN" | bat -l log
# 先看最近 200 行里的错误,再用 fzf 交互筛选
tail -200 app.log | fzf --preview 'echo {} | bat -l log'
rg --line-buffered必须加:否则管道中的 rg 会缓冲输出,实时日志看不到效果。
八、避坑清单
- 不要一次性全换 :先从
fzf+zoxide开始,用一周形成肌肉记忆,再加rg/bat/eza。一次引入太多工具会手忙脚乱。 - 保留原命令 :
zoxide init默认保留cd;alias ls="eza"也别删掉原始ls,脚本兼容性靠它。需要原版时用\ls或command ls。 - fzf 在旧版 bash(< 4.0)不支持 :macOS 自带的 bash 3.2 需要
brew install bash升级,或改用 zsh。 - Windows 用户注意 PowerShell 版本 :
zoxide init powershell需要 PowerShell 5.1+;Alt-C在 PSReadLine 里需要手动绑定:
powershell
# PowerShell $PROFILE 里给 fzf 补快捷键
Set-PSReadLineKeyHandler -Key Ctrl+t -ScriptBlock { fzf | ForEach-Object { Set-Location $_ } }
Set-PSReadLineKeyHandler -Key Ctrl+r -Function HistorySearchBackward
- eza 图标不显示:99% 是终端字体问题,装 Nerd Font 后重启终端。
- rg 搜不到文件先查 .gitignore :
rg -uu能搜到说明是忽略规则的问题;别怀疑 rg 坏了。
九、效率清单(直接抄)
bash
# ~/.bashrc 或 ~/.zshrc 追加:
eval "$(fzf --bash)" # fzf 快捷键
eval "$(zoxide init bash)" # z 跳转
export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --preview-window=right:60%'
export FZF_DEFAULT_COMMAND='rg --files --hidden -g "!{.git,node_modules,vendor,target,dist,build,.venv}"'
export FZF_CTRL_T_OPTS='--preview "bat --color=always --line-range=:100 {}"'
alias ls="eza --icons"
alias ll="eza -la --git --icons"
alias lt="eza --tree --level=2 --icons"
加完执行 source ~/.bashrc,然后体验一下:
- 按
Ctrl-R搜一条历史命令 → 爽 - 敲
z+ 项目名 → 秒跳 → 爽 rg搜代码 +bat高亮 → 爽lt看项目结构 → 爽
结语
工具的价值不在于"高级",而在于减少你与目标之间的按键次数。这套组合拳的核心思路:
fzf消灭"翻找"(历史、文件、目录、进程)zoxide消灭"cd 路径记忆"rg + bat消灭"低效搜索和阅读"eza消灭"信息量不足的 ls"starship消灭"无信息的提示符"
不需要一次全学会,先装 fzf 和 zoxide,用起来,一周后再加下一个。效率提升 50% 只需要 10 分钟配置,剩下的交给肌肉记忆。
如果你有更骚的终端技巧,欢迎在评论区分享,互相抄作业 🤝