如何以不同于其内容的方式突出显示代码块的标签?

How to highlight tags of a code block differently than its content?

我有这个代码:

<start-1>
  some stuff here
  <start-2>
    some stuff here
  </start-2>
  <start-3>
    some stuff here
  </start-3>
  some stuff here
</start-1>

我想按如下方式着色:

我试过了:

syntax region start1 start=/<start-1>/ end=/<\/start-1>/ contains=t1,start2,start3
syntax region start2 start=/<start-2>/ end=/<\/start-2>/ contained contains=t2
syntax region start3 start=/<start-3>/ end=/<\/start-3>/ contained contains=t3

syntax match t1 /<\/\?start-1>/ contained
syntax match t2 /<\/\?start-2>/ contained
syntax match t3 /<\/\?start-3>/ contained

hi t1 ctermfg=red cterm=bold
hi t2 ctermfg=green cterm=bold
hi t3 ctermfg=blue cterm=bold

hi start1 ctermfg=red cterm=italic
hi start2 ctermfg=green cterm=italic
hi start3 ctermfg=blue cterm=italic

但失败如下:

并非所有内容都正确着色(即绿色侵入了所有蓝色 space,以及红色 space 的其余部分),并且并非所有标签都是粗体。

如果我删除标签 t1t2t3,我会得到:

这表明所有文本着色都已正确完成。我想这意味着,不知何故,标签匹配给 region 知道其边界的人带来了麻烦。

问题:

以下仅供参考。最佳答案在@nickspoon 的评论部分。


解决方案是添加 keepend 如下:

syntax region start1 start=/<start-1>/ end=/<\/start-1>/ keepend contains=t1,start2,start3
syntax region start2 start=/<start-2>/ end=/<\/start-2>/ keepend contained contains=t2
syntax region start3 start=/<start-3>/ end=/<\/start-3>/ keepend contained contains=t3

syntax match t1 /<\/\?start-1>/ contained
syntax match t2 /<\/\?start-2>/ contained
syntax match t3 /<\/\?start-3>/ contained

hi t1 ctermfg=red cterm=bold
hi t2 ctermfg=green cterm=bold
hi t3 ctermfg=blue cterm=bold

hi start1 ctermfg=red cterm=italic
hi start2 ctermfg=green cterm=italic
hi start3 ctermfg=blue cterm=italic

(sry 不知道 https://vi.stackexchange.com/ 存在——版主可以随意重新定位或删除它——我只是发布了答案以防它有帮助)。