3

我正在尝试在 Vim 中为 reStructuredText 构建一个更轻的语法文件。首先,当在行尾遇到 "::" 时,文字块开始:

I'll show you some code::

    if foo = bar then
        do_something()
    end

Literal blocks end when indentation level is lowered.

但是,文字块可以在缩进但不是文字的其他结构内:

.. important::


    Some code for you inside this ".. important" directive::

        Code comes here

    Back to normal text, but it is indented with respect to ".. important".

所以,问题是:如何制作一个检测压痕的区域?我使用以下规则做到了这一点:

syn region rstLiteralBlock  start=/^\%(\.\.\)\@!\z(\s*\).*::$/ms=e-1 skip=/^$/ end=/^\z1\S/me=e-1

它工作得很好,但有一个问题:出现在行中的任何匹配或区域应该由“start”匹配接管语法规则。例子:

Foo `this is a link and should be colored`_.  Code comes here::

它不会使我的规则起作用,因为有一个“链接”规则接管了这种情况。这是因为msme匹配的参数,但我不能把它们去掉,因为它只会给整条线着色。

有什么帮助吗?

谢谢!

4

1 回答 1

3

通过将 之前的文本匹配::为区域的开头,您确实可以阻止其他语法规则在此处应用。我会通过积极的向后看来解决这个问题;即只断言 之前的文本的规则::,而不将其包含在匹配中。有了这个,你甚至不需要ms=e-1, 因为与区域开始匹配的唯一东西就是它::本身:

syn region rstLiteralBlock  start=/\%(^\%(\.\.\)\@!\z(\s*\).*\)\@<=::$/ skip=/^$/ end=/^\z1\S/me=e-1

缩进仍将被\z(...\).

于 2015-11-25T09:22:36.217 回答