我正在编写一个运行命令行程序(Gromacs)的 Bash 脚本,保存结果,修改输入文件,然后再次循环该过程。
我正在尝试使用 Vim 修改输入文本文件,但在打开我的输入文件后,我无法从 .sh 文件中找到执行内部 Vim 命令(如:1234、w、x、dd 等)的方法在 Vim(“vim conf.gro”)中。
有没有从 shell 脚本执行 Vim 命令的实用方法?
我想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正在使用相同的方式来保存用户的解决方案。
-c
您可以通过标志编写 Vim 脚本。
vim -c "set ff=dos" -c wq mine.mak
然而,这只能让你到目前为止。
:normal
. 例如:norm dd
commands.vim
),然后:source
通过-S
.:h ex-cmd-index
所以你最终会得到这样的东西。将所有的 Vim 命令放在commands.vim
.
vim -S commands.vim mine.mak
您可能还想研究使用sed
和/或awk
进行文本处理。
除非您真的需要特殊的 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.