扩展语法匹配区域
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 您当前的解决方法也很好。
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 您当前的解决方法也很好。