Vim语法和文件类型检测非常奇怪

时间:2009-08-18 05:24:34

标签: syntax-highlighting vim file-type

我有一个名为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中的一个错误还是这个我不理解的功能?

3 个答案:

答案 0 :(得分:10)

你的问题的简单答案是这些行根本不应该在你的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 much php's answer暗示的要复杂得多。

vimrc的第一个版本中,文件类型检测由您的syntax on行初始化。这可以通过在打开具有.r扩展名的文件时设置要触发的autocmd,并且此autocmd在filetype.vim中调用函数s:FTr()

但是,您的autocmd!行会覆盖此现有的autocmd 1 ,因此s:FTr()函数永远不会运行 2 。然后启动你的autocmd,但没有设置文件类型,因为setfiletype命令认为文件类型已经设置为 3

然后,因为文件类型仍未实际设置,Vim会尝试根据文件内容分配一个文件类型,最后将其分配给conf类型 4 。< / p>

所有这一切的最佳参考是:help filetype。特别是在您的案例中:help new-filetype:help remove-filetype:verbose命令对于确定哪些设置已由哪个脚本设置非常方便。

1:由于!。如果您要删除此!,那么您会发现文件类型设置正确。但这不是正确的解决方案,因为那时您将允许将文件设置为一种类型(并应用该文件类型的所有设置),然后将其更改为另一种类型。如果第二个文件类型没有覆盖所有这些设置,则可能会保留一些,这可能不是您想要的。

2:当您使用两个不同的vimrc文件时,尝试运行:set autocmd BufRead *.r。请注意给定输出的差异。

3:见:help setfiletype。请注意,如果您在vimrc的第一个版本中将行setfiletype r更改为set ft=r,则文件类型设置为r。但是,请参见脚注1,了解为什么这不是最佳解决方案。

4:...在一行评论中:“最后检查,只是在猜测”

答案 1 :(得分:7)

在您的第一个版本中,上的语法在添加自动命令之前触发文件类型检测

答案 2 :(得分:1)

根据这个网站

  

http://www.build-doctor.com/2008/06/04/how-to-set-the-filetype-in-vim-when-the-extension-doesnt-match/

您只需在.vimrc文件中添加两行代码即可。

au BufRead,BufNewFile *.R set filetype=r
au BufRead,BufNewFile *.r set filetype=r