vim:如何在所有打开的文件中搜索/替换?

6
如果我使用:vimgrep,它会搜索当前目录下的所有文件。但我的要求是在所有打开的文件中进行搜索/替换。
例如,我正在使用vim同时打开3个文件。
vim 1.cpp 2.cpp 3.cpp

我希望:
  1. 在三个文件中搜索所有名为“main”的函数并在快速修复窗口中显示。

  2. 将三个文件中所有的“hello”替换为“world”。

5个回答

13

使用以下命令:

bufdo s/字符串/替换/g

bufdo : 对所有缓冲区执行操作。
s : 替换命令。
g : 全局替换。


1
在我的电脑上无法工作。您必须在“s”之前使用“%”符号(例如 bufdo %s/baseString/updatedString/g )以搜索所有缓冲区/文件的所有行中的出现次数。 - Apitronix

6

如果您的Vim版本足够新,您可以使用:cdo 命令:

:vimgrep main {1,2,3}.cpp
:cwindow
:cdo s/foo/bar/g

1
你需要在每个缓冲区被修改后添加“| update”以保存它们。因为默认情况下,如果缓冲区已被更改,Vim将不会切换到其他缓冲区。 - IvanDi
此解决方案需要编写要让 vimgrep 操作的文件名,而 vimgrep 似乎无法为隐藏缓冲区填充快速修复窗口。 - Kiteloopdesign

3

根据您在vim中使用多个文件的方式(选项卡,窗口等),您可以使用不同的命令在多个文件中搜索和替换

  • :tabdo(所有选项卡)
  • :windo(当前选项卡中的所有窗口)
  • :bufdo(所有缓冲区,即所有使用:ls命令列出的缓冲区)
  • :argdo(参数列表中的所有文件)
  • :cdo(快速修复列表中列出的所有文件)

首先使用vim选项卡打开多个文件:

$ vim -p file1.txt file2.txt

然后在vim中,你可以使用以下命令在多个文件中进行搜索和替换:

:tabdo %s/pattern/replace/gc

:windo 是唯一一个对我有效的命令,非常棒,我打开了5个文件,运行得非常顺利,这是我多年来一直需要的功能,终于有机会去查找了。非常感谢!而且更容易记住,因为你仍然可以在前面使用 %。(在这种情况下,我使用 /gc 而不仅仅是 /g。) - undefined

2
我使用了以下命令,对我来说很有效。请按照顺序使用此命令。 :set autowriteall :bufdo! %s/pattern/replace/g

-3

你可以使用命令模式。 %s/(findstring)/(replacestring)


4
只会替换一个文件。问题是需要同时替换所有打开的文件中的字符串。 - JJJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接