微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Vim中使用quickfix列表搜索和替换

到目前为止,我总是使用EasyGrep替换多个文件中的文本。不幸的是,当项目变得更大时,它是相当缓慢。有一件事似乎是惊人的快速是Ggrep的fugitive.vim,只搜索我的版本控制文件。所有结果也存储在quickfix列表中。

如何使用Ggrep的结果做一个简单的替换所有这些找到的文件?是不是有可能使用%s / foo / bar / cg在quickfix列表中的所有文件或有什么更好的方法

Vim具有 bufdo,windo,tabdoargdo,它允许您在参数列表中所有打开的缓冲区,窗口或文件中执行相同的命令。我们真正需要的是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

原文地址:https://www.jb51.cc/vim/389400.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