在 vim 中查找并替换多个文件中特定字符串的所有实例

Joh*_*ith 9 vi vim

我对 Vim 还比较陌生,不知道如何替换多个文件(来自特定项目目录)中特定字符串的所有实例。理想情况下,我想在没有任何额外插件的情况下做到这一点;正在研究 :vimgrep 和 :arg 选项,但无法解决。

感谢您提前抽出时间!

rom*_*inl 17

一般工作流程是:

  1. 在整个项目中搜索您的模式。
  2. 对每个匹配项(更安全、更慢)或每个包含匹配项的文件进行操作(风险更高、更快)。
  3. 写下您的更改。

第一步可以使用填充快速修复列表的任何命令来完成::help :vimgrep:help :grep、来自第三方插件的命令等。

:grep个例子:

:grep foo **/*.js
Run Code Online (Sandbox Code Playgroud)

将为当前目录和子类别中的文件foo中找到的每个条目填充快速修复列表。*.js您可以通过 来查看列表:cwindow

第二步涉及:help :cdo:help :cfdo

:cdo s/foo/bar/gc
Run Code Online (Sandbox Code Playgroud)

这将替换快速修复列表中每一行的 everyfoobar要求确认。有了:cfdo它就会看起来像这样:

:cfdo %s/foo/bar/gc
Run Code Online (Sandbox Code Playgroud)

c如果你超级有信心,你可以在最后放弃。看:help :s_flags

第三步涉及:help :update

:cfdo update
Run Code Online (Sandbox Code Playgroud)

如果快速修复列表中的每个文件已更改,它将把它们写入磁盘。

简而言之:

:gr foo **/*.js
:cdo s/foo/bar/gc
:cfdo up
Run Code Online (Sandbox Code Playgroud)


mat*_*ttb 3

您可以在 arg 列表的所有文件的所有行上运行标准替换命令,如下所示:

:argdo %s/pattern/replacement/ge

如果要将特定目录中的所有文件添加到 arg 列表中,可以使用:

argadd `path/to/dir/*.py`
Run Code Online (Sandbox Code Playgroud)

请注意上面示例中的反引号。

请观看一系列精彩的屏幕演示,了解如何 在此处做更多事情,特别是观看这一集。