首页 > 解决方案 > 排除 vim 语法高亮的模式

问题描述

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

这是我在 rst 文件中查看的文本示例:

.. 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

标签: regexvimvim-syntax-highlighting

解决方案


与现有语法脚本(此处:)集成时$VIMRUNTIME/syntax/rst.vim,您需要考虑现有语法组。:syn list显示所有活动组,但安装SyntaxAttr.vim 时会更容易 - 在光标插件下显示字符的语法突出显示属性。(我维护一个扩展的叉子。)

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

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

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

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

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

hi link rstHeading Title

推荐阅读