18

我正在编写一个运行命令行程序(Gromacs)的 Bash 脚本,保存结果,修改输入文件,然后再次循环该过程。

我正在尝试使用 Vim 修改输入文本文件,但在打开我的输入文件后,我无法从 .sh 文件中找到执行内部 Vim 命令(如:1234、w、x、dd 等)的方法在 Vim(“vim conf.gro”)中。

有没有从 shell 脚本执行 Vim 命令的实用方法?

4

3 回答 3

16

我想vim -w/W and vim -s这就是你要找的。

“Vim 操作/键序列”你也可以用vim -w test.keys input.file. 你也可以写test.keys。例如,将其保存在文件中:

ggwxjddZZ

这将做:

Move to the first line,
move to the next word,
delete one character,
move to the next line,
delete the line, and
save and quit.

使用此test.keys文件,您可以执行以下操作:

vim -s test.keys myInput.file

您的“myInput.file”将通过上述操作进行处理,并保存。你可以在你的 shell 脚本中有那行。

VimGolf正在使用相同的方式来保存用户的解决方案。

于 2013-09-17T21:28:35.557 回答
14

-c您可以通过标志编写 Vim 脚本。

vim  -c "set ff=dos" -c wq mine.mak

然而,这只能让你到目前为止。

  • 从您提供的命令看来,您正在尝试运行一些正常的命令。您将需要使用:normal. 例如:norm dd
  • 在命令行上写所有这些是自找麻烦。我建议你制作一个 Vim 文件(例如commands.vim),然后:source通过-S.
  • 您可能想要获得良好且符合要求的 Vim 的 ex 命令。看一眼:h ex-cmd-index

所以你最终会得到这样的东西。将所有的 Vim 命令放在commands.vim.

vim -S commands.vim mine.mak

您可能还想研究使用sed和/或awk进行文本处理。

于 2013-09-17T21:31:23.413 回答
8

备择方案

除非您真的需要特殊的 Vim 功能,否则您最好使用非交互式工具,例如sed,awk或 Perl / Python / Ruby /你最喜欢的脚本语言

也就是说,你可以以非交互方式使用 Vim:

静默批处理模式

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

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

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

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

"commands.ex"注意:如果文件不存在,Vim 会挂起等待输入;最好事先检查它的存在!或者,Vim 可以从标准输入读取命令。如果使用-参数,您还可以使用从标准输入读取的文本填充新缓冲区,并从标准错误读取命令。

全自动

对于涉及多个窗口的更高级处理,以及 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.
于 2013-09-18T06:55:37.180 回答