Vim:更改colorscheme时更改语法着色规则

时间:2014-07-18 12:15:06

标签: vim color-scheme

在Vim中,是否可以在更改colorscheme时更改给定语言的语法着色规则?

以下是一个例子:

我在Vim中安装了一些用于着色matlab代码的插件。它提供了几个.vim个文件:

.vim/colors/matlabdark.vim
.vim/colors/matlablight.vim
.vim/ftplugin/matlab.vim
.vim/indent/matlab.vim
.vim/syntax/matlabcolours.vim
.vim/syntax/matlab.vim

使用提供的colorschemes非常好用。但是,我有时想要使用不同的颜色方案,当我应用另一种颜色方案(例如曝光)时,逗号和分号的背景色太强。我检查了.vim/syntax/matlab.vim,我看到将逗号和分号分配给组SpecialKey

我尝试将.vim/syntax/matlab.vim的那部分编辑成:

syn match matlabComma        ","    display
syn match MatlabSemicolon    ";"    display
(...)
command -nargs=+ HiLink hi def link <args>     " creates HiLink command
(...)
if g:colors_name == 'solarized'                " added by me
  HiLink matlabComma         Normal            " added by me
  HiLink matlabSemicolonn    Normal            " added by me
else                                           " added by me
  HiLink matlabComma         SpecialKey
  HiLink matlabSemicolonn    SpecialKey
endif                                          " added by me
(...)

但是当我将colorscheme改为曝光时没有任何反应。然后我尝试将此脚本放入.vim/after/syntax/,但也没有运气。

我想我需要以某种方式更改solarized的代码或任何其他颜色方案以实现我想要的,但我根本无法看到。我不太了解vim脚本,以了解在更改colorscheme时执行的文件/脚本。可能只有.vim/colors/<wanted_scheme>.vim脚本。

如果需要,可以找到matlab here

1 个答案:

答案 0 :(得分:1)

问题是:HiLink命令扩展为:hi def link; def表示该命令只定义默认值,以防没有现有的。如果语法插件已经被提取过一次,那就不再是这种情况,并且你的更改变得无效。

现在,如果您不介意操纵脚本,请删除def,它应该可以正常工作。

另一种方法是通过由colorscheme更改触发的:autocmd重新定义链接:

:autocmd ColorScheme * if g:colors_name == 'solarized' | hi link matlabComma Normal | else | hi link matlabComma SpecialKey | endif

最后,你真的需要动态切换色彩方案吗?有些插件不会优雅地处理它。