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

oknrviil  于 2022-11-11  发布在  其他
关注(0)|答案(6)|浏览(164)

我有四个文本文件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(文件中的第一个命令)。和编辑运行脚本文件从命令提示符。
如果可能的话,请告诉我如何做,以及如何一次处理一个或多个文件?

qcbq4gxm

qcbq4gxm1#

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 shell也是类似的,但是我现在没有一台机器。
我想您可以一次加载所有文件,但这需要对每个文件重复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命令的文档。

slhcrj9b

slhcrj9b2#

在命令行上直接传递给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.
drkbr07n

drkbr07n3#

将您希望在每个文件上运行的所有命令保存在一个脚本中,比如“script.vim”,您可以在一个文件上执行该脚本,如下所示(正如其他人所提到的):

vim -c "source script.vim" A.txt

更进一步,您可以在脚本的末尾保存文件,方法是将:w命令放入脚本本身,或者从命令行传递它:

vim -c "source script.vim | w" A.txt

现在,你可以使用argdo命令,在Vim中对多个文件运行任何命令。

vim -c "argdo source script.vim | w" A.txt B.txt C.txt D.txt

最后,如果您想在每个文件上运行完脚本后退出Vim,只需添加另一个退出命令:

vim -c "argdo source script.vim | w" -c "qa" A.txt B.txt C.txt D.txt
rjzwgtxy

rjzwgtxy4#

请尝试以下语法:

ex foo.txt <<-EOF
  g/^\s*$/d
  %s/^/[/
  %s/\(.*\)\(\s\+\)\(.*\)/\3\2\1
  %s/$/]/
  %s/design/test/
  wq " Update changes and quit.
EOF

ex命令等效于vim -E。添加-V1以获得详细输出。
另一种单行语法例如:

ex +"g/^\s*$/d" +"%s/^/[/" +"%s/design/test/" -cwq foo.txt

要从文件加载命令,请使用-s cmds.vim
您也可以使用shebang for Vim to parse the file from the argument
有关更多示例,请参阅:

wooyq4lh

wooyq4lh5#

JimR和Ingo为您的用例提供了出色的答案。
不过,为了增加一种方法,您可以使用我的vimrunner插件来用ruby编写交互脚本:https://github.com/AndrewRadev/vimrunner
示例:

vim = Vimrunner.start

vim.edit "file.txt"
vim.insert "Hello"
vim.write

vim.kill

这对于更复杂的交互非常有用,因为您可以获得编程语言的全部功能。

sd2nnvve

sd2nnvve6#

使用vim -s ...不仅可以编写冒号命令的脚本,还可以编写普通模式命令(如=)的脚本以进行格式化:
1.创建一个文件,其中包含您希望Vim执行的所有击键。
1.运行vim -s SCRIPT-FILE FILE-TO-EDIT
例如:假设你想使用vim的=命令来重新缩进myfile.html的所有行,首先,使用vim本身,创建一个名为myscript的文件,其中包含:

gg=G:wq

gg移动到文件的顶部; =G从当前位置重新缩进到文件结尾; :wq<Enter>保存文件并退出。)
然后,运行以下命令以启动vim,编辑myfile.html,并保存:

vim -s myscript myfile.html

相关问题