搜索&在Vim中使用quickfix list替换

时间:2011-04-16 11:39:04

标签: search vim replace

到目前为止,我总是使用EasyGrep替换多个文件中的文本。不幸的是,当项目变大时,它会很慢。有一点看起来非常快的是ggrep of fugitive.vim只搜索我的版本控制文件。所有结果也存储在quickfix列表中。

如何使用Ggrep的结果对所有找到的文件进行简单替换?是否可以在quickfix列表中的所有文件上使用%s/foo/bar/cg或者有更好的方法吗?

6 个答案:

答案 0 :(得分:64)

<强>更新 Vim现在有cdo,请参阅Sid's answer

原始答案:

Vim有bufdowindotabdoargdo,可让您在参数列表中的所有打开的缓冲区,窗口或文件中执行相同的命令。我们真正需要的是类似quickfixdo的东西,它会在quickfix列表中的每个文件上调用一个命令。遗憾的是,Vim缺少这种功能,但here's a solution Al提供了一个家庭推出的解决方案。使用它,可以运行:

:QFDo %s/foo/bar/gc

这将在quickfix列表中的所有文件上运行foo / bar替换。

bufdowindotabdoargdo命令有一些共同的行为。例如,如果无法放弃当前文件,则所有这些命令都将失败。我不确定上面引用的QFDo命令是否遵循相同的约定。

我已经改编Al's solution来创建一个名为Qargs的命令。运行此命令会使用quickfix列表中列出的所有文件填充参数列表:

command! -nargs=0 -bar Qargs execute 'args ' . QuickfixFilenames()
function! QuickfixFilenames()
  " Building a hash ensures we get each buffer only once
  let buffer_numbers = {}
  for quickfix_item in getqflist()
    let buffer_numbers[quickfix_item['bufnr']] = bufname(quickfix_item['bufnr'])
  endfor
  return join(values(buffer_numbers))
endfunction

使用此功能,您可以按照以下步骤进行项目范围的搜索并替换:

:Ggrep findme
:Qargs
:argdo %s/findme/replacement/gc
:argdo update

编辑:(给Peter Rincker提示帽子)

或者您可以将最后3个命令一起加入一行:

:Ggrep findme
:Qargs | argdo %s/findme/replacement/gc | update

答案 1 :(得分:30)

现在已添加

cdo命令! grep之后,您可以使用cdo对quickfix列表中的每个术语执行给定命令:

cdo %s/<search term>/<replace term>/cg

(请查看此git commit和此vim developers google group discussion,了解有关cdo的更多信息以及添加动机背后的动机。)

答案 2 :(得分:14)

nelstrom的答案非常全面,反映了他对vimdom的杰出贡献。它也有点超出了这里严格要求的范围;可以省略quickfix步骤,以支持使用shell命令的结果填充args:

:args `git grep -l findme`
:argdo %s/findme/replacement/gc
:argdo update

应该就是您所需要的一切。

编辑:正如Domon所说,如果尚未设置隐藏必须先设置!

答案 3 :(得分:3)

外部grep

(使用grepprg,像makeprg / errorformat中的grepformat;如果grepprg =='internal'这与内部grep相同)

:grep fopen *.c
:copen
:cnext

内部grep

:vimgrep /\<myVimregexp\>/ **/*.c
:copen
:cnext

位置列表内部grep

:lvimgrep /\<myVimregexp\>/ **/*.c
:lopen
:lnext

Bonus:为加载的缓冲区执行外部grep:

:silent bufdo grepadd fstream %
:copen
:cnext

所有参数的外部:

:silent argdo grepadd fstream %
:copen
:cnext

答案 4 :(得分:3)

使用quickfix-reflector.vim,您可以在quickfix窗口中编辑搜索结果。然后write命令会将更改保存到您的文件中。

:copen
:%s/foo/bar/cg
:write

答案 5 :(得分:1)

有一个补丁可以将cdo(Quickfix do)命令添加到vim,但尚未提取(截至2015-03-25):

https://groups.google.com/forum/#!topic/vim_dev/dfyt-G6SMec

你可能想自己修补vim以获得这个补丁:

brew install hg # install mercurial, e.g. with homebrew
hg clone https://vim.googlecode.com/hg/ vim
cd vim
# copy/download patch to . folder
patch -b -p1 < cdo.diff
./configure
make && make install
相关问题