9

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

4

3 回答 3

11

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

在您的第一个版本中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。请注意,如果您在 vimrc 的第一个版本中更改该行setfiletype rset ft=r则文件类型设置为 r。但是,请参阅脚注 1 了解为什么这不是最佳解决方案。

4:...在一行代码中被注释:“最后检查一下,这只是猜测”

于 2011-02-17T16:52:23.977 回答
7

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

于 2009-08-18T05:31:18.033 回答
2

根据这个网站

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
于 2013-03-29T07:43:06.767 回答