vimrc配置入门一文介绍过,配置项 filetype plugin indent on 可打开Vim的文件类型检测功能。每当一个新的或已经存在的文件被编辑时,Vim 都会试图识别该文件的类型,并设置 filetype 选项,同时也触发 FileType 事件 (该事件可以设置语法高亮、特定选项等)。

其实,上面这条命令可以分解成三条基本命令:filetype onfiletype plugin onfiletype indent on。可通过命令 :filetype 查看当前Vim的文件类型检测功能有没有打开。

filetype on

filetype on 配置项是 Vim 文件类型检测功能的开关。执行该命令时,Vim 实际上执行的是 $VIMRUNTIME/filetype.vim 脚本。filetype.vim 脚本使用了autocmd命令自动根据文件名判断文件的类型,若无法根据文件名检测到文件类型,则会继续调用 $VIMRUNTIME/scripts.vim 脚本来根据文件的内容判断文件类型。

若通过上述步骤 Vim 仍然没能正确检测到文件的类型,则需要通过命令 :set filetype 来手工指定文件类型。例如,假设 main.cpp.bak 文件是一个C++的源文件,可以用命令 :set filetype=cpp 指定该文件的类型。

除此之外,还可以在文件中加入模式行来指明文件的类型。所谓Vim模式行,是指 Vim 在打开文件时,会自动在该文件首、尾的若干行 (具体行数由 modelines 选项决定,默认为5)检测是否具有 Vim 特殊标记的行。如果有检测到模式行,Vim 就会使用模式行中定义的选项值来修改该缓冲区的选项。

例如,Vim 所有的帮助文档源文件的最后一行都是类似 vim:tw=78:ts=8:ft=help:norl: 这样的模式行。

因此,针对上面举例的 main.cpp.bak 文件,我们可以在该文件的第一行或最后一行加上 /* vim: set fc=cpp */,要显式指定这个文件的类型。

/*vim: 间必须有空格,*/set ft=c 间也需要有至少一个空格,这是Vim模式行格式的要求。

vim-filetype

filetype plugin on

filetype plugin on 用于 Vim 打开加载文件类型插件功能。当这个选项打开时,Vim 会根据检测到的文件类型,在runtimepath中搜索该文件类型的所有插件并执行它们。

Vim 执行 filetype plugin on 命令时实际上是在执行 $VIMRUNTIME/ftplugin.vim 脚本。ftplugin.vim 脚本中设置了autocmd自动命令,指定在runtimepath中搜索对应文件类型的插件。runtimepath的定义在不同的系统上不一样,对UNIX系统来说,这些路径包括:$HOME/.vim$vim/vimfiles$VIMRUNTIME$vim/vimfiles/after$HOME/.vim/after

例如,当对一个c类型的文件设置 filetype plugin on 时,Vim 会在上述这几个目录的ftplugin子目录中搜索所有名为 c.vimc_*.vimc/*.vim 的脚本并执行它们。在搜索时,Vim 按目录在runtimepath中出现的顺序进行搜索。默认情况下,Vim 会执行 $vimRUNTIME/ftplugin/c.vim 脚本,设置c语言的注释格式、智能补全函数等等。

filetype indent on

filetype indent on 用于指定 Vim 为不同类型的文件定义不同的缩进格式。

Vim 执行该命令时实际上也是通过脚本 $VIMRUNTIME/indent.vim 来完成加载。与上面介绍的 filetype plugin on 选项类似,indent.vim脚本也通过设置autocmd自动命令在 runtimepath 的 indent 子目录中搜索缩进设置。对于c类型的文件来说,该脚本只是打开了 cindent 选项。

嗯,扫一扫就可以找到小女子我啦~