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



我有四个文本文件A.txt,B.txt,C.txt和D.txt我必须在所有这些文件中执行一系列 vim 编辑。目前我正在做的是打开每个文件并一个接一个地执行相同的 vim 命令。

是否可以制作一个我可以从命令提示符运行的脚本文件,这意味着无需打开实际文件进行 vim 编辑。

例如,如果我在 vim 编辑器中打开 A.txt 文件后必须执行以下 vim 命令:

:g/^s*$/d
:%s/^/[/
:%s/(.*)(s+)(.*)/321
:%s/$/]/
:%s/design/test/

是否可以制作一个脚本文件并放置所有这些命令,包括gvim A.txt(文件中的第一个命令(。并编辑从命令提示符运行脚本文件。

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

vim -c <command> Execute <command> after loading the first file

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

所以,在窗户外壳中...

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>

编辑:六月08 2014:仅供参考,我几分钟前发现了这一点。

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

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

将要对每个文件运行的所有命令保存在脚本中,例如"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

请尝试以下语法:

ex foo.txt <<-EOF
  g/^s*$/d
  %s/^/[/
  %s/(.*)(s+)(.*)/321
  %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 从参数中解析文件。

有关更多示例,请参阅:

  • 如何以非交互方式编辑文件(例如在管道中(?
  • 巴什常见问题/021

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

但是,为了添加另一种方法,您可以使用我的 vimrunner 插件在 ruby: https://github.com/AndrewRadev/vimrunner 中编写交互脚本。

例:

vim = Vimrunner.start
vim.edit "file.txt"
vim.insert "Hello"
vim.write
vim.kill

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

使用 vim -s ... 不仅可以编写冒号命令的脚本,还可以编写正常模式命令(如用于格式化的 =(:

  1. 创建一个包含您希望 vim 执行的所有击键的文件。
  2. 运行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

相关内容

  • 没有找到相关文章

最新更新