Vim

执行自动命令

你可以触发任何事件,如::doautocmd BufRead

用户自定义事件

对于插件而言,创建你自己的自定义事件有时非常有用。

function! Chibby()
    " A lot of stuff is happening here.
    " And at last..
    doautocmd User ChibbyExit
endfunction

现在你插件的用户可以在 Chibby 执行完成之后做任何他想做的事情:

autocmd User ChibbyExit call ChibbyCleanup()

顺便提一句,如果在使用 :autocmd:doautocmd 时没有捕捉异常,那么会输出 "No matching autocommands" 信息。这也是为什么许多插件用 silent doautocmd ... 的原因。但是这也会有不足,那就是你不能再在 :autocmd 中使用 echo "foo" 了,取而代之的是你要使用 unsilent echo "foo" 来输出。

这就是为什么要在触发事件之前先判断事件是否存在的原因,

if exists('#User#ChibbyExit')
  doautocmd User ChibbyExit
endif

帮助文档::h User

事件嵌套

默认情况下,自动命令不能嵌套!如果某个自动命令执行了一个命令,这个命令再依次触发其它的事件,这是不可能的。例如你想在每次启动 VIM 的时候自动打开你的 vimrc 文件:

autocmd VimEnter * edit $MYVIMRC

当你启动 VIM 的时候,它会帮你打开你的 vimrc 文件,但是你很快会注意到这个文件没有任何的高亮,尽管平时它是正常可以高亮的。

问题在于你的非嵌套自动命令 :edit 不会触发“BufRead”事件,所以并不会把文件类型设置成“VIM”,进而 $VIMRUNTIME/syntax/vim.vim 永远不会被引入。详细信息请参考::au BufRead *.vim。要想完成上面所说的需求,使用下面这个命令:

autocmd VimEnter * nested edit $MYVIMRC

帮助文档::h autocmd-nested