定义一个取决于缩进级别

时间:2015-11-25 03:09:40

标签: vim syntax-highlighting vim-syntax-highlighting viml

我试图在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匹配参数,但我不能将它们删除,因为它只会为整条线着色。

对此有何帮助?

谢谢!

1 个答案:

答案 0 :(得分:3)

通过将::之前的文字与区域开始匹配,您确实阻止了其他语法规则的应用。我会通过正面看后来解决这个问题;即仅在::之前断言文本的规则,而不将其包括在匹配中。有了这个,你甚至不需要ms=e-1,因为区域开始唯一匹配的是::本身:

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

缩进仍将由\z(...\)捕获。