当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Vim语法和文件类型检测非常奇怪》经验,为你挑选了2个好方法。

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



1> Rich..:

对你的问题的简单回答是这些行根本不应该在你的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 rset ft=r你的vimrc的第一个版本,文件类型被设置为R.但是,请参见脚注1,了解为什么这不是最佳解决方案.

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



2> too much php..:

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

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有