Как я могу использовать переменные для высушивания Vim colorthemes

Я хотел бы убрать свой файл цветовой схемы Vim путем замены цветов #ABCDEF переменными. Например, я хотел бы заменить это:

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". Кто-либо может предложить способ сделать эту работу?

13
задан nelstrom 6 February 2010 в 00:49
поделиться

2 ответа

Как сказал Джамессан, для этого нужно использовать :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'.

В настоящее время он спроектирован вокруг тёмных цветовых схем фона: для светлых цветовых схем фона он автоматически выбирает подходящий цвет (в основном, он делает светлые цвета тёмнее), если только вы не переопределите его, но если вы предпочитаете светлые цветовые схемы фона, то изменить их не составит труда, так что по умолчанию будет светло.

Другое преимущество заключается в том, что он поставляется с файлом подсветки синтаксиса, который автоматически подсвечивает бит "Присвоение цвета" в выбранном вами цвете.

В любом случае, если вас это интересует, вы можете получить его из здесь .


Альтернативой, которую вы можете использовать, было бы создание такой команды:

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
9
ответ дан 1 December 2019 в 23:14
поделиться

Начиная с : highlight не принимает переменную как аргумент, вы должны создать команду, которая будет запускаться как выражение, а затем вычислить ее с помощью команды : execute .

:let my_color='#ffffff'
:exe 'highlight Normal guifg=' . my_color
10
ответ дан 1 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: