如何在 VIM 语法突出显示中将已匹配区域内的文本标记为粗体?

How do I mark text bold inside an already matched region in VIM syntax highlighting?

给出类似的东西:

This is \f random text \b and more \f* and then some more.

我无法确定优先级,所以加粗和着色都出现了。

syn match footnoteEnd /\f\*/
syn match footnoteStart /\f/
syn match footnoteBTag /\f/
syn region footnoteInfo start=/\f/ end=/\f\*/

hi def footnoteInfo guifg=grey
hi def footnoteStart gui=bold
hi def footnoteBTag gui=bold
hi def footnoteEnd gui=bold

如有任何帮助,我们将不胜感激。

你可以试试这个:

syn match footnoteDelimiter /\f\*\?/ contained
syn match footnoteBTag /\b/ contained
syn region footnoteInfo start=/\f/ end=/\f\*/ contains=footnoteDelimiter,footnoteBTag keepend

hi def footnoteInfo guifg=grey
hi def footnoteBTag gui=bold guifg=grey
hi def footnoteDelimiter gui=bold guifg=grey

解释:

  • 当 Vim 到达区域末尾时,它会在 footnoteEnd 之前再次匹配 footnoteStart,然后 * 永远不会变为粗体。这就是为什么我建议改用 footnoteDelimiter

  • contained 参数已添加到 footnoteDelimiterfootnoteBTag,因为它们出现在一个区域中。

  • contains=footnoteDelimiter,footnoteBTag 指定允许哪些语法组进入该区域。

  • keepend 使外部区域的结束模式的匹配也结束任何包含的项目。