Vim中&filetype和&syntax为空,全局自定义语法高亮配置求助
我明白你遇到的麻烦了——想把after/syntax/custom.vim里的高亮规则套用到所有文件类型,但直接在.vimrc里用&syntax或者&filetype时,这俩变量总是空的,根本没法用。
问题根源
这其实是Vim加载顺序的问题:当你在.vimrc里执行这些代码时,Vim还没打开任何文件呢!此时&syntax和&filetype自然是空字符串,赋值给f_type当然没效果。得等Vim加载完文件、确定了当前文件的语法类型后,再去执行你的自定义设置。
解决方案一:利用缓冲区事件动态设置语法
可以用BufEnter事件(当进入缓冲区时触发),此时文件已经加载,&syntax已经有了有效值。把下面这段代码放到你的.vimrc里:
augroup CustomSyntaxExtend autocmd! " 先清空之前的同名自动命令,避免重复触发 autocmd BufEnter * execute printf("setlocal syntax=%s.custom", &syntax) augroup END
setlocal确保只修改当前缓冲区的语法设置,不会影响全局&syntax此时已经是当前文件的语法类型(比如python、markdown等),拼接成python.custom后,Vim就会加载原语法+你的custom.vim扩展
如果担心某些文件没有语法设置导致报错,可以加个判断,只在有语法时执行:
augroup CustomSyntaxExtend autocmd! autocmd BufEnter * if exists("b:current_syntax") | execute printf("setlocal syntax=%s.custom", b:current_syntax) | endif augroup END
b:current_syntax是缓冲区局部变量,只有当语法被正确设置后才存在,比&syntax更可靠。
解决方案二:直接全局加载自定义高亮规则
如果你的custom.vim里是通用的高亮规则(比如匹配特定关键词、注释格式等,不依赖特定文件类型),其实不用修改syntax值,直接让Vim在所有语法加载后自动执行你的规则就行。
把下面这段代码放到.vimrc:
augroup GlobalCustomHighlights autocmd! autocmd Syntax * source $HOME/.vim/after/syntax/custom.vim augroup END
Syntax事件会在任何文件的语法加载完成时触发,此时执行source命令加载你的自定义规则,就能直接把高亮应用到当前文件。
另外还有个更简单的方法:把custom.vim重命名为all.vim,放到after/syntax/目录下。Vim有个默认机制,会在加载完任何语法文件后,自动执行after/syntax/all.vim里的内容,连自动命令都不用写!
内容的提问来源于stack exchange,提问作者John

