Vim: Line Following Syntax Match 也是语法匹配

Vim: Line Following Syntax Match is also a Syntax Match

我想突出显示与此正则表达式 RED 匹配的行:

syn match RedLine "^\*\*\*  .*  \*\*\*\n"

然后我想用蓝色突出显示下面一行,不管它包含什么文本。

我尝试使用 \zs 来匹配以下行的模式,如下所示:

syn match BlueLine "^\*\*\*  .*  \*\*\*\n\zs.*"

但这不行(我的理解是读取位置已经超过\zs之前的匹配部分)。

所以我尝试了这样的 "look behind" 原子:

syn match BlueLine "\(^\*\*\*  .*  \*\*\*\n\)\@50<=.*"

但即使有 50 字节的限制,这也太慢了。

当上一行与特定模式匹配时,如何始终匹配整行?

例如

***  this line's RED since it's surrounded by pairs of 3 stars  ***
this line's always BLUE because of the preceding line

您实际上不需要重新解析第一行来捕获第二行(这确实非常低效)。 Vim 有 :help :syn-nextgroup,它指示解析器继续优先解析指定的组。 skipnl 关键字跳过中间的换行符。当您不加选择地想要突出显示整个下一行时,一个简单的 .* 模式就可以了。该规则唯一重要的细节是 contained 关键字,因此该规则仅匹配由 nextgroup= 触发的,但绝不会单独匹配(这会使整个缓冲区变成蓝色)。

syn match RedLine "^\*\*\*  .*  \*\*\*$" skipnl nextgroup=BlueLine
syn match BlueLine ".*" contained