Как я могу использовать переменные, чтобы высушить Vort colorthemes - PullRequest
13 голосов
/ 06 февраля 2010

Я бы хотел привести в порядок свой файл цветовой схемы 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". Может кто-нибудь предложить способ сделать эту работу?

Ответы [ 2 ]

10 голосов
/ 06 февраля 2010

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

:let my_color='#ffffff'
:exe 'highlight Normal guifg=' . my_color
9 голосов
/ 06 февраля 2010

Как сказал jamessan, вам нужно использовать :exe для этого. Я нашел общий синтаксис для файлов цветовой схемы немного сложным для управления, поэтому я создал свой собственный, который может вас заинтересовать. Я нахожу его намного более удобным, но вы все равно можете найти его слишком многословным, в котором case см. альтернативу в конце этого ответа.

Вместо того, чтобы писать длинные :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
...