扩展语法匹配区域

Extend syntax match region

Vim 的 Javascript 语法文件定义了一行注释的区域

syn match   javaScriptLineComment      "\/\/.*" contains=@Spell,javaScriptCommentTodo

规则javaScriptCommentTodo高亮了某些关键词,但我想用不同的颜色高亮其他关键词:

syn keyword jsCommentMark FEATURE SOURCE NOTE 
hi jsCommentMark ctermfg=130 guifg=#af5f00 "rgb=175,95,0

作为快速修复,我在我的后语法文件中重新定义了原始规则:

syn match   javaScriptLineComment      "\/\/.*" contains=@Spell,javaScriptCommentTodo,jsCommentMark

是否有更简洁的方法来扩展已定义规则的 "contains" 值?

是的,语法集群 是一个内置的抽象,可以实现这一点。如需演示,请查看 $VIMRUNTIME/syntax/sh.vim:

syn cluster shCommentGroup  contains=shTodo,@Spell
syn keyword shTodo  contained       COMBAK FIXME TODO XXX
syn match   shComment       "^\s*\zs#.*$"   contains=@shCommentGroup

这里,shComment包含一个语法簇(@shCommentGroup),其唯一的默认成员是shTodo

有了这个,您可以添加额外的语法组(例如在 ~/.vim/after/syntax/sh.vim 中),如下所示:

syn match shMyGroup ...
hi shMyGroup ...
syn cluster shCommentGroup add=shMyGroup

由于这是一个高级概念,大多数语法文件不使用这种机制。如果您对可维护性和纯度有强烈的感觉,您可以联系 Javascript 语法的作者,并建议/提交增强。 IMO 您当前的解决方法也很好。