编写Vim的C3语法文件,ModuleName与ModuleKeyword高亮冲突求助
Vim C3语法高亮冲突解决办法
问题根源
Vim语法匹配规则里,syntax keyword的优先级高于syntax match。当ModuleKeyword匹配了module关键字后,ModuleName规则中包含module的部分已被占用,导致整个match规则无法触发,后面的模块名自然无法高亮。
解决步骤
用nextgroup关联关键字和后续模块名,让两者依次匹配互不干扰:
- 修改关键字规则,添加
nextgroup指定后续要匹配的模块名规则,同时跳过空格:
syntax keyword ModuleKeyword module nextgroup=ModuleName skipwhite
- 调整模块名规则,去掉前面的
\<module\>\s*部分,加上contained表示该规则仅被nextgroup触发:
syntax match ModuleName "\<[a-z][a-zA-Z0-9_]*\ze;" display contained
如果需要支持层级模块名(比如engine.main这类带点的格式),把模块名的匹配模式改成:
syntax match ModuleName "\<[a-z][a-zA-Z0-9_.]*\ze;" display contained
导入语句的模块名高亮
对于导入语句里的模块名,可套用同样逻辑处理:
syntax keyword ImportKeyword import nextgroup=ImportModuleName skipwhite syntax match ImportModuleName "\<[a-z][a-zA-Z0-9_.]*\ze;" display contained
这样import作为关键字高亮,后面的层级模块名也能正常触发高亮。
内容的提问来源于stack exchange,提问作者PalsFreniers
相关产品推荐
相关产品推荐

