基本需求
使用vim中的autocmd命令可以很容易的将正在编辑的文件与外部的程序关联起来,从而使得开发效率更高。比如经常会用到这样的功能:
- 编写一段python脚本,需要快速的查看该脚本的运行结果(最好是能做到一键完成)
- 使用dot脚本绘制系统的模块关系等,需要即时预览结果(比如调整色彩,模块间的连线等)
autocmd命令简介
通过vim的autocmd可以很容易的做到这点,比如按F5键,如果该文件是python脚本的话(以py结尾),就尝先将文件保存,然后调用系统中的python来执行当前脚本。
autocmd的命令格式为:
autocmd [group] {event} {pattern} [nested] {cmd}
group及nested均为可选参数,详情请参考:help autocmd. 意思是,当发生event时,对符合pattern的对象执行cmd命令。
示例及解释
比如自动调用python解释器来解释当前编辑的python脚本:
autocmd BufRead *.py nmap <F5> :w<CR>:!python %<CR><CR>
上边这条命令是指,当发生
BufRead事件时,对匹配模式(
*.py)的缓冲区,执行命令:
nmap <F5> :w<CR>:!python %<CR><CR>
而命令
nmap <F5> :w<CR>:!python %<CR><CR>表示:在normal模式下,将F5键映射为:
:w<CR>:!python %<CR><CR>
其中<CR>模拟用户输入回车,!表示执行操作系统中的命令(因此,你需要将python的解释器放入PATH环境变量中,%表示当前的文件名。
BufRead事件发生在"开始编辑新缓冲区,读入文件后",即当vim加载文件完成之后,相当于注册了一个回调函数。因此上边的命令翻译过来就是:
当读入文件内容后,如果文件是是python脚本,就映射键F5为保存并执行。这样,当按F5键时,vim会自动保存文件,并将文件名作为python解释器的参数传递给python,启动一个shell来执行。
效果如下:
![](http://dl.iteye.com/upload/attachment/610676/23d3705e-1b96-314d-bb0d-3529774f50c5.png)
可以将上边这个脚本放入.vimrc或者_vimrc(windows下)。
同样,如果想在编辑dot脚本的时候,让vim帮你自动完成调用外部程序(dot)的话,可以这样:
autocmd BufRead *.dot nmap <F8> :w<CR>:!dot -Tpng -o %<.png % && start %<.png<CR><CR>
将F8映射为,先执行:
dot -Tpng -o result.png source.dot
然后在启动的shell中,执行start result.png, start是windows下command.exe的命令,用于重新启动一个shell,如果后边的文件有关联(我的系统中是picasa3),则使用该关联程序打开此文件,也就有了下面的这张图:
![](http://dl.iteye.com/upload/attachment/610674/4d60367c-4fb1-3aca-87f8-f48e72d153b7.png)
如果你有其他好用的工具,如unxutil的windows版本,也可以很容易的使用autocmd命令与vim绑起来,使得开发效率得到极大的提升。