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
我想突出显示与此正则表达式 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