8
rg -l "searched phrase" | xargs vim

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

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

4

2 回答 2

16

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

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

您需要提供--vimgrep以将 ripgrep 的输出转换为 Vim 的正确格式。-q将文件读入快速修复列表。

或者

通过在 Vim 内部进行搜索:grep

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

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

现在您可以执行此操作:grep 'pattern',它将填充快速修复列表。重做您的搜索很容易,只需:grep按几<up>下即可返回您的相关:grep.

快速修复命令

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

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

如果您希望快速修复窗口自动打开,请将以下内容放入您的vimrc:

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

有一个关于这个主题的Vimcast插曲:使用 :vimgrep 搜索多个文件

项目范围的搜索和替换

如果您使用:grep/:vimgrep作为进行项目范围搜索和替换的方式,那么我建议您使用:cdo/ :cfdo(在 Vim 7.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
于 2019-03-22T17:46:35.480 回答
1

您可以使用带有-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
于 2019-03-22T17:09:01.917 回答