Vim:当颜色方案更改时如何自动同步自定义语法突出显示规则?

Ano*_*ker 3 vim

我正在使用VOoM(可能不需要了解太多就能回答我的问题,我只是提供上下文信息)并且我已经设法为特定内容自己编写了一些自定义语法突出显示规则。

首先,我使用 modeline 告诉 vim 某个文件是 VOoM 大纲,我在这些文件的底部有这个:

/* vim: set syntax=myvoom : */
Run Code Online (Sandbox Code Playgroud)

其次,我有一个/home/user/.vim/after/syntax/myvoom.vim文件,这是其中的一个片段:

syn match voomTag "^tags:.*"
hi voomTag ctermfg=White ctermbg=Red guifg=White guibg=Red
Run Code Online (Sandbox Code Playgroud)

在一些大纲节点中,我有如下行:

tags: foo, bar, baz
Run Code Online (Sandbox Code Playgroud)

为了使搜索更容易,上面的语法突出显示规则仅显示具有自定义前景/背景的那些行。

这可以按预期使用默认颜色方案( vim 中的:colorscheme返回 'default')。

当我想尝试自定义颜色方案(例如野马)并通过执行:colorscheme Mustang更改它时,我的标记行的语法突出显示丢失了。

我想了解为什么会发生这种情况。

另外,我想了解如何在更改颜色方案时自动同步这些自定义语法规则(这些规则是通用的,而不是特定于某个颜色方案)。我是否必须在 myvoom.vim 文件中以某种方式明确检查这一点?比如查看哪些颜色方案处于活动状态并且具有针对不同颜色方案的自定义语法突出显示规则,或者是否有更好的方法?

xai*_*zek 5

发生这种情况的原因在于:highlight clear(请参阅:help :highlight)命令,该命令通常是 colorcheme 执行的第一个命令之一。此命令重置所有突出显示,从而消除自定义:highlight命令的效果。

要解决此问题,您需要使用:autocmd(请参阅help :autocmd)事件之一ColorScheme(请参阅:help ColorScheme)在加载新颜色方案后执行您的命令。更改后你myvoom.vim应该看起来像这样:

augroup VoomTagHighlight
  autocmd! ColorScheme *
         \ syn match voomTag "^tags:.*" |
         \ hi voomTag ctermfg=White ctermbg=Red guifg=White guibg=Red
augroup END
Run Code Online (Sandbox Code Playgroud)

另请参阅 上的:augroup帮助:help :augroup

如果您希望根据当前颜色方案获得不同的突出显示,请使用:highlight link命令(请参阅:help :highlight-link)而不是指定您自己的颜色。例如,将其链接到Error突出显示组将如下所示:

augroup VoomTagHighlight
  autocmd! ColorScheme *
         \ syn match voomTag "^tags:.*" |
         \ hi! link voomTag Error
augroup END
Run Code Online (Sandbox Code Playgroud)