Подтвердить что ты не робот

Как я могу использовать переменные для DRY до Vort 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". Может кто угодно предложить способ сделать эту работу?

4b9b3361

Ответ 1

Как сказал 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 в выбранном вами цвете.

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


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

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

Ответ 2

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

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