gpt4 book ai didi

syntax-highlighting - Vim语法和文件类型检测非常奇怪的行为

转载 作者:行者123 更新时间:2023-12-03 15:59:39 25 4
gpt4 key购买 nike

我有一个名为WrongFileTypeDetection.R的文件,其中包含以下文本:

# This file is sometimes wrongly detected as a conf file

我也有_vimrc的两个版本,我认为它们是绝对相同的。但是,当我使用第一个版本时,即使我特别要求将所有以.R结尾的文件都设置为filetype = r,上述文件仍被错误地检测为“conf”文件。当我更改为第二个版本时(将“语法打开”移到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中的错误还是我只是不了解的功能?

最佳答案

对于您的问题的简单答案是,这些行根本不应该出现在您的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行初始化。这是通过将autocmd设置为在打开带有 .r扩展名的文件时触发来实现的,并且该autocmd在filetype.vim中调用函数 s:FTr()

但是,您的 autocmd!行会覆盖此现有的autocmd1,因此 s:FTr()函数将永远不会运行。然后,您的autocmd将被触发,但是它没有设置文件类型,因为 setfiletype命令认为该文件类型已经被设置。

然后,由于实际上仍未设置文件类型,因此Vim尝试根据文件的内容分配一个文件,并最终将其分配给 conf type4。

最好的引用是 :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:...在一行被注释的代码中:“最后检查一下,这只是猜测”

关于syntax-highlighting - Vim语法和文件类型检测非常奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1291955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com