我有一个名为WrongFileTypeDetection.R的文件,其中包含以下文本:
# This file is sometimes wrongly detected as a conf file
我也有两个版本的_vimrc,我认为它完全相同.但是,当我使用第一个版本时,上述文件被错误地检测为"conf"文件,即使我已经特别要求将所有以.R结尾的文件设置为filetype = r.当我更改为第二个版本(在augroup定义后面移动"语法")时,检测再次正常工作.请注意,这是我唯一的配置(我在调试时移走了我的标准vimrc).
第一版:
syntax on augroup filetypedetect autocmd! BufRead,BufNewFile *.r,*.R setfiletype r augroup END
第二版:
augroup filetypedetect autocmd! BufRead,BufNewFile *.r,*.R setfiletype r augroup END syntax on
似乎vimrc对这两个文件的特定顺序非常敏感.为什么会这样,考虑到其中一条线是一个自动命令,无论如何都要运行得更晚?这是Vim中的一个错误还是这个我不理解的功能?
对你的问题的简单回答是这些行根本不应该在你的vimrc中.官方支持的处理方法是filetype.vim
在.vim
目录中创建一个包含以下内容的文件:
" my filetype file if exists("did_load_filetypes") finish endif augroup filetypedetect au! BufRead,BufNewFile *.r setfiletype r augroup END
至于为什么你的代码表现如何,它实际上比@too多得多的PHP答案暗示要复杂一些.
在您的第一个版本中vimrc
,文件类型检测由您的syntax on
行初始化.这可以通过设置一个autocmd来在打开带有.r
扩展名的文件时触发,并且此autocmd s:FTr()
在filetype.vim中调用该函数.
但是,您的autocmd!
行会覆盖此现有的autocmd 1,因此该s:FTr()
函数永远不会运行2.然后,您的autocmd将触发,但它不会设置文件类型,因为该setfiletype
命令认为文件类型已设置为3.
然后,因为文件类型仍未实际设置,Vim会尝试根据文件的内容分配一个文件类型,并最终将其分配给conf
类型4.
这一切的最佳参考是:help filetype
.特别在你的情况:help new-filetype
和:help remove-filetype
.该:verbose
命令对于确定哪些设置已由哪个脚本设置也非常方便.
1:因为!
.如果你要删除它!
,那么你会发现文件类型设置正确.但这不是正确的解决方案,因为那时您将允许将文件设置为一种类型(并应用该文件类型的所有设置),然后将其更改为另一种类型.如果第二个文件类型没有覆盖所有这些设置,则可能会保留一些,这可能不是您想要的.
2::set autocmd BufRead *.r
当您使用两个不同的vimrc文件时尝试运行.注意给出的输出的差异.
3:见:help setfiletype
.请注意,如果你改变线路setfiletype r
到set ft=r
你的vimrc的第一个版本,文件类型将被设置为R.但是,请参见脚注1,了解为什么这不是最佳解决方案.
4:...在一行评论中:"最后检查,它只是在猜测"
在第一个版本中,语法on是在添加自动命令之前触发文件类型检测.