我试图在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::
它不会使我的规则有效,因为有一个"链接"接管情况的规则。这是因为ms
和me
匹配参数,但我不能将它们删除,因为它只会为整条线着色。
对此有何帮助?
谢谢!
答案 0 :(得分:3)
通过将::
之前的文字与区域开始匹配,您确实阻止了其他语法规则的应用。我会通过正面看后来解决这个问题;即仅在::
之前断言文本的规则,而不将其包括在匹配中。有了这个,你甚至不需要ms=e-1
,因为区域开始唯一匹配的是::
本身:
syn region rstLiteralBlock start=/\%(^\%(\.\.\)\@!\z(\s*\).*\)\@<=::$/ skip=/^$/ end=/^\z1\S/me=e-1
缩进仍将由\z(...\)
捕获。