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 名称,那么您就会遇到更新问题。通常,语法是静态的,所以一旦加载就完成了。在你的情况下,你必须定义定期重新扫描缓冲区的 :autocmd
s,并添加新的 class 名称(甚至可能回收未使用的突出显示组名称,所以你不 运行 没有颜色)。 CursorHold
事件将是一个很好的候选者,但在颜色出现之前会有延迟。如果您想让其他用户可以使用此语法,则可用颜色是另一个问题。颜色的数量可能千差万别,想出适合各种配色方案的背景颜色很困难。
总结
这是可能的,但它对于语法来说并不常见,并且会产生更新延迟或性能不佳等副作用。 (不过,我已经看到它用于突出显示 标签文件 中的函数名称。)一些用户肯定希望关闭它。
备选
对于名称很少(或非常不同)class 的小文件,这种额外的突出显示可能没有必要。对于包含许多 classes 的大文件,点亮所有内容会使它看起来像一棵圣诞树,而且所有的颜色可能会分散注意力而不是帮助。我宁愿让用户按需突出显示一些 class感兴趣的内容。我的 Mark plugin 以不干扰语法突出显示的方式为此提供了通用功能,并且它附带看起来像文本标记突出显示的调色板。我经常使用它来更好地定位日志文件或遗留代码库。 (插件页面有指向替代插件的链接;有几个。)
你的语法
- 组名通常有一个与语法名称相同的公共前缀。如果是
cel
,请使用 celMethodCall
而不是 methodCall
,依此类推。
- 我会将
:hi
命令全部放在底部;大多数语法插件都是这样做的。
- 特别是如果您打算稍后共享语法,请倾向于
:hi link
ing 到现有语法组 (:help highlight-groups
) 而不是定义您自己的颜色。即使是您个人使用,在 ~/.vimrc
中定义颜色的好处是可以在一个地方进行调整和重用,而不是四处寻找各种语法脚本。
- 通过使用
:hi def
,用户可以自定义语法,例如在他们的 ~/.vimrc
中。 :help 44.12
有更多关于编写语法插件的信息。
我是 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 名称,那么您就会遇到更新问题。通常,语法是静态的,所以一旦加载就完成了。在你的情况下,你必须定义定期重新扫描缓冲区的 :autocmd
s,并添加新的 class 名称(甚至可能回收未使用的突出显示组名称,所以你不 运行 没有颜色)。 CursorHold
事件将是一个很好的候选者,但在颜色出现之前会有延迟。如果您想让其他用户可以使用此语法,则可用颜色是另一个问题。颜色的数量可能千差万别,想出适合各种配色方案的背景颜色很困难。
总结
这是可能的,但它对于语法来说并不常见,并且会产生更新延迟或性能不佳等副作用。 (不过,我已经看到它用于突出显示 标签文件 中的函数名称。)一些用户肯定希望关闭它。
备选
对于名称很少(或非常不同)class 的小文件,这种额外的突出显示可能没有必要。对于包含许多 classes 的大文件,点亮所有内容会使它看起来像一棵圣诞树,而且所有的颜色可能会分散注意力而不是帮助。我宁愿让用户按需突出显示一些 class感兴趣的内容。我的 Mark plugin 以不干扰语法突出显示的方式为此提供了通用功能,并且它附带看起来像文本标记突出显示的调色板。我经常使用它来更好地定位日志文件或遗留代码库。 (插件页面有指向替代插件的链接;有几个。)
你的语法
- 组名通常有一个与语法名称相同的公共前缀。如果是
cel
,请使用celMethodCall
而不是methodCall
,依此类推。 - 我会将
:hi
命令全部放在底部;大多数语法插件都是这样做的。 - 特别是如果您打算稍后共享语法,请倾向于
:hi link
ing 到现有语法组 (:help highlight-groups
) 而不是定义您自己的颜色。即使是您个人使用,在~/.vimrc
中定义颜色的好处是可以在一个地方进行调整和重用,而不是四处寻找各种语法脚本。 - 通过使用
:hi def
,用户可以自定义语法,例如在他们的~/.vimrc
中。:help 44.12
有更多关于编写语法插件的信息。