vim 自定义语法,用不同颜色突出显示 class 处

vim custom syntax, highlight class occurrences with different colors

我是 vim 语法高亮自定义的新手。尝试创建基于文本的调用路径描述文件:

// Entry point
Class1#mainMethod
    Class1#privateMethod2
    Class2#method3
        Class3#method4
    Class4#method5

在 plantUML 中,等价物是:

ExternalActor -> Class1 : mainMethod
Class1 -> Class1 : privateMethod2()
Class1 -> Class2 : method3()
Class2 -> Class3 : method4()
Class1 -> Class4 : method5()

我已经有了一些不错的语法文件,它看起来像:

当前语法文件如下:

syn keyword celTodo contained TODO FIXME XXX NOTE
syn match celComment "//.*$" oneline contains=celTodo
hi celComment ctermfg=yellow
hi celTodo ctermfg=green

syn match methodCall /\(#\)\@<=\w*/ contained oneline
hi methodCall ctermfg=blue

syn match className /\w*\(#\)\@=/ contained oneline
hi className ctermfg=red


syn region line start='\(\.\)\@<=\w' end='.\($\)\@=' oneline fold transparent contains=celComment,className,methodCall

问题

我认为每次出现相同 class 时使用不同的背景颜色将有助于更好地理解序列。 有什么办法可以做到这一点? 这样 Class1 的背景颜色将与 Class2、3 和 4 不同。但是每个 class 总是相同、一致的颜色。

语法突出显示将关键字、模式匹配或区域与语法组相关联。相应的 突出显示组 然后(直接或间接通过链接组)确定文本的颜色和格式。

为了使每个 class 名称具有不同的(背景或其他)颜色,您必须定义不同的语法组,并分配不同的突出显示组。您的语法文件不仅有一组固定的 :syntax match 命令,而且还有一个循环,该循环从当前缓冲区中提取匹配项并在语法加载时构建相应的 :syntax match:highlight 命令(使用 :execute).

如果用户添加或更改 class 名称,那么您就会遇到更新问题。通常,语法是静态的,所以一旦加载就完成了。在你的情况下,你必须定义定期重新扫描缓冲区的 :autocmds,并添加新的 class 名称(甚至可能回收未使用的突出显示组名称,所以你不 运行 没有颜色)。 CursorHold 事件将是一个很好的候选者,但在颜色出现之前会有延迟。如果您想让其他用户可以使用此语法,则可用颜色是另一个问题。颜色的数量可能千差万别,想出适合各种配色方案的背景颜色很困难。

总结

这是可能的,但它对于语法来说并不常见,并且会产生更新延迟或性能不佳等副作用。 (不过,我已经看到它用于突出显示 标签文件 中的函数名称。)一些用户肯定希望关闭它。

备选

对于名称很少(或非常不同)class 的小文件,这种额外的突出显示可能没有必要。对于包含许多 classes 的大文件,点亮所有内容会使它看起来像一棵圣诞树,而且所有的颜色可能会分散注意力而不是帮助。我宁愿让用户按需突出显示一些 class感兴趣的内容。我的 Mark plugin 以不干扰语法突出显示的方式为此提供了通用功能,并且它附带看起来像文本标记突出显示的调色板。我经常使用它来更好地定位日志文件或遗留代码库。 (插件页面有指向替代插件的链接;有几个。)

你的语法

  • 组名通常有一个与语法名称相同的公共前缀。如果是 cel,请使用 celMethodCall 而不是 methodCall,依此类推。
  • 我会将 :hi 命令全部放在底部;大多数语法插件都是这样做的。
  • 特别是如果您打算稍后共享语法,请倾向于 :hi linking 到现有语法组 (:help highlight-groups) 而不是定义您自己的颜色。即使是您个人使用,在 ~/.vimrc 中定义颜色的好处是可以在一个地方进行调整和重用,而不是四处寻找各种语法脚本。
  • 通过使用:hi def,用户可以自定义语法,例如在他们的 ~/.vimrc 中。 :help 44.12 有更多关于编写语法插件的信息。