如何使用变量来干燥Vim colorthemes

nel*_*rom 13 vim themes colors

我想通过用变量替换#ABCDEF颜色来整理我的Vim配色方案文件.例如,我想替换这个:

highlight String     guifg=#61CE3C
highlight Identifier guifg=#61CE3C
highlight Type       guifg=#84A7C1
Run Code Online (Sandbox Code Playgroud)

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

my_string =#61CE3C
my_type   =#84A7C1

highlight String     guifg=my_string
highlight Identifier guifg=my_string
highlight Type       guifg=my_type
Run Code Online (Sandbox Code Playgroud)

我不确定vimscript是否将十六进制颜色视为字符串或十六进制数字.显然它是一个字符串,因为这似乎工作:

:highlight Normal guifg='#ffffff'
Run Code Online (Sandbox Code Playgroud)

所以我想我会试试这个:

:let my_color='#ffffff'
:highlight Normal guifg=my_color
Run Code Online (Sandbox Code Playgroud)

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

jam*_*san 10

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

:let my_color='#ffffff'
:exe 'highlight Normal guifg=' . my_color
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,您的建议对我有用,但遗憾的是它在我试图整理东西的地方增加了更多混乱!也许我不得不放弃这个想法。[:help :highlight](http://vimdoc.sourceforge.net/htmldoc/syntax.html#:highlight) 下的定义之一说: `:hi[ghlight] [default] {group-name} {key} ={arg} ..`。我认为“{key}={arg}”位会接受一个变量来代替“{arg}”。难道就没有别的办法了吗? (2认同)

DrA*_*rAl 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'}
Run Code Online (Sandbox Code Playgroud)

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

:hi Comment guifg=green ctermfg=green guibg=black ctermfg=black
Run Code Online (Sandbox Code Playgroud)

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

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

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

无论如何,如果您对此感兴趣,可以从这里获取.


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

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 
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

Hi Comment #00ff00
Hi String Yellow
Hi Normal White Black
Run Code Online (Sandbox Code Playgroud)