如何安裝 fzf 模糊查找器:快捷鍵綁定、歷史搜尋與 Ctrl+R 對照
安裝 fzf、啟用 shell 快捷鍵,分清 fzf 歷史與裸 Ctrl+R。
終端機里反复按 Ctrl+R 只能线性翻历史,文件名用 Tab 补全又看不懂预览。fzf(Junegunn / Go)把任意列表变成可模糊过滤的全屏选择器;装好官方 key bindings 后,Ctrl+R 会变成带即时搜索的历史面板,Ctrl+T 选文件、Alt+C 换目录。本教學讲 安裝 fzf、启用 shell 快捷鍵、以及 fzf 历史搜索与裸 Ctrl+R 的差别,面向与 hereink 同栈的 fd、rg、bat 用户;不是 ripgrep 搜索教學。
檢索詞是如何安裝 fzf 模糊查找器并配置快捷鍵对比 Ctrl+R 搜历史。读完应能在 macOS/Linux 安裝 fzf、跑完 install 脚本綁定按键、用 FZF_DEFAULT_OPTS 微调,并知道何时仍用 bash 自带 reverse-search。
fzf 解决什么问题
模糊过滤,而不是死记前缀
输入 deploy nginx 可以匹配 ./scripts/deploy-staging-nginx.sh。管道里 fd | fzf、git branch | fzf 是同一套交互。
与 fd、rg 分工
fd 圈路径、rg 搜内容、fzf 在结果里挑一条。例:rg -l TODO | fzf --preview 'bat {}'(需已装 bat)。
上游:
github.com/junegunn/fzf。安裝后运行fzf --version确认。
在 macOS 与 Linux 安裝
- 1macOS(Homebrew)
brew install fzf。二进制在 PATH;快捷鍵需额外一步(见下一节)。 - 2Debian / Ubuntu
sudo apt update && sudo apt install fzf。部分发行版包较旧,可改用 Git 克隆 +install脚本(官方 README)。 - 3Fedora / Arch
sudo dnf install fzf或sudo pacman -S fzf。 - 4第一条交互
在任意目录:
ls | fzf。输入过滤、Enter 选中一行输出到 stdout;Esc 取消。无匹配时仍可按 Enter 提交空或当前高亮(取决于选项)。
启用 shell key bindings
Homebrew 安裝后运行官方脚本(路径随版本略有不同,常见为):
# Homebrew fzf — 交互式安裝 key bindings + 补全
"$(brew --prefix)/opt/fzf/install"
# 或全默认 yes(适合 dotfiles 自动化,先读懂选项)
"$(brew --prefix)/opt/fzf/install" --all脚本会问是否启用 key bindings 与 completion。选 yes 后,在 ~/.bashrc 或 ~/.zshrc 末尾追加 source …/key-bindings.bash(或 .zsh 版)。重开終端機或 source ~/.zshrc。
默认快捷鍵(bash / zsh)
# 綁定后(官方 key-bindings 脚本)
Ctrl+R 命令历史(fzf 模糊搜 history)
Ctrl+T 在当前目录树里 fuzzy 选文件,插入命令行
Alt+C fuzzy 选目录并 cd(zsh/bash 下为 Alt;Terminal 需开启 Option 作 Meta)
# 仍可直接调用
fzf
history | fzf
git log --oneline | fzf在 macOS Terminal.app 里 Alt+C 不生效时,打开「将 Option 键用作 Meta 键」,或改用 iTerm2 / Alacritty 并把 Option 设为 Meta。
fzf 历史搜索 vs 裸 Ctrl+R
| 方面 | bash/zsh 自带 Ctrl+R | fzf 綁定的 Ctrl+R |
|---|---|---|
| 交互 | 线性 reverse-i-search,逐字匹配 | 全屏列表 + 模糊打分,可看到多条候选 |
| 过滤 | 子串顺序匹配为主 | 字符可不连续(fuzzy),如 gco main 命中 git checkout main |
| 预览 | 无 | 可用 FZF_CTRL_R_OPTS 加 --preview 看整行命令 |
| 多选 | 无 | 历史綁定通常单选;管道 fzf -m 可多选 |
| 依赖 | 内置 | 需安裝 fzf 且 source key-bindings |
| 脚本 / SSH 最小环境 | 始终可用 | 未装 fzf 时仍回退到 shell 默认(若未覆盖綁定) |
若只想临时用 fzf 筛历史、不覆盖 Ctrl+R,不要运行 install 的 binding 选项,改用手动:history | fzf 或 zsh 的 fc -l 1 | fzf 綁定到自定义键。
常用环境变量
# ~/.zshrc 或 ~/.bashrc(放在 source key-bindings 之后)
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'
export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border --info=inline'
export FZF_CTRL_T_OPTS='--preview "bat --color=always {} 2>/dev/null | head -200"'
export FZF_CTRL_R_OPTS='--preview "echo {}" --preview-window down:3:hidden:wrap --bind "?:toggle-preview"'
# 配色:fzf 会读 shell 主题;也可 --color=fg:…,bg:…FZF_DEFAULT_COMMAND 影响 Ctrl+T 的文件源。未装 fd 时可改为 find 或 git ls-files;详见站内 fd 安裝笔记。
- 适合
- 每天在历史、分支、进程列表里「找一条再执行」;已与 fd/rg/bat 组終端機栈的人。
- 不适合
- 不能装二进制的极简 SSH 跳板(保留默认 Ctrl+R);纯 POSIX sh 无 bash/zsh 高级綁定。
和站内 ripgrep 教學重复吗?
不重复。ripgrep 文讲仓库内容搜索;本篇讲 fzf 对列表的交互选择,可与 rg -l | fzf 组合,但不教 rg flags。
安裝后 Ctrl+R 没变化?
确认已 source key-bindings、当前 shell 是 bash/zsh、且没有另一个插件再次綁定 Ctrl+R。运行 type fzf 与 bindkey | grep fzf(zsh)排查。
能否只用 fzf 不覆盖 Ctrl+R?
可以。install 时拒绝 key bindings,或注释掉 source 行;把 history | fzf 绑到 Ctrl+H 等空闲键。
Windows 呢?
官方支持在 Git Bash / WSL 内使用;PowerShell 有社区端口,本稿步骤以 macOS/Linux bash/zsh 为主。
命令行理清后,对齐架构图
服务边界适合摊在同一张白板上。见 如何建立空間。