将ripgrep搜索结果传递到vim并在确切的搜索位置打开文件

时间:2019-03-22 15:57:10

标签: vim ripgrep

rg -l "searched phrase" | xargs vim

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

或者

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

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

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

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

Quickfix命令

  • :cnext / :cprevious在快速修复列表中前后浏览快速修复
  • :cfirst / :clast跳转到快速修复列表的开头和结尾
  • 使用:copen打开quickfix窗口。使用<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

有一个Vimcasts主题集,Search multiple files with :vimgrep

项目范围内的搜索和替换

如果您使用:grep / :vimgrepproject-wide search and replace的方式,那么我建议您使用: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

答案 1 :(得分:0)

您可以使用带有-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