如何使用变量来干掉Vim colorschemes

时间:2010-02-06 00:49:43

标签: themes colors vim

我想通过替换#ABCDEF颜色来整理我的Vim配色方案文件 有变量。例如,我想替换它:

highlight String     guifg=#61CE3C
highlight Identifier guifg=#61CE3C
highlight Type       guifg=#84A7C1

有这样的东西(伪代码vimscript):

my_string =#61CE3C
my_type   =#84A7C1

highlight String     guifg=my_string
highlight Identifier guifg=my_string
highlight Type       guifg=my_type

我不确定vimscript是否认为十六进制颜色是字符串,或者是 十六进制数。显然它是一个字符串,因为这似乎有效:

:highlight Normal guifg='#ffffff'

所以我想我会试试这个:

:let my_color='#ffffff'
:highlight Normal guifg=my_color

但这会产生错误“E254:无法分配颜色my_color”。任何人都可以 建议一种方法来使这项工作?

2 个答案:

答案 0 :(得分:10)

由于:highlight不接受变量作为参数,因此必须构建命令以作为表达式运行,然后使用:execute命令对其进行评估。

:let my_color='#ffffff'
:exe 'highlight Normal guifg=' . my_color

答案 1 :(得分:9)

正如jamessan所说,你需要使用:exe来做到这一点。我发现颜色方案文件的一般语法有点难以管理,所以我自己做了,你可能会对它感兴趣。我发现它更易于维护,但你可能仍然觉得它有点过于冗长,其中案例见本答案末尾的替代案例。

不是编写长:hi行,而是按照以下行创建字典:

" Unspecified colours default to NONE, EXCEPT cterm(.*) which default to matching gui(.*)
" ctermfg will default to 'Blue' and ctermbg to 'NONE' if gui(.*) are RGB
"
" In most cases, only GUIFG is therefore important unless support for Black and White
" terminals is essential

let ColourAssignment['Normal']          = {"GUIFG": 'White', "GUIBG":  'Black'}
let ColourAssignment['Comment']         = {"GUIFG": '#00ff00'}

正如评论中所提到的,所有未指定的部分都假定合理的默认值,因此您不必执行此操作:

:hi Comment guifg=green ctermfg=green guibg=black ctermfg=black

重复。如果需要,您也可以(当然)将变量放在'#00ff00'位的位置。

它目前围绕深色背景颜色方案设计:对于浅色背景颜色方案,它会自动选择合适的颜色(它会使明亮的颜色基本上变暗),除非你覆盖它,但如果你喜欢浅色背景颜色方案,它不会太难改变,以便默认为轻。

它的另一个优点是它带有一个语法高亮文件,可以自动突出显示您选择的颜色中的“ColourAssignment”位。

无论如何,如果您对此感兴趣,可以从here获取。


您可以使用的替代方法是创建如下命令:

command! -nargs=+ Hi call CustomHighlighter(<f-args>)
function! CustomHighlighter(name, ...)
    let colour_order = ['guifg', 'guibg']
    let command = 'hi ' . a:name
    if (len(a:000) < 1) || (len(a:000) > (len(colour_order)))
        echoerr "No colour or too many colours specified"
    else
        for i in range(0,len(a:000)-1)
            let command .= ' ' . colour_order[i] . '=' . a:000[i]
        endfor
        exe command
    endif
endfunc 

然后你可以使用:

Hi Comment #00ff00
Hi String Yellow
Hi Normal White Black