我想通过替换#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”。任何人都可以 建议一种方法来使这项工作?
答案 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