如何安装 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。

安装brew · apt · 脚本
绑定Ctrl+R · T · Alt+C
对照fzf vs Ctrl+R
安装 fzfkey bindings历史 vs Ctrl+R

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 安装

  1. 1
    macOS(Homebrew)

    brew install fzf。二进制在 PATH;快捷键需额外一步(见下一节)。

  2. 2
    Debian / Ubuntu

    sudo apt update && sudo apt install fzf。部分发行版包较旧,可改用 Git 克隆 + install 脚本(官方 README)。

  3. 3
    Fedora / Arch

    sudo dnf install fzf 或 sudo pacman -S fzf。

  4. 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+Rfzf 绑定的 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 为主。

命令行理清后,对齐架构图

服务边界适合摊在同一张白板上。见 如何创建空间。

即刻开会