| 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指出我正确的部分).
When using a pattern that matches multiple lines,a change in one line may
cause a pattern to no longer match in a prevIoUs line. This means has to
start above where the change was made. How many lines can be specified with
the “linebreaks” argument. For example,when a pattern may include one line
break use this:
:Syntax sync linebreaks=1
The result is that redrawing always starts at least one line before where a
change was made. The default value for “linebreaks” is zero. Usually the
value for “minlines” is bigger than “linebreaks”.
这非常有效.
解决方法
au InsertLeave * Syntax synch minlines=50
不完美的解决方案.也许添加更多autocmds会有所帮助.这部分取决于您的文档将会是什么样子,它们将会有多大,您是如何编辑的.
有关帮助,请阅读有关语法同步的更多信息:: h syn-sync这不是同步的典型用法,因为据我所知,主要目的是当它们处于语法区域时自动搜索已编辑的行.您没有使用区域,因此您需要使用autocmd启动同步.也许你可以定义一个区域只是为了确保语法同步重新评估一组行的语法 – 不需要autocmd – 即使该区域不会用于突出显示.