有没有办法在shell脚本中调用vim宏?

Exc*_*ttu 2 vim shell

我正在使用shell脚本和vim宏在unix环境中进行数据处理.以下是步骤:

  1. 我使用grep从日志文件中获取一些有用的行.
  2. vim中的宏用于处理数据.
  3. 同样,使用shell脚本来处理数据.

我必须为许多文件执行此操作.所以,我想知道有没有办法通过特殊的包装器在shell脚本中调用vim的宏.

Ing*_*kat 7

您可以触发录制的宏,例如

$ vim -c "normal! @q" file
Run Code Online (Sandbox Code Playgroud)

这是一种脆弱的方法.

备择方案

除非你真的需要特殊的Vim的功能,你可能最好使用非交互式工具一样sed,awk或Perl/Python的/ Ruby的/ 你最喜欢的脚本语言在这里.

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

无声批处理模式

对于非常简单的文本处理(即使用Vim,如增强型'sed'或'awk',可能只是受益于:substitute命令中增强的正则表达式),请使用Ex模式.

REM Windows
call vim -N -u NONE -n -es -S "commands.ex" "filespec"
Run Code Online (Sandbox Code Playgroud)

注意:静默批处理模式会-s-ex混淆Windows控制台,因此您可能必须cls在Vim运行后进行清理.

# Unix
vim -T dumb --noplugin -n -es -S "commands.ex" "filespec"
Run Code Online (Sandbox Code Playgroud)

注意:如果"commands.ex"文件不存在,Vim将挂起等待输入; 更好地检查它的存在!或者,Vim可以从stdin读取命令.您还可以使用从stdin读取的文本填充新缓冲区,如果使用 - 参数,则从stderr读取命令.

完全自动化

对于涉及多个窗口的更高级处理,以及Vim的真实自动化(您可以与用户交互或让Vim运行以让用户接管),请使用:

vim -N -u NONE -n -c "set nomore" -S "commands.vim" "filespec"
Run Code Online (Sandbox Code Playgroud)

以下是使用的参数的摘要:

-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.
Run Code Online (Sandbox Code Playgroud)