发布于 2026-01-05 2 阅读
0

如何使用 FZF.vim 在 Vim 中更快地搜索 设置 FZF 语法 查找文件 在文件中查找 其他搜索 用 rg 替换 grep 在多个文件中搜索和替换 总结 资源

如何使用 FZF.vim 在 Vim 中更快地搜索

设置

FZF 语法

查找文件

在文件中查找

其他搜索

用以下方式替换 greprg

在多个文件中查找和替换

结论

资源

关注@learnvim获取更多 Vim 使用技巧!

现代文本编辑器/IDE 比 Vim 做得更好的一点是,它们能更轻松地查找文件以及在文件中查找内容。在本文中,我将向您展示如何使用FZF.vim让 Vim 的搜索功能像现代编辑器/IDE 一样便捷。

以下是我将要讲解的内容:

警告:使用FZF时,请务必系好安全带,因为它速度可能非常快。🚗 🔥 🔥

设置

开始之前,我们需要下载FZFripgrep。请按照其 GitHub 仓库中的说明进行操作。如果您已安装 FZF和 ripgrep homebrew,则可以运行 `fzf -m ripgrep`brew install fzf和 `fzf -m ripgrep` 命令。现在,`fzf -m ripgrep`和 `fzf brew install ripgrep-m ripgrep` 命令应该可以使用了。fzfrg

在我的系统中.zshrc.bashrc如果你使用 bash),我有以下配置:



if type rg &> /dev/null; then
  export FZF_DEFAULT_COMMAND='rg --files'
  export FZF_DEFAULT_OPTS='-m --height 50% --border'
fi


Enter fullscreen mode Exit fullscreen mode

FZF 默认情况下不使用 ripgrep,因此我们需要通过FZF_DEFAULT_COMMAND变量告诉 FZF 使用 ripgrep。

请注意-m`in`FZF_DEFAULT_OPTS选项。此选项允许我们进行多项选择(使用 `--selected`Tab或 `--replace` Shift-Tab)。您不必使用它,但我认为能够选择多个文件很有用。当您需要在多个文件中执行查找和替换操作时,它将非常方便——我稍后会详细介绍。其余选项是可选的。要了解更多信息,请查看fzf 的仓库或[此处应插入链接man fzf]。

我们至少应该有export FZF_DEFAULT_COMMAND='rg'

fzf安装完成rg,我们来设置 Vim。本例中我使用的是vim-plug插件管理器,但您可以使用任何其他插件管理器。

要在 Vim 中设置 FZF,请将以下代码添加到您的.vimrc插件列表中。我们将使用FZF.vim插件(由 FZF 作者创建)。第二行代码确保我们使用的是最新版本的 FZF。



Plug 'junegunn/fzf.vim'
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }


Enter fullscreen mode Exit fullscreen mode

更多信息,您可以查看FZF.vim 仓库中的 README 页面

FZF 语法

我们来复习一下语法,这样才能更高效地搜索。幸运的是,需要学习的语法并不多。

  • ^是前缀精确匹配。要搜索以“welcome”开头的短语,我们这样做^welcome

  • $是后缀精确匹配。要搜索以“my friends”结尾的短语,我们这样做friends$

  • '是完全匹配。要搜索短语“欢迎我的朋友们”,我们这样做'welcome my friends

  • |是“或”匹配。要搜索“朋友”或“敌人”,我们可以使用friends | foes

  • !这是一个反向匹配。要搜索包含“welcome”但不包含“friends”的短语,我们可以使用welcome !friends

我们可以对以上方法进行组合使用。例如,^hello | ^welcome friends$搜索以“welcome”或“hello”开头,以“friends”结尾的短语。

查找文件

要在 Vim 中使用 FZF.vim 插件搜索文件,我们可以使用:Files以下方法。:Files在 Vim 中运行该方法,就会弹出 FZF 搜索提示符。非常方便!

文件

FZF.vim 文件查找器最好配合映射使用。我过去曾使用过,目前我将其映射<Leader>fCtrl-pCtrl-f



nnoremap <silent> <C-f> :Files<CR>


Enter fullscreen mode Exit fullscreen mode

在文件中查找

要在文件内部搜索,我们可以使用 FZF.vim 的:Rg命令。或者,我们也可以使用:AgSilver Searcher 。本文将使用Silver Searcher:Rg

Rg

我的映射到<Leader>f



nnoremap <silent> <Leader>f :Rg<CR>


Enter fullscreen mode Exit fullscreen mode

附注:FZF.vim:Rg选项除了搜索短语外,还会搜索文件名。如果您认为这是一个问题,请查看此评论。我已将其添加到我的.vimrc



command! -bang -nargs=* Rg call fzf#vim#grep("rg --column --line-number --no-heading --color=always --smart-case ".shellescape(<q-args>), 1, {'options': '--delimiter : --nth 4..'}, <bang>0)


Enter fullscreen mode Exit fullscreen mode

如此一来,每次我们调用RgFZF + ripgrep 时,Vim 都不会将文件名视为匹配项。

其他搜索

FZF.vim 还提供了许多其他搜索命令。您可以在这里查看

以下是我的 FZF 映射图:



" PLUGIN: FZF
nnoremap <silent> <Leader>b :Buffers<CR>
nnoremap <silent> <C-f> :Files<CR>
nnoremap <silent> <Leader>f :Rg<CR>
nnoremap <silent> <Leader>/ :BLines<CR>
nnoremap <silent> <Leader>' :Marks<CR>
nnoremap <silent> <Leader>g :Commits<CR>
nnoremap <silent> <Leader>H :Helptags<CR>
nnoremap <silent> <Leader>hh :History<CR>
nnoremap <silent> <Leader>h: :History:<CR>
nnoremap <silent> <Leader>h/ :History/<CR> 


