gpt4 book ai didi

vim - 定义取决于缩进级别的语法区域

转载 作者:行者123 更新时间:2023-12-01 13:48:26 24 4
gpt4 key购买 nike

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

I'll show you some code::

if foo = bar then
do_something()
end

Literal blocks end when indentation level is lowered.

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

.. 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 匹配参数但我不能将它们取下,因为它只会给整行着色。

有什么帮助吗?

谢谢!

最佳答案

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

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

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

关于vim - 定义取决于缩进级别的语法区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33907858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com