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

Vim:对于多个文件:复制所有文本、替换和粘贴,vim,Vim,我想使用Vim对多个文件执行以下操作: 复制每个文件中的所有文本 替换一些文本 将复制的文本粘贴到每个文件的末尾 替换其他一些文本 以下是我对一个文件的命令: :%y :%s/old1/new1/g :G :P :%s/old2/new2/g 有人能告诉我这样做的语法吗?尤其是我对Vim还是新手 我发现argdo可以在多个文件上执行命令。我找到了许多使用argdo替换文本的示例,但是我找不到使用argdo的语法:%y、:G或:P 谢谢。UPD:我的Vim fu不如@ib或@sehe的Vim f

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

  • 复制每个文件中的所有文本
  • 替换一些文本
  • 将复制的文本粘贴到每个文件的末尾
  • 替换其他一些文本
  • 以下是我对一个文件的命令:

    :%y
    :%s/old1/new1/g
    :G
    :P
    :%s/old2/new2/g
    
    有人能告诉我这样做的语法吗?尤其是我对Vim还是新手

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


    谢谢。

    UPD:我的Vim fu不如@ib或@sehe的Vim fu强大,因此您可能希望使用他们建议的解决方案,而不是我的解决方案

    但是,我的解决方案对于我个人来说(作为一名Vim学徒)更容易编辑和调试,所以,还是让它在这里吧


    您可以在
    vimrc
    中添加以下临时函数:

    function! MyTmpFunc()
       :%y
       :%s/old1/new1/g
       normal! G
       normal! P
       :%s/old2/new2/g
    endfunction
    
    然后用您需要影响的文件重新启动Vim(类似于
    Vim myfile1.txt myfile2.txt myfile3.txt
    ),并执行以下命令:

    :argdo调用MyTmpFunc()

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

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

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

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

    :bufdo%s/old1/new1/g


    就这样。

    就像@ib提到的,我会用前命令1来完成这项任务

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

    要允许不匹配的替换,请添加
    s///e
    并添加
    静默
    在文件较多的情况下使操作更快

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


    1(请注意,argdo在默认情况下需要一个Ex命令列表。您可以使用例如
    argdo norm!ggyG
    来使用正常模式命令)

    一个人不必创建临时函数来执行多个Ex命令:
    :argdo%y |%s/o1/n1/g |$pu |%s/o2/n2/g
    @ib asways ib,这应该是一个答案。我在文章中又添加了一些想法mine@ib.是的,我的维姆福不是很强,我的坏。但是,我建议的方法对我个人来说(作为一名Vim学徒)更容易编辑和调试,所以,还是让它在这里吧。(我也更新了我的答案)这个答案值得它得到的每一个学分,没有问题。另一方面,函数是完全相同的:一个Ex命令列表,所以我真的看不出有什么区别。如果您愿意,请使用
    qQ
    。还有一个提示:使用
    source$MYVIMRC
    重新加载您的vimrc,并使用
    :args myfile?.txt
    设置参数列表而不重新启动这太好了!我刚刚在第一个命令中添加了| w:argdo%y |%s/old1/new1/g |$pu |%s/old2/new2/g |w@Pansy. 这是正确的。好电话。我始终启用了
    :se autowrite autoread
    (我对其余部分启用了持久撤消和版本控制)如果需要在原始文本的一个副本上运行两个替换中的每一个,可以避免手动设置标记:
    :argdo%y |%s/o1/n1/g |$pu |'[,$s/o2/n2/g
    @ib哇,我就知道了。谢谢ib,你帮助了OP,也改进了我的交易。我会投票支持你的评论:)不知怎的,我也喜欢
    :%copy$
    的表现力,though@Pansy还考虑使用<代码>:更新< /代码>(<代码>:UP )而不是
    :write
    。与后者不同,前者在未修改缓冲区时不会写入缓冲区。
    :argdo $mark a | %co$ | 1,'a s/old1/new1/g | 'a,$s/old2/new2/g
    
    :silent! argdo $mark a | %co$ | 1,'a s/old1/new1/ge | 'a,$s/old2/new2/ge