到目前为止,我总是使用EasyGrep替换多个文件中的文本。不幸的是,当项目变得更大时,它是相当缓慢。有一件事似乎是惊人的快速是Ggrep的fugitive.vim,只搜索我的版本控制文件。所有结果也存储在quickfix列表中。
如何使用Ggrep的结果做一个简单的替换所有这些找到的文件?是不是有可能使用%s / foo / bar / cg在quickfix列表中的所有文件或有什么更好的方法?
Vim具有
原文链接:/bash/389400.htmlbufdo
,windo
,tabdo
和
argdo
,它允许您在参数列表中所有打开的缓冲区,窗口或文件中执行相同的命令。我们真正需要的是quickfixdo,它会在quickfix列表中的每个文件上调用一个命令。遗憾的是,这种功能缺乏Vim,但
here’s a solution
Al提供了一个自制的解决方案。使用这个,可以运行:
:QFDo %s/foo/bar/gc
这将对quickfix列表中的所有文件运行foo / bar替换。
bufdo,windo,tabdo和argdo命令有一些常见的行为。例如,如果当前文件不能被放弃,则所有这些命令将失败。我不知道上面引用的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
编辑:(与彼得·林克的帽子提示)
或者,您可以在一行中一起加入最后3个命令:
:Ggrep findme :Qargs | argdo %s/findme/replacement/gc | update