2011-11-23 64 views
5

我在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”。

这个效果很好。

回答

2

您可以尝试自动执行语法同步操作。例如,尝试把这个在InsertEnter自动命令,只要你退出插入模式,这将同步语法:

au InsertLeave * syntax synch minlines=50 

不是一个完美的解决方案。也许增加更多的autocmds会有所帮助。它部分取决于你的文档将会是什么样子,它们将会变得多大,以及如何编辑。

有关帮助,请阅读有关语法同步的更多信息::h syn-sync 这不是典型的同步使用,因为据我了解,主要目的是在语法区域中自动搜索所编辑的行。您不使用区域,所以您需要使用autocmd启动同步。也许你可以定义一个区域,只是为了确保语法同步重新评估一组行的语法而不需要autocmd - 即使该区域不会用于高亮显示。

+0

感谢您的参考,我在:h syn-sync中找到了我想要的。我不知道这部分。 autocmds看起来很强大,当我想要一些尚未实现的东西时(如果它发生的话),我会看看它们。这是我的第一个问题,所以我没有足够的声望让你回答对不起。 – udscbt

+0

@ user1061133 - 哈,没问题。很适合我学习syn-sync-linebreak选项。它似乎是minlines的一个副本。也就是说,尽管'minlines'设置了在语法区域中进行更改时要检查的行数,'linebreak'选项会在语法匹配中设置更改时检查行。正是你在找什么。 。 。 –