如何在 Vim 中跨多个文件搜索和替换字符串
单文件搜索和替换(替换)
参数
方法1:使用argdo
方法二:用宏进行替换并重复
关注@learnvim获取更多 Vim 技巧和窍门!
VSCode 和 Atom 等热门编辑器都拥有一个实用功能,那就是能够跨项目中的多个文件搜索和替换字符串。如果 Vim 也能做到,岂不是很棒?
幸运的是,Vim 也能做到这一点,尽管一开始可能不太直观。最棒的是,我们无需安装任何插件即可实现这一点!我将展示两种在 Vim 中跨多个文件进行搜索和替换的方法。但在此之前,我们先来回顾一下基础知识。
单文件搜索和替换(替换)
如果您了解 Vim 的基本替换,请随意跳到下一部分。
vim 中的替换通过以下方式完成:
:%s/stringToBeReplaced/replacementString/g
正则表达式也适用。这里我就不详细讲正则表达式了,不过你可以在 了解更多:h substitute
。
参数
您知道 Vim 有:ar[gs]
接受文件列表的命令吗?
让我来演示一下如何使用 args。假设我们的目录包含如下内容:
├── index.js
├── server.js
要捕获index.js
和server.js
,我们可以这样做。现在:args *.js
输入将显示:args
[index.js] server.js
要转到下一个参数,请键入:n[ext]
并:prev[ious]
转到上一个参数列表。
我们还可以使用 glob 函数对 args 进行递归搜索。以下是更多使用 args 的方法:
:args index.js server.js // captures only index and server js files
:args **/*.js // captures every js files
:args ** // captures everything
有了和:s
,:args
我们就可以进行替换了!
方法1:使用argdo
现在我们已经获得了所有参数,可以执行常规替换了。
回想一下我们的替换方法,我们将它与 结合起来argdo
。
:argdo %s/stringToBeReplaced/replacementString/g | update
这将用 bar 替换所有 foo 并将其应用于所有参数。
如果你对 argdo 感到困惑,你并不孤单。我直到不久前才听说过它。它实际上非常简单。如果我们看一下:h argdo
,它确实:
对参数列表中的每个文件执行 {cmd}...
简而言之,它会将{cmd}
你传入的所有内容(也就是所有 js 文件)应用到所有参数列表中。我们传递的是替换命令。
这update
是可选的。它会保存所有替换的文件。我这么做是因为我经常忘记保存它们。
方法二:用宏进行替换并重复
在录制宏时,对一个文件执行替换,并在所有参数中重复宏。
假设文件夹结构和参数相同,操作方法如下:
qq // start macro in q register
%s/stringToBeReplaced/replacementString/ge // the e flag tells vim to not throw an error if there is no match
:wnext //important. This is similar to `:next`, but it also writes the current file
q // stop macro
999@q //repeat this macros either 999 times or to remaining files.
就是这样!
你还有其他进行全局搜索和替换的技巧吗?我很想听听!
顺便说一句,这里有一个有趣的部分。第二种方法实际上列在 Vim 的“巧妙技巧”用户手册里(适用于 vim 7.3 及更高版本和 Neovim)。如果你有时间,应该看看整个部分(:h usr_12.txt
)。它相当易读,简短,并且包含超级有趣的 vim hacks!