5

我想使用 Vim 对多个文件执行以下操作:

  1. 复制每个文件中的所有文本
  2. 替换一些文本
  3. 将复制的文本粘贴到每个文件的末尾
  4. 替换一些其他文本

这是我对一个文件的命令:

:%y
:%s/old1/new1/g
:G
:P
:%s/old2/new2/g

谁能告诉我这样做的语法?特别是我是 Vim 的新手!

我发现 argdo 可以对多个文件执行命令。我发现了许多使用 argdo 替换文本的示例,但我找不到将 argdo 与 :%y、:G 或 :P 一起使用的语法

谢谢。

4

2 回答 2

4

就像@ib 提到的那样,我会使用 ex 命令1来执行此操作

:argdo %y | %s/old1/new1/g | $pu | %s/old2/new2/g

您也很有可能希望在独占范围上进行操作(仅在第一部分进行第一次替换,仅在第二部分进行第二次替换):

:argdo $mark a | %co$ | 1,'a s/old1/new1/g | 'a,$s/old2/new2/g

要允许不匹配的替换,请添加s///e和添加silent!以使操作在许多文件的情况下更快。

:silent! argdo $mark a | %co$ | 1,'a s/old1/new1/ge | 'a,$s/old2/new2/ge

1请注意,argdo 默认需要一个 Ex 命令列表。您可以使用 egargdo norm! ggyG来使用普通模式命令

于 2012-05-04T08:56:37.283 回答
3

UPD:我的 Vim-fu 不如 @ib 或 @sehe 的强大,所以您可能想使用他们建议的解决方案而不是我的解决方案。

但是,我的解决方案更容易为我个人(作为 Vim 学徒)编辑和调试,所以无论如何,让它在这里。


您可以在 中添加以下临时功能vimrc

function! MyTmpFunc()
   :%y
   :%s/old1/new1/g
   normal! G
   normal! P
   :%s/old2/new2/g
endfunction

然后使用您需要影响的文件(类似vim myfile1.txt myfile2.txt myfile3.txt)重新启动 Vim,并执行以下命令:

:argdo call MyTmpFunc()

这就是您在问题中所描述的:MyTmpFunc()将为给 Vim 的每个参数调用函数。

MyTmpFunc()现在你可以从 vimrc中删除了。

还要注意:bufdo- 它为每个打开的缓冲区调用一些命令。还有:windo,它为每个窗口执行命令,但我个人觉得:bufdo最有用。

另请注意,如果您只需要在每个缓冲区中执行一个命令,则不必创建临时函数。比如说,如果你只需要将每个缓冲区中的“”替换old1为“ new1”,那么你可以执行以下命令:

:bufdo %s/old1/new1/g

就是这样。

于 2012-05-04T05:30:53.277 回答