Vim

自动命令

在特定的情况下,VIM 会传出事件。如果你想针对这些事件执行回调方法,那么就需要用到自动命令这个功能。

如果没有了自动命令,那你基本上是用不了 VIM 的。自动命令一直都在执行,只是很多时候你没有注意到。不信的话,可以执行命令 :au ,不要被结果吓到,这些是当前有效的所有自动命令。

请使用 :h {event} 来查看 VIM 中所有事件的列表,你也可以参考 :h autocmd-events-abc 来获取关于事件的更多帮助。

一个很常用的例子,就是针对文件类型执行某些设置:

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

但是缓冲区是如何知道当前的文件中包含 Ruby 代码呢?这其实是另一个自动命令检测的到的,然后把文件类型设置成为 Ruby,这样就触发了上面的 FileType 事件。

在配置 vimrc 的时候,一般第一行加进去的就是 filetype on。这就意味着,VIM 启动时会读取 filetype.vim 文件,然后根据文件类型来触发相应的自动命令。

如果你勇于尝试,可以查看下 :e $VIMRUNTIME/filetype.vim,然后在输出中搜索 "Ruby"。这样,你就会发现其实 VIM 只是通过文件扩展名 .rb 判断某个文件是不是 Ruby 的。

注意 :对于相同事件,如果有多个自动命令,那么自动命令会按照定义时的顺序执行。通过 :au 就可以查看它们的执行顺序。

au BufNewFile,BufRead *.rb,*.rbw setf ruby

BufNewFileBufRead 事件是被写在 VIM 源文件中的。因此,每当你通过 :e 或者类似的命令打开文件,这两个事件都会触发。然后,就是读取 filetype.vim 文件来判断打开的文件类型。

简单来说,事件和自动命令在 VIM 中的应用十分广泛。而且,VIM 为我们留出了一些易用的接口,方便用户配置适合自己的事件驱动回调。

请参阅 :h autocommand 来获取更多帮助