【问题标题】:Vim: Line Following Syntax Match is also a Syntax MatchVim:语法匹配后的行也是语法匹配
【发布时间】:2019-10-04 22:22:21
【问题描述】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多