定义取决于缩进级别的语法区域
Define a syntax region which depends on the indentation level
我正在尝试为 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::
它不会使我的规则起作用,因为有一个 "link" 规则接管了这种情况。这是因为 ms
和 me
匹配参数但我不能将它们取下,因为它只会给整行着色。
有什么帮助吗?
谢谢!
通过将 ::
之前的文本匹配为区域的开始,您确实阻止了其他语法规则在那里应用。我会通过正面回顾来解决这个问题;即只声明 ::
之前文本的规则,而不将其包含在匹配中。有了这个,您甚至不需要 ms=e-1
,因为唯一与区域开始匹配的是 ::
本身:
syn region rstLiteralBlock start=/\%(^\%(\.\.\)\@!\z(\s*\).*\)\@<=::$/ skip=/^$/ end=/^\z1\S/me=e-1
缩进仍会被 \z(...\)
捕获。
我正在尝试为 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::
它不会使我的规则起作用,因为有一个 "link" 规则接管了这种情况。这是因为 ms
和 me
匹配参数但我不能将它们取下,因为它只会给整行着色。
有什么帮助吗?
谢谢!
通过将 ::
之前的文本匹配为区域的开始,您确实阻止了其他语法规则在那里应用。我会通过正面回顾来解决这个问题;即只声明 ::
之前文本的规则,而不将其包含在匹配中。有了这个,您甚至不需要 ms=e-1
,因为唯一与区域开始匹配的是 ::
本身:
syn region rstLiteralBlock start=/\%(^\%(\.\.\)\@!\z(\s*\).*\)\@<=::$/ skip=/^$/ end=/^\z1\S/me=e-1
缩进仍会被 \z(...\)
捕获。