排除 vim 语法突出显示的模式

Excluding the pattern for vim syntax highlighting

我正在尝试调整 vim 中的重组文本语法突出显示。我已经尝试了几个 vim 正则表达式来突出显示以下两个示例,但我做不到。如果我使用 search/highlight 函数,所有下面的正则表达式都可以完成这项工作,但对于荧光笔(syn 匹配)它不起作用。也许我需要将同步匹配更改为其他内容?

这是我在第一个文件中查看的文本示例:

.. item:: This is the title I want to highlight

    there is some text here which I do not care

.. item-matrix:: This is the title I want to highlight
    :source: XX
    :target: YY

匹配文本的正则表达式:

[.+].*[:+] \zs.*
\(.. .*:: \)\zs.*

将其放入同步匹配时不起作用 (.vim):

syn match rstHeading /[.+].*[:+] \zs.*/

我知道我很接近因为上面的例子匹配

..:: This is highlighted as rstHeading

与现有语法脚本(此处:$VIMRUNTIME/syntax/rst.vim)集成时,您需要考虑现有语法组。 :syn list 显示所有活动组,但安装 SyntaxAttr.vim - Show syntax highlighting attributes of character under cursor plugin. (I maintain an extended fork 后更容易。)

在您的示例标题中,我看到 .. item:: 部分与 rstExplicitMarkup 匹配,其余部分(您要突出显示的内容)与 rstExDirective 匹配。

假设您想要集成(而不是完全覆盖)这些,您需要将语法组 contained 包含在后者中。这可以通过 containedin=rstExDirective.

完成

另一个陷阱是 \zs 限制了突出显示,但在内部仍然匹配整个文本。结合语法突出显示,这意味着现有的 rstExplicitMarkup 会阻止匹配您的模式。如果你使用 positive lookbehind (:help /\@<=),它将起作用:

syn match rstHeading /\%([.+].*[:+] \)\@<=.*/ containedin=rstExDirective

当然,要真正看到任何突出显示,您还需要定义或link一个突出显示组到您的新语法组:

hi link rstHeading Title