我对 Vim 还比较陌生,不知道如何替换多个文件(来自特定项目目录)中特定字符串的所有实例。理想情况下,我想在没有任何额外插件的情况下做到这一点;正在研究 :vimgrep 和 :arg 选项,但无法解决。
感谢您提前抽出时间!
一般工作流程是:
第一步可以使用填充快速修复列表的任何命令来完成:
:help :vimgrep
、:help :grep
、来自第三方插件的命令等。
以
:grep
为例:
:grep foo **/*.js
将使用当前目录和子类别中
foo
文件中找到的每个 *.js
的条目填充快速修复列表。您可以通过 :cwindow
查看列表。
第二步涉及
:help :cdo
或:help :cfdo
:
:cdo s/foo/bar/gc
它将在快速修复列表中的每一行上用
foo
替换每个 bar
并要求确认。使用:cfdo
,它看起来像这样:
:cfdo %s/foo/bar/gc
如果你超级有信心,你可以把最后的
c
去掉。请参阅:help :s_flags
。
第三步涉及
:help :update
:
:cfdo update
如果快速修复列表中的每个文件已更改,它将写入磁盘。
简而言之:
:gr foo **/*.js
:cdo s/foo/bar/gc
:cfdo up
我只是想补充 mattb 的答案,这在手册的第 26.3 节中进行了专门讨论。
举个简单的例子:
:args *.c
:argdo %s/old_pattern/new_pattern/ge | update
第一个命令选择要应用更改的文件,而第二个命令则应用更改。 更详细:
%s
更改文件中的所有行。ge
对文件中每行的所有实例进行更改,从而抑制任何错误。update
写入文件(如果已更改)。存在用于跨所有窗口或所有缓冲区进行此类更改的类似物。 更多详细信息请参阅手册。