Vim多自定义语法高亮失效求助:仅首个区域生效
解决Vim多语言自定义语法高亮仅第一个生效的问题
修改后的配置代码
" 全局启用语法高亮,仅执行一次 syntax on augroup CustomSyntaxGroup autocmd! " 清空组内原有自动命令,避免重复定义 autocmd BufRead,BufNewFile * call CustomSyntax() augroup END function! CustomSyntax() " 导入HTML语法并定义高亮区域 syntax include @HTML syntax/html.vim syntax region htmlSnip matchgroup=SnipHTML start="html`" end="`" contains=@HTML keepend " 导入JSON语法并定义高亮区域 syntax include @JSON syntax/json.vim syntax region jsonSnip matchgroup=SnipJSON start="json`" end="`" contains=@JSON keepend " 导入CPP语法并定义高亮区域 syntax include @CPP syntax/cpp.vim syntax region cppSnip matchgroup=SnipCPP start="@begin=cpp@" end="@end=cpp@" contains=@CPP keepend endfunction
问题原因及修正说明
- 移除函数内的
syntax on:syntax on是全局语法初始化命令,每次执行都会重置Vim的语法状态,覆盖之前定义的自定义规则。将它放在全局仅执行一次,避免重复重置导致后续规则失效。 - 用augroup管理自动命令:通过
augroup配合autocmd!,确保每次加载配置时不会重复创建相同的自动命令,避免多次调用CustomSyntax引发的语法规则冲突。 - 添加
keepend参数:该参数能防止Vim解析语法区域时,后续规则覆盖当前区域的结束标记,确保每个自定义区域的边界被正确识别。
如果某类语言仍未高亮,可通过:echo findfile('syntax/html.vim', &runtimepath)替换文件名检查对应语法文件是否存在于Vim的运行路径中。
内容的提问来源于stack exchange,提问作者Yousef El-Zebdeh
相关产品推荐
相关产品推荐

