我有四个文本文件A.txt,B.txt,C.txt和D.txt,我必须在所有这些文件中执行一系列的vim编辑。目前我正在做的是打开每个文件,并逐一执行相同的vim命令。
有没有可能制作一个脚本文件,我可以从命令提示符运行,意味着没有打开实际的文件进行vim编辑。
例如,如果在Vim编辑器中打开A. txt文件后,我必须执行以下Vim命令:
:g/^\s*$/d
:%s/^/[/
:%s/\(.*\)\(\s\+\)\(.*\)/\3\2\1
:%s/$/]/
:%s/design/test/
是否有可能制作一个脚本文件,并把所有这些命令,包括gvim A.txt
(文件中的第一个命令)。和编辑运行脚本文件从命令提示符。
如果可能的话,请告诉我如何做,以及如何一次处理一个或多个文件?
6条答案
按热度按时间qcbq4gxm1#
按照您的描述进行操作,但您必须一次处理一个文件。
因此,在Windows Shell中...
POSIX shell也是类似的,但是我现在没有一台机器。
我想您可以一次加载所有文件,但这需要对每个文件重复vim命令行上的命令,类似于
编辑:2014年6月8日:仅供参考,我几分钟前发现了这个。
vim有一个命令bufdo来处理编辑器中加载的每个缓冲区(文件)。请查看bufdo命令的文档。
slhcrj9b2#
在命令行上直接传递给Vim的
-c
命令的数量被限制为10个,这不是很容易理解。或者,您可以将这些命令放在一个单独的脚本中并将其传递给Vim。下面是具体操作:静默批处理模式
对于非常简单的文本处理(例如,使用Vim作为增强的“sed”或“awk”,可能只是受益于
:substitute
命令中的增强正则表达式),请使用 Ex-mode。注意:静默批处理模式(
:help -s-ex
)会扰乱Windows控制台,因此您可能必须在Vim运行后执行cls
来进行清理。注意:如果
"commands.ex"
文件不存在,Vim将挂起等待输入;最好事先检查一下它是否存在!或者,Vim可以从stdin读取命令。你也可以用从stdin读取的文本填充一个新的缓冲区,如果你使用-
参数,则从stderr读取命令。全自动化
对于涉及多个窗口的更高级处理,以及Vim的真实的自动化(您可以与用户交互,或者让Vim运行以让用户接管),请用途:
以下是所用参数的摘要:
drkbr07n3#
将您希望在每个文件上运行的所有命令保存在一个脚本中,比如“script.vim”,您可以在一个文件上执行该脚本,如下所示(正如其他人所提到的):
更进一步,您可以在脚本的末尾保存文件,方法是将
:w
命令放入脚本本身,或者从命令行传递它:现在,你可以使用
argdo
命令,在Vim中对多个文件运行任何命令。最后,如果您想在每个文件上运行完脚本后退出Vim,只需添加另一个退出命令:
rjzwgtxy4#
请尝试以下语法:
ex
命令等效于vim -E
。添加-V1
以获得详细输出。另一种单行语法例如:
要从文件加载命令,请使用
-s cmds.vim
。您也可以使用shebang for Vim to parse the file from the argument。
有关更多示例,请参阅:
wooyq4lh5#
JimR和Ingo为您的用例提供了出色的答案。
不过,为了增加一种方法,您可以使用我的vimrunner插件来用ruby编写交互脚本:https://github.com/AndrewRadev/vimrunner。
示例:
这对于更复杂的交互非常有用,因为您可以获得编程语言的全部功能。
sd2nnvve6#
使用
vim -s ...
不仅可以编写冒号命令的脚本,还可以编写普通模式命令(如=
)的脚本以进行格式化:1.创建一个文件,其中包含您希望Vim执行的所有击键。
1.运行
vim -s SCRIPT-FILE FILE-TO-EDIT
例如:假设你想使用vim的
=
命令来重新缩进myfile.html
的所有行,首先,使用vim本身,创建一个名为myscript
的文件,其中包含:(
gg
移动到文件的顶部;=G
从当前位置重新缩进到文件结尾;:wq<Enter>
保存文件并退出。)然后,运行以下命令以启动vim,编辑
myfile.html
,并保存: