我有一个文件,称为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是非常敏感的特定订购的两个文件。为什么会这样,考虑到其中一条线路是一个autocommand将运行很久以后?这是一个错误,在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

为什么你的代码表现如何,它的确,它实际上是相当复杂得多 @太多php的答案 暗示。

在第一个版本的你 vimrc,的文件类型检测是初始化过你 syntax on 线。这一工作通过设立一个autocmd开火时,一个文件 .r 扩展开,这autocmd的电话功能 s:FTr() 在文件类型.vim。

然而,你的 autocmd! 线复盖现有autocmd1, ,所以 s:FTr() 功能永远不会运行2.你autocmd然后触发的,但它 不不 设置文件类型,因为 setfiletype 命令认为,该文件类型已经设置的3.

然后,因为该文件类型仍然是不实际上,Vim试图将一个基于该文件的内容,并最终将其分配到的 conf 类型4.

最佳的参考,所有这一切都是 :help filetype.和具体地在你的情况 :help new-filetype:help remove-filetype.的 :verbose 命令也是非常方便对找出的设置已设定通过什么剧本。

1:因 !.如果你要删除这个 !, 然后你会发现的文件类型的设置是否正确。这是不正确的解决方案,但是,因为然后你就可允许的文件被设置为一个类型(并施加的所有设置这一文件类型)和随后改变到另一个。如果第二filetype并不复盖所有这些设置,有些人可能仍然存在,这可能不是你想要的。

2:试试运行 :set autocmd BufRead *.r 如果您使用的是两个不同的vimrc文件。注意到差异的产出给予。

3:看看 :help setfiletype.请注意,如果你改变线路 setfiletype rset ft=r 在第一个版本的你vimrc,filetype 被设置为r.然而,见脚注1对于为什么这不是最好的解决办法。

4:...在一条线上的代码表示:"检查最后一个,这只是猜测"

其他提示

在你的第一个版本, 语法上 是触发的文件类型的检测 之前 你autocommand已经增加。

根据这个网站

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top