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

これはかなり問題なく動作しますが、問題があります。「開始」によって一致する必要がある行に表示される一致または領域は、構文規則を引き継いでしまいます。例:

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

状況を引き継ぐ「リンク」ルールがあるため、私のルールは機能しません。これは、msおよびme一致するパラメーターが、行全体に色を付けるだけなので、それらを取り除くことができないためです。

それについて何か助けはありますか?

ありがとう!

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 に答える