Vim语法高亮显示几行匹配

uds*_*cbt 5 regex vim syntax-highlighting

我正在vim上实现一个语法文件来突出显示这样的层次结构

| text at level 1
| | text at level 2
| | text at level 2
| | | text at level 3
| text at level 1
Run Code Online (Sandbox Code Playgroud)

比如我用

syn match myMatch +^\(| \)\++
Run Code Online (Sandbox Code Playgroud)

突出水平指标.但是,我还要强调这些错误的模式

| text at level 1
| | | text at level 3
Run Code Online (Sandbox Code Playgroud)

这会使水平增加一个以上.我写了以下语法匹配

syn match myWrongMatch +^\(\(| \)*\)\(\n\|[^|].*\n\)\1\(| \)\{2,}+
Run Code Online (Sandbox Code Playgroud)

它可能不是最佳的,但它可以完成工作.问题是匹配是由正在编辑的行上的vim检查的,这样如果我通过删除第二行上的级别来修复错误,它将停止突出显示第二行,但仍然突出显示第一行,直到我也编辑它(比如删除并重写一个字符).

这个问题是我只能使用下一行信息匹配一行,而不是相反.由于这与正则表达式匹配似乎不可能,我想知道是否有可能要求v​​im检查当前编辑的行和前一行(或更广泛的上下文)中的匹配?另一个解决方案可能是通过检查上下文的区域来实现它,但到目前为止我还没有成功.

编辑:答案实际上在vim帮助:syn-sync-linebreaks(感谢Herbert Sitz指出我正确的部分).

使用匹配多行的模式时,一行中的更改可能导致模式在前一行中不再匹配.这意味着必须从更改的位置开始.可以使用"linebreaks"参数指定多少行.例如,当一个模式可能包含一个换行符时,请使用:

:syntax sync linebreaks=1
Run Code Online (Sandbox Code Playgroud)

结果是,在进行更改之前,重绘始终至少从一行开始."linebreaks"的默认值为零.通常,"minlines"的值大于"linebreaks".

这非常有效.

Her*_*itz 2

您可以尝试自动化语法同步操作。例如,尝试将其放入 InsertEnter autocmd 中,每当您退出插入模式时,它将同步语法:

au InsertLeave * syntax synch minlines=50
Run Code Online (Sandbox Code Playgroud)

不是一个完美的解决方案。也许添加更多自动命令会有所帮助。这部分取决于您的文档的外观、它们的大小以及您的编辑方式。

如需帮助,请阅读有关语法同步的更多信息::h syn-sync 这不是同步的典型用途,因为据我了解,主要目的是在编辑行位于语法区域时自动搜索它们。您没有使用区域,因此您需要使用 autocmd 启动同步。也许您可以定义一个区域,只是为了确保语法同步重新评估行组上的语法——无需 autocmd——即使该区域不会用于突出显示。