我正在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
结果是重绘总是在a之前至少开始一行 改变了。 “linebreaks”的默认值为零。通常是 “minlines”的值大于“linebreaks”。
这很有效。
答案 0 :(得分:2)
您可以尝试自动执行语法同步操作。例如,尝试将其放入InsertEnter autocmd,这将在退出插入模式时同步语法:
au InsertLeave * syntax synch minlines=50
不是一个完美的解决方案。也许添加更多autocmds会有所帮助。这部分取决于您的文档将会是什么样子,它们将会有多大,您是如何编辑的。
如需帮助,请阅读有关语法同步的更多信息::h syn-sync
这不是同步的典型用法,因为据我所知,主要目的是当它们处于语法区域时自动搜索已编辑的行。您没有使用区域,因此您需要使用autocmd启动同步。也许你可以定义一个区域只是为了确保语法同步重新评估一组行的语法 - 不需要autocmd - 即使该区域不会用于突出显示。