如何从命令提示符下运行一系列vim命令

问题描述 投票:42回答:5

我有四个文本文件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(文件中的第一个命令)放入。并在命令提示符下编辑运行脚本文件。

如果可能,请让我知道如何做以及如何一次处理一个或多个文件?

shell vim command-prompt
5个回答
31
投票
vim -c <command> Execute <command> after loading the first file

执行您的描述,但是您一次必须做一个文件。

所以,在Windows Shell中...

for %a in (A,B,C,D) do vim -c ":g/^\s*$/d" -c "<another command>" %a.txt

POSIX的外壳很相似,但是我现在没有机器。

我想您可以一次加载所有文件并执行,但是需要在vim命令行上为每个文件重复命令,类似于

vim -c "<command>" -c "<command>" -c ":n" (repeat the previous -c commands for each file.)  <filenames go here>

编辑:2014年6月8日:仅供参考,几分钟前我就发现了。

vim具有命令bufdo来对编辑器中加载的每个缓冲区(文件)执行操作。查看bufdo命令的文档。在vim中,:help bufdo


20
投票

在命令行上直接传递给Vim的-c命令的数量限制为10,这不是很可读。另外,您可以将命令放入单独的脚本中,然后将其传递给Vim。方法如下:

静音批处理模式

对于非常简单的文本处理(即像Vim一样使用增强的'sed'或'awk',也许只是受益于:substitute命令中增强的正则表达式),请使用Ex-mode

REM Windows
call vim -N -u NONE -n -es -S "commands.ex" "filespec"

注意:静默批处理模式(:help -s-ex)弄乱了Windows控制台,因此您可能必须在运行Vim之后执行cls清理。

# Unix
vim -T dumb --noplugin -n -es -S "commands.ex" "filespec"

注意:如果"commands.ex"文件不存在,Vim将挂起等待输入;最好事先检查它的存在!另外,Vim可以从stdin中读取命令。您还可以用从stdin读取的文本填充新缓冲区,并在使用-参数的情况下从stderr读取命令。

全自动

要获得涉及多个窗口的更高级处理以及Vim的真正自动化(您可以在其中与用户互动或让Vim运行以让用户接管,请使用:

vim -N -u NONE -n -c "set nomore" -S "commands.vim" "filespec"

这里是使用的参数的摘要:

-T dumb           Avoids errors in case the terminal detection goes wrong.
-N -u NONE        Do not load vimrc and plugins, alternatively:
--noplugin        Do not load plugins.
-n                No swapfile.
-es               Ex mode + silent batch mode -s-ex
                Attention: Must be given in that order!
-S ...            Source script.
-c 'set nomore'   Suppress the more-prompt when the screen is filled
                with messages or output to avoid blocking.

19
投票

使用要在脚本中保存的每个文件上运行的所有命令,例如“ script.vim”,您可以像这样在一个文件上执行该脚本(正如其他人所提到的:]


6
投票

尝试以下语法:


2
投票

JimR和Ingo为您的用例提供了出色的答案。

© www.soinside.com 2019 - 2024. All rights reserved.