问题描述
我已经定义了我自己的 javascript 语法文件,它在 ~/.vim/Syntax/after/
问题是 /usr/share/vim/vim82/Syntax 中存在的默认语法文件与我的自定义语法文件一起加载(它似乎在我的自定义语法之前加载)。
结果是它与我的自定义语法冲突。
当然,我可以删除默认的(有效),但考虑到它只会在 vim 更新时放回那里,这似乎不是对问题的非常可靠的修复。
if !exists("main_Syntax")
" quit when a Syntax file was already loaded
if exists("b:current_Syntax")
finish
endif
let main_Syntax = 'javascript'
elseif exists("b:current_Syntax") && b:current_Syntax == "javascript"
finish
endif
但这也无济于事。
我也尝试将语法文件夹放在 .vim/Syntax 中,如官方 vim 页面所建议的那样,但这似乎根本没有做任何事情(例如,它根本没有被读取)。
谢谢。
解决方法
原则上,语法脚本的来源顺序如下:
~/.vim/syntax/foo.vim
$VIMRUNTIME/syntax/foo.vim
~/.vim/after/syntax/foo.vim
~/.vim/after/syntax/
排在最后。如果您正在编写内置语法脚本的完整替代品,这不是一个好地方,因为您至少有一个在您之前的语法脚本。另一方面,如果您想做的是添加自己的内容或有选择地覆盖之前设置的内容,这是一个好地方。
$VIMRUNTIME/syntax/
也不是一个好地方,因为它是一个系统范围的位置。 您的定制应该发生在您的 $HOME
中,对吗?
~/.vim/syntax/
首先是自定义语法脚本的理想位置,如果添加以下行:
let b:current_syntax = "javascript"
这是因为 $VIMRUNTIME/syntax/javascript.vim
以以下样板开头:
if !exists("main_syntax")
" quit when a syntax file was already loaded
if exists("b:current_syntax")
finish
endif
let main_syntax = 'javascript'
elseif exists("b:current_syntax") && b:current_syntax == "javascript"
finish
endif
本质上,如果设置了 b:current_syntax
则抛出毛巾,并以:
let b:current_syntax = "javascript"
“标记它的领土”,如果你愿意的话。
您不必检查任何东西,因为您是第一位的,但您仍然需要告诉其他语法脚本注意他们自己的事情。
请注意,不礼貌的语法脚本可能不会检查该缓冲区局部变量,因此完全有可能仍然存在冲突即使您在做正确的事情。但这就是 Vim 的本质。