你已经安装了 `fzf`。接下来怎么办?(2023)
摘要
本文提供了一份实用指南,介绍如何最大限度地利用 `fzf` 模糊查找工具来提高生产力,展示了其与 shell 命令、`vi` 和 `ripgrep` 的集成,以实现高效的文件和命令搜索。
<p><a href="https://lobste.rs/s/b6fyzj/so_you_ve_installed_fzf_now_what_2023">评论</a></p>
查看缓存全文
缓存时间: 2026/05/10 16:53
# 所以你已经安装了 `fzf`。接下来呢?
- 首先试试 Ctrl+R... (https://andrew-quinn.me/fzf#first-try-ctrlr)
- ... 现在试试 Alt+C (https://andrew-quinn.me/fzf#-now-try-altc)
- 基础的 fzf 命令 (https://andrew-quinn.me/fzf#the-base-fzf-command)
- 但是试试 vi $(fzf),然后...!!! (https://andrew-quinn.me/fzf#but-try-vi-fzf-and)
- vi $(find . '/' | fzf):用于查找随机配置文件 (https://andrew-quinn.me/fzf#vi-find----fzf-for-finding-random-config-files)
- 更少的摩擦:vi ** (https://andrew-quinn.me/fzf#even-less-friction-vi-tab)
- mv $(fzf) $(fzf) - 真正的失忆时刻 (https://andrew-quinn.me/fzf#mv-fzf-fzf---real-amnesiac-hours)
- 介绍 rg:快速、默认递归的 grep (https://andrew-quinn.me/fzf#introducing-rg-fast-recursive-by-default-grep)
- rg . | fzf:对每个文件中的每一行进行模糊搜索 (https://andrew-quinn.me/fzf#rg---fzf-fuzzy-search-every-line-in-every-file)
- rg . | fzf | cut -d ":" -f 1:对每个文件中的每一行进行模糊搜索,并返回文件位置 (https://andrew-quinn.me/fzf#rg---fzf--cut--d---f-1-fuzzy-search-every-line-in-every-file-and-return-the-file-location)
- vim $(rg . | fzf | cut -d ":" -f 1):对每个文件中的每一行进行模糊搜索,并打开该文件 (https://andrew-quinn.me/fzf#vim-rg---fzf--cut--d---f-1-fuzzy-search-every-line-in-every-file-and-open-that-file)
软件工程师们,如果不说是独特的话,那么在创造工具以改善自己专业生活的便利性方面,可以说是相当*独特*的;然而,对于那些在不同工具之间不断穿梭而不投入时间去深入学习自己所用工具的人来说,这随着时间的推移可能会带来高昂的代价。作为一个对我认为比我更优秀的人的隐性知识(https://commoncog.com/how-to-learn-tacit-knowledge/)抱有健康尊重的人,我认为一个很好的 80/20 启发式方法是“先学习老家伙们”:像 `cat`、`ls`、`cd`、`grep` 和 `cut` 这样 venerable(受人尊敬的)Unix 工具。(如果你有幸身处一个真正的现代系统管理员角色中,还包括 `sed` 和 `awk`。)但有一些工具的回报如此即时,其价值主张如此独特,以至于 80/20 启发式方法对它们完全失效。`fzf` 就是其中之一。看到许多人下载它,在命令行上原样运行,然后只是摇头走开,说“我不明白”,这让我感到难过。在这里,我想改变这种情况。
假设你生活在一个大致标准的 Ubuntu 机器上。你刚刚使用标准安装脚本(https://github.com/junegunn/fzf#using-git)安装了 `fzf`——那么接下来呢?
## 首先试试 `Ctrl+R`...
在大多数终端中,无论是 Linux 还是 Windows,`Ctrl+R` 都会为你提供命令的*反向搜索*。之所以你像我一样,可能在已经在 shell 中折腾了*整整十年*之后才听说这个功能,是因为基础版本因为两个原因而有点糟糕:
- 你需要给出**完全匹配**才能得到你想记住的内容。
- 你只能得到**一个预览**,所以如果你甚至漏掉了一个字符,你就会陷入无休止的搜索。
`fzf` 是一个有点奇怪的程序,因为安装它(https://github.com/junegunn/fzf#using-git)实际上会覆盖一堆键盘快捷键,目的是让它们变得更好。通常情况下我会讨厌这一点。但是...
这比基线有了*显著*的改进。(请注意,通过像 `apt` 这样的包管理器安装 `fzf` **可能不会给你这个功能**!我不断暗示你应该使用安装脚本(https://github.com/junegunn/fzf#using-git),即使你和我都同意 `curl | bash` 是 Super Moloch 的作品!)
## ... 现在试试 `Alt+C`
假设你启动了一个空终端。你试图快速找到你新兴的 SaaS 副业仓库并 `cd` 到那里——但是几周前你就没再去过,你的全职工作异常有趣和吸引人……你如何找到它?
答案:使用 `fzf`。`fzf` 将 `Alt+C` 重写为一个增强的模糊 `cd` 快捷方式,当你只记得相关目录的模糊名称时,可以让你*非常*快速地跳转。
## 基础的 `fzf` 命令
好吧,我们已经解决了快捷键的问题。老实说,仅这两个家伙就提供了我从 `fzf` 中获得的大多数价值——但是让我们看看命令本身做了什么。
它模糊查找文件位置!至少是相对于你自己目录的位置。这……本身并不是特别有用。
### 但是试试 `vi $(fzf)`,然后...!!!
你得到了一个在编辑器中模糊打开的体验!(在这方面,`vi` 并没有什么特别之处,顺便说一句。你可以用 `emacs`、`nano`(https://ariadne.space/2021/08/13/gnu-nano-is-my-editor-of-choice/)、`code` 来调用它,无论你喜欢什么!)
## `vi $(find . '/' | fzf)`:用于查找随机配置文件
前几天我正试图结合 Firefox 扩展、`entr` 和 `nginx` 来实现婴儿的第一个实时重载。然后我发现自己在问:`nginx.conf` 到底在哪里?
我回顾了我的选项。我可以
1. 使用我对 FHS 的半记忆知识,通过 `trees` 和 `grep`s 进行猜测,或者
2. 仅仅知道并牢记于心,觉得自己比别人优越,或者
3. 只是将 `find . '/'` 管道到 `fzf` 并开始搜索。
我喜欢这段剪辑,因为它展示了使用 `fzf` 的一些细微权衡,以及一个更高级的搜索功能——搜索 `conf$` 将过滤掉任何不以 `conf` 结尾的行。注意当 `find` 遇到大量“Permission denied”错误时,`fzf` 暂时会失控——但几秒钟后它会恢复过来。为了能够以如此简单的方式找到配置文件,这几秒钟的额外时间是否值得?对我而言是值得一的。
## 更少的摩擦:`vi **`
*感谢 sigmonsays, Hacker News (https://news.ycombinator.com/item?id=35249935),提醒我注意这个功能!*
介于“覆盖键盘快捷键”和“原样使用 fzf”之间的是**使用两个星号进行模糊选项卡补全**。以下是使用它来做类似于上面 `vi $(fzf)` 的事情:
你*确实*需要在实际获得命令后再按一次 `Enter`,特此警告。我还没有养成经常使用这个的习惯,有几个原因。首先,它在某种程度上与我的*真实* home shell(https://fishshell.com/)不兼容,尽管在 bash 和 zsh 中它完全没问题。其次,我在家中唯一的实际用例是作为 `$(fzf)` 的替代品,我只是觉得显式调用男孩更容易记住。我想象这对于 tab-tab-star-headers 来说类似于看着我同事手动从终端复制粘贴而不是使用 `:read ! echo "Hello world!"`(https://knowyourmeme.com/photos/1196921-damn-bitch-you-live-like-this)。
## `mv $(fzf) $(fzf)` - 真正的失忆时刻
当你既不完全记得你要移动什么,也不记得你要移动到哪里,但你足够记得抽象概念的时间距离,知道它必须完成,并且对每个要转移的项目的性质有*极其具体*的记忆时。
我有点不好意思承认当我试图将 GIF 插入我的 Github READMEs(https://github.com/hiAndrewQuinn/finstem#interactive-mode)时,我有多频繁地使用这个。
## 介绍 `rg`:快速、默认递归的 `grep`
下面我说的一切*可以*用 `grep` 完成,但 `rg`(也称为 `ripgrep`)的默认递归性质是工具真正发挥效力的地方。我强烈建议你下载它并在下面的示例中使用它。但如果你担心工具太多,别担心!
## `rg . | fzf`:对每个文件中的每一行进行模糊搜索
现在我们进入了一些*真正*失忆的领域 >:3c。
## `rg . | fzf | cut -d ":" -f 1`:对每个文件中的每一行进行模糊搜索,并返回文件位置
## `vim $(rg . | fzf | cut -d ":" -f 1)`:对每个文件中的每一行进行模糊搜索,并打开该文件
相似文章
F* 文件系统——直接绕过操作系统内核读取SSD的文件搜索
一款名为 ffs 的 CLI 工具,通过直接读取磁盘来搜索文件,绕过操作系统内核的 VFS 层,在处理大型、未缓存目录时相比 ripgrep 等工具具有潜在的速度优势。支持 ext4、btrfs 和 APFS 文件系统。
重新掌控终端
这篇文章解释了像`less`和`fzf`这样的交互式程序如何在输入被管道化时保持键盘访问,详细描述了使用文件描述符和/dev/tty进行直接终端通信的方法。
>=PlayingFild
PlayingFild 是一款能理解上下文的效率工具和标签管理器,已在 ProductHunt 上线。
dmtrKovalenko/fff
fff 是一个快速、抗拼写错误的文件搜索工具包,采用 frecency 排序并配备面向 AI 代理的 MCP 服务器,提供高效的、具备 Git 感知的文件与内容搜索功能。
@rauchg: https://fx.sh 0.0.5 变得更小,适合放入2张软盘(xz压缩),明天发布,包含我们最受期待的功能…
发布fx v0.0.5,一个用Zig编写的微小开源编码代理,适合放入2张软盘,现在包含一个最受期待的功能,明天发布。