Enter fullscreen mode Exit fullscreen mode

用以下方式替换 greprg

Vim 内部有两种文件搜索方式: `.`:vimgrep和 ` :grep.`。`.`:vimgrep使用 Vim 内置的 grep,`.`:grep使用外部工具,您可以使用 `.` 重新分配该外部工具'grepprg'

例如,如果我们想搜索“iggy” :grep,我们可以运行:grep "iggy" . -R(您可能会注意到 Vim 的:grep语法类似于终端grep命令;这是因为:grepVim 默认运行在基于 Unix 的机器上)。上面的命令将从当前位置递归地grep -n $* /dev/null搜索字符串"iggy"-R.

Vim 允许我们更改其使用的程序:grep。我们可以通过在 vimrc 文件中添加以下内容,告诉 Vim 使用 ripgrep 而不是 grep:



set grepprg=rg\ --vimgrep\ --smart-case\ --follow


Enter fullscreen mode Exit fullscreen mode

现在在 Vim 中运行:grep,它将改为运行rg --vimgrep --smart-case --follow。有关上述选项的更多信息,请查看man rg。我现在可以运行一个更简洁的命令,:grep "iggy"而不是:grep "iggy" . -R

Vim:grep命令使用 quickfix 来显示结果。这里就不详细讲解 quickfix 了,因为它超出了本文的范围。我们可以使用 `--show`:copen来显示 quickfix 窗口,也可以使用:cclose`--close` 来关闭 quickfix 窗口。试试看!

你可能会想,“嗯,这很好,但我从来没:grep在 Vim 里用过,而且我们不是可以直接用 ` :Rg?` 来查找文件中的字符串吗?我什么时候会需要用到它呢:grep?”

这是一个很好的问题。“为什么我们需要在 Vim 中使用 grep?”这个问题的答案是:它能让我们实现接下来我要讲的内容:在多个文件中进行搜索和替换。

在多个文件中查找和替换

像 VSCode 这样的现代文本编辑器让跨多个文件搜索和替换字符串变得非常容易。坦白说,一开始当我需要在多个文件中搜索/替换字符串时,我用的是 VSCode,因为虽然 Vim 也能做到,但太慢了……直到现在

我将向您展示两种不同的技巧,让您在 Vim 中轻松地跨多个文件进行搜索和替换。

第一种方法是替换项目中所有匹配的短语。我们需要使用:grep……假设你想把所有出现的“pizza”替换成“donut”。以下是具体操作:



:grep "pizza"
:cfdo %s/pizza/donut/g | update


Enter fullscreen mode Exit fullscreen mode

就这些?没错!就这些。让我来详细讲解一下步骤:

  1. :grep pizza使用 ripgrep 简洁地搜索所有“pizza”实例。顺便说一句,即使我们不将 ripgrep 重新分配给默认的 grep,这仍然有效。我们需要做的:grep "pizza" . -R是使用 ripgrep 而不是 grep :grep "pizza"
  2. 我们运行`quickfix`:cfdo是因为它使用了 `quickfix`。`quickfix`会执行我们传递的任何命令(在本例中,我们的命令是`$`),并作用于 `quickfix` 列表中的所有条目。要运行多个命令,我们可以使用管道符 `(`)` 将它们链接起来。我们执行的第一个命令是披萨甜甜圈替换:`$` 。第二个命令 ` $` 会在第一个命令执行完毕后保存每个文件。:grep:cfdo%s/pizza/donut/g|%s/pizza/donut/gupdate

我们来讨论第二种方法。

第二种方法是使用缓冲区进行搜索和替换,可以选择多个文件而不是所有文件。这样,我们可以选择要执行选择和替换操作的文件。

  1. 首先清空缓冲区(:Buffers)。缓冲区列表应该只包含必要的文件。我们可以使用%bd | e# | bd#(或重启 Vim)来清空它。
  2. 跑步:Files
  3. 选择所有要执行搜索和替换操作的文件。要选择多个文件,请使用Tab/ Shift+Tab。这仅在我们-mFZF_DEFAULT_OPTS.
  4. 跑步:bufdo %s/pizza/donut/g | update

我们的命令:bufdo %s/pizza/donut/g | update看起来与 类似:cfdo %s/pizza/donut/g | update。这是因为它们确实类似。我们不是对所有quickfix ( ) 条目执行替换,而是对所有buffer ( ) 条目cfdo执行替换bufdo

结论

FZF.vim 彻底改变了我的 Vim 使用体验。我简直无法想象没有它该如何使用 Vim。本文将介绍如何设置必要的工具和配置,以便在 Vim 中运行 FZF。我还分享了一些执行更复杂搜索(例如查找和替换)的技巧。

一切设置完毕后,我们现在就可以像在现代编辑器/IDE中一样在Vim中快速搜索了。

希望这对你有帮助。继续进步。继续探索。继续创新。

祝您编程愉快!

资源

友情提示:如果你喜欢这篇文章,那么有98.39%的概率(未经科学验证)你也会喜欢我的《Vim食谱:美食Vim》。快来看看吧!

文章来源:https://dev.to/igredible/how-to-search-faster-in-vim-with-fzf-vim-36ko