Vim:对于多个文件:复制所有文本,替换和粘贴

时间:2012-05-04 02:26:34

标签: vim

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

  1. 复制每个文件中的所有文字
  2. 替换一些文字
  3. 将复制的文本粘贴到每个文件的末尾
  4. 替换其他一些文字
  5. 以下是我对一个文件的命令:

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

    有人可以告诉我这样做的语法吗?特别是我是Vim的新手!

    我发现argdo可以在多个文件上执行命令。我找到了许多使用argdo替换文本的例子,但我找不到使用argdo的语法:%y,:G或:P

    感谢。

2 个答案:

答案 0 :(得分: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命令列表。您可以使用例如argdo norm! ggyG来使用普通模式命令

答案 1 :(得分: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()

这就是你在问题中描述的内容:将为每个给予Vim的参数调用函数MyTmpFunc()

现在您可以从vimrc中删除MyTmpFunc()

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

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

:bufdo %s/old1/new1/g

就是这样。