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)
正如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)