将 ripgrep 搜索结果通过管道传输到 vim 并在确切的搜索位置打开文件

pipe ripgrep search results to vim and open files at exact search location

rg -l "searched phrase" | xargs vim

用搜索的术语填充 vim,但我需要再次搜索它们,这次是在 vim 中。

如何将 ripgrep 搜索结果通过管道传输到 vim,以便搜索到的文件将在准确的搜索位置(行和列)打开?

您可以使用带有 -c 标志的命令打开 vim(参见 vim --help) 用那个很容易搜索:

rg -l "searched phrase" | xargs vim -c /searched phrase

但是那不会跳到确切的位置。然而,第二个 -c 将假定打开了第二个文件。以至于我们要链式跳转到后面搜索:

rg -l "searched phrase" | xargs vim -c /searched phrase/norm n

根据Filling the quickfix window from stdin?,您可以执行以下操作:

rg --vimgrep 'pat' | vim -q /dev/stdin

您需要提供 --vimgrep 才能将 ripgrep 的输出转换为 Vim 的正确格式。 -q 将文件读入 quickfix 列表。

或者

通过 :grep

从 Vim 内部进行搜索

将以下内容添加到您的 vimrc 文件中:

set grepprg=rg\ --vimgrep
set grepformat^=%f:%l:%c:%m

现在您可以执行 :grep 'pattern',它将填充快速修复列表。重做您的搜索就像 :grep 然后按一些 <up> 返回到您的相关 :grep.

一样简单

Quickfix 命令

  • :cnext/:cprevious 在快速修复列表中向前和向后导航快速修复
  • :cfirst/:clast 跳转到 quickfix 列表的开头和结尾
  • 使用:copen打开快速修复window。使用 <cr> 跳转到条目
  • 使用:cclose关闭快速修复window
  • 使用:cc显示当前错误。
  • :colder/:cnewer 跳转 older/newer quickfix 列表

我建议您为 :cnext:cprevious 创建映射。我个人使用 unimpaired.vim,它为 :cnext:cprevious 提供 ]q & [q 映射。

如果您希望 quickfix window 自动打开,请将以下内容放入您的 vimrc:

augroup autoquickfix
    autocmd!
    autocmd QuickFixCmdPost [^l]* cwindow
    autocmd QuickFixCmdPost    l* lwindow
augroup END

有个Vimcasts episode about this topic: Search multiple files with :vimgrep.

项目范围内的搜索和替换

如果您使用 :grep/:vimgrep 作为 project-wide search and replace 的方式,那么我建议您使用 :cdo/:cfdo(在 Vim7.4.980+).

:grep 'foo'
:cfdo %s/foo/bar/g|w

如需更多帮助,请参阅:

:h :grep
:h 'grepprg'
:h quickfix
:h :cnext
:h :copen
:h :ccl
:h :cc
:h :colder
:h :cdo
:h :cfdo