gpt4 book ai didi

regex - 多行匹配的 Vim 语法高亮显示

转载 作者:行者123 更新时间:2023-12-04 21:23:15 31 4
gpt4 key购买 nike

我正在 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 检查当前编辑行和前一行中的匹配项 (或更广泛的背景)?另一种解决方案可能是通过检查上下文的区域来实现这一点,但到目前为止我没有成功。

编辑 :答案实际上在 :syn-sync-linebreaks 的 vim 帮助中(感谢 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".



这完美地工作。

最佳答案

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

au InsertLeave * syntax synch minlines=50

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

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

关于regex - 多行匹配的 Vim 语法高亮显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8237492/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com