非常奇怪的行为与Vim语法和文件类型的检测
-
18-09-2019 - |
题
我有一个文件,称为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 r
入 set ft=r
在第一个版本的你vimrc,filetype 将 被设置为r.然而,见脚注1对于为什么这不是最好的解决办法。
4:...在一条线上的代码表示:"检查最后一个,这只是猜测"
其他提示
在你的第一个版本, 语法上 是触发的文件类型的检测 之前 你autocommand已经增加。
根据这个网站
你只需要添加两条线中的代码。vimrc文件。
au BufRead,BufNewFile *.R set filetype=r
au BufRead,BufNewFile *.r set filetype=r