你可以触发任何事件,如::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