vim - 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
解决方案
您实际上不需要重新解析第一行来捕获第二行(这确实是非常低效的)。Vim has :help :syn-nextgroup
,它指示解析器继续优先解析指定的组。skipnl
关键字跳过中间的换行符。当您不加选择地想要突出显示整个下一行时,一个简单的.*
模式就可以了。该规则唯一重要的细节是contained
关键字,因此该规则仅匹配由 触发的nextgroup=
,但绝不会单独匹配(这会将整个缓冲区着色为蓝色)。
syn match RedLine "^\*\*\* .* \*\*\*$" skipnl nextgroup=BlueLine
syn match BlueLine ".*" contained
推荐阅读
- javascript - 使用递归js在树状对象中查找最小值和最大值
- javascript - 有没有办法在 ReactJS 中获取 mobx 可观察变量地址
- oracle-apex - 显示页面加载 APEX 时隐藏的区域
- pyspark - 增量文件版本的 Pyspark 结构化流错误
- java - 使用 Spring Data Cassandra,表名被注释到 Bean。如何为同一个 bean 类设置多个表/存储库?
- android - Dart 列表中对象的比较
- reactjs - 有没有办法以内联样式设置多个三元语句?
- python - 由于 cookie,无法自动执行注册过程
- c# - 为附加的 MDF 文件创建连接字符串
- android - Android Studio:找不到运行测试选项