首页 > 解决方案 > Vim:语法匹配后的行也是语法匹配

问题描述

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

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

然后我想突出显示以下行 BLUE 无论它包含什么文本。

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

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

但这不起作用(我的理解是读取位置已经通过了匹配的部分\zs)。

所以我尝试了这样的“看后面”原子:

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

标签: vimsyntaxsyntax-highlighting

解决方案


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

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

推荐阅读