我想使用 Vim 对多个文件执行以下操作:
- 复制每个文件中的所有文本
- 替换一些文本
- 将复制的文本粘贴到每个文件的末尾
- 替换一些其他文本
这是我对一个文件的命令:
:%y
:%s/old1/new1/g
:G
:P
:%s/old2/new2/g
谁能告诉我这样做的语法?特别是我是 Vim 的新手!
我发现 argdo 可以对多个文件执行命令。我发现了许多使用 argdo 替换文本的示例,但我找不到将 argdo 与 :%y、:G 或 :P 一起使用的语法
谢谢。
我想使用 Vim 对多个文件执行以下操作:
这是我对一个文件的命令:
:%y
:%s/old1/new1/g
:G
:P
:%s/old2/new2/g
谁能告诉我这样做的语法?特别是我是 Vim 的新手!
我发现 argdo 可以对多个文件执行命令。我发现了许多使用 argdo 替换文本的示例,但我找不到将 argdo 与 :%y、:G 或 :P 一起使用的语法
谢谢。
就像@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
来使用普通模式命令)
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
就是这样。