如何以不同于其内容的方式突出显示代码块的标签?
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>
我想按如下方式着色:
- 标记
<start-1>
、</start-1>
为红色粗体。
<start-1>
和 </start-1>
之间的内容以红色斜体显示。
- 标记
<start-2>
、</start-2>
为粗体绿色。
<start-2>
和 </start-2>
之间的内容以绿色斜体显示。
- 标记
<start-3>
、</start-3>
为蓝色粗体。
<start-3>
和 </start-3>
之间的内容以蓝色斜体显示。
我试过了:
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 的其余部分),并且并非所有标签都是粗体。
如果我删除标签 t1
、t2
和 t3
,我会得到:
这表明所有文本着色都已正确完成。我想这意味着,不知何故,标签匹配给 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/ 存在——版主可以随意重新定位或删除它——我只是发布了答案以防它有帮助)。
我有这个代码:
<start-1>
some stuff here
<start-2>
some stuff here
</start-2>
<start-3>
some stuff here
</start-3>
some stuff here
</start-1>
我想按如下方式着色:
- 标记
<start-1>
、</start-1>
为红色粗体。 <start-1>
和</start-1>
之间的内容以红色斜体显示。- 标记
<start-2>
、</start-2>
为粗体绿色。 <start-2>
和</start-2>
之间的内容以绿色斜体显示。- 标记
<start-3>
、</start-3>
为蓝色粗体。 <start-3>
和</start-3>
之间的内容以蓝色斜体显示。
我试过了:
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 的其余部分),并且并非所有标签都是粗体。
如果我删除标签 t1
、t2
和 t3
,我会得到:
这表明所有文本着色都已正确完成。我想这意味着,不知何故,标签匹配给 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/ 存在——版主可以随意重新定位或删除它——我只是发布了答案以防它有帮助)。