我正在编写一个运行命令行程序(Gromacs)的bash脚本,保存结果,修改输入文件,然后再次循环执行该过程。我正在尝试使用VIM来修改输入文本文件,但我无法找到执行内部VIM命令的方法,如:1234,w,x,dd等。在VIM中打开我的输入文件后从.sh文件中获取(“vim conf.gro”)。
有没有实用的方法从shell脚本执行VIM命令?
答案 0 :(得分:13)
我认为vim -w/W and vim -s
正是您所寻找的。
您可以使用vim -w test.keys input.file
录制“vim操作/键序列”,您也可以编写test.keys
。例如将其保存在文件中:
ggwxjddZZ
这样做:
move to 1st line,
move to next word,
delete one char,
move to next line,
del the line.
save and quit.
使用此test.keys
文件,您可以执行以下操作:
vim -s test.keys myInput.file
您的“myInput.file”将由上述操作处理,并保存。你可以在shell脚本中拥有该行。
vimgolf使用相同的方法来保存用户解决方案。答案 1 :(得分:10)
您可以通过-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
进行文字处理。
答案 2 :(得分:6)
除非你真的需要特殊的Vim功能,否则最好使用非交互式工具,如sed
,awk
或Perl / Python / Ruby / < em>您最喜欢的脚本语言。
也就是说,你可以非交互式地使用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.