我在VIM执行语法文件突出这样Vim的语法高亮匹配上几行
| text at level 1
| | text at level 2
| | text at level 2
| | | text at level 3
| text at level 1
例如一个层次我使用
syn match myMatch +^\(| \)\++
突出一级指标。但是,我也想突出显示类似这样的错误模式
| text at level 1
| | | text at level 3
其中增加了多个级别。我写了以下语法匹配
syn match myWrongMatch +^\(\(| \)*\)\(\n\|[^|].*\n\)\1\(| \)\{2,}+
它可能不是最佳的,但它可以完成这项工作。问题在于vim在正在编辑的行上检查匹配,所以如果我通过删除第二行上的级别来修复错误,它将停止突出显示第二行,但仍然突出显示第一行,直到我还编辑它(如删除和重写一个字符)。
这个问题是,我只能使用下一行信息匹配一行,而不是相反。由于这似乎不可能与正则表达式匹配,我想知道是否可以请vim检查当前编辑的行和前一个(或更广泛的上下文)匹配?另一个解决方案可能是通过一个检查上下文的区域来实现,但迄今为止我一直没有成功。
编辑:答案实际上是在vim帮助:syn-sync-linebreaks(感谢Herbert Sitz指点我的右边部分)。
当使用与多行匹配的模式时,一行中的更改可能导致模式不再匹配上一行。这意味着必须从上面的 开始进行更改。可以使用 “linebreaks”参数指定多少行。例如,当一个图案可以包括一个线 破使用此:
:syntax sync linebreaks=1
其结果是,重画总是启动其中 做出更改之前的至少一条线。 “linebreaks”的默认值为零。通常“minlines”的 值大于“linebreaks”。
这个效果很好。
感谢您的参考,我在:h syn-sync中找到了我想要的。我不知道这部分。 autocmds看起来很强大,当我想要一些尚未实现的东西时(如果它发生的话),我会看看它们。这是我的第一个问题,所以我没有足够的声望让你回答对不起。 – udscbt
@ user1061133 - 哈,没问题。很适合我学习syn-sync-linebreak选项。它似乎是minlines的一个副本。也就是说,尽管'minlines'设置了在语法区域中进行更改时要检查的行数,'linebreak'选项会在语法匹配中设置更改时检查行。正是你在找什么。 。 。 –