【问题标题】:Correct (and stable) vim syntax highligthing with multi-line matches正确(且稳定)vim 语法高亮与多行匹配
【发布时间】:2018-06-21 08:39:03
【问题描述】:

我正在尝试创建一个具有多行匹配的 vim 语法文件,但是如果当当前行出现在多行匹配之后时 vim 重绘缓冲区,这会导致不正确的语法突出显示。

例如,我希望 vim 使用此标准(并按此顺序)应用以下颜色:

  • 颜色 A:任意两条相邻线的集合,如果第一条由以下组成 一个或多个“=”字符

  • 颜色 B:如果行以 '-' 开头

  • 颜色 C:所有其他线条

我已经尝试过使用以下 vim 语法命令:

syn clear
syn sync linebreaks=2
syn sync minlines=10
syn sync maxlines=1000

syn match colora '^=\+\n.*' display
syn match colorb '^-.*' display
syn match colorc '^[^=-].*' display

highlight colora ctermfg=DarkRed  cterm=bold
highlight colorb ctermfg=DarkGreen cterm=bold
highlight colorc ctermfg=DarkCyan

但正如我提到的并且可以从屏幕截图中看到,在编辑文件时,有时多行匹配的第二行会从颜色 A 切换到颜色 C。这可能可以通过同步选项修复,但我出于性能原因,希望避免从文件开头同步。

截图:

【问题讨论】:

  • 有一个vim stackexchange,这个问题可能更适合它。 YMMV。
  • 首先,您似乎在图片中混淆了Color CColor B。其次,这是没有意义的,Color A 主动匹配两个 syn match 命令,这会导致问题。为什么要匹配任何东西?只需设置文本颜色!

标签: vim syntax-highlighting vim-syntax-highlighting


【解决方案1】:

colorc 可以匹配colora 匹配项的第二行;这种模棱两可导致了问题。

应该没有必要为“所有其他文本”定义一个高亮组;这就是Normal 高亮组的用途。试图与之对抗只是自找麻烦。

不过,这(后备突出显示)可能是文本区域的有效用例。在这种情况下,将colorc 定义为:syntax region(完全包含colora 和任何其他多行匹配覆盖的所有行),并添加contains=colorb,colorc。这样,匹配就很明确了,您应该始终看到正确的突出显示,而不会干扰:syntax sync 设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2012-08-16
    • 2014-11-14
    • 1970-01-01
    • 2014-05-14
    • 2011-01-19
    相关资源
    最近更新 更多