Как выделить значение, которое изменяется во время выполнения в vim (плагин lightline)?

Я взламываю плагин lightline для vim (скачанная версия). Я могу изменить цвета каждой темы. Я сделал то, что хорошо работает в схеме powerline.vim (путь: ~/.vim/pack/plugins/start/lightline/autoload/lightline/colorscheme/powerline.vim)

Теперь я хочу, чтобы цветовая тема менялась, пока я в vim. Я добавил этот код в начало powerline.vim:

10    let s:BSsplitscolor = "'darkestgreen', 'brightgreen'"
11    if g:BSsplitsbool == "1"
12            let s:BSsplitscolor = "'gray4', 'brightorange'"
13    endif
14
15    " ============================== NOTE: below : already there
16
17    let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}}
18    let s:p.normal.left = [ [s:BSsplitscolor, 'bold'], ['white', 'gray4'] ]

Здесь s:BSsplitscolor содержит нужные мне цвета: либо 'gray4', 'brightorange', если g:BSsplitsbool равно 1, либо 'darkestgreen', 'brightgreen', если нет. Меняется g:BSsplitsbool.

Теперь проблема в 16-й строке: когда я добавляю s:BSsplitscolor после [ [, я получаю эти ошибки при перезапуске vim (перевод с французского):

    Error detected while treating functionlightline#update[5]..lightline#colorscheme[18]..lightline#highlight :
    line   18 :
    E254: can not allocate color darkestgreen
    E416: missing '=' : , 'brightgreen' guibg=bold ctermfg=0 ctermbg=0
    Error detected while treating function lightline#update :
    line    5 :
    E171: missing :endif

Я думаю, что я что-то упускаю... Я не очень хорошо разбираюсь в сценариях vim: я могу сделать инструкцию if, переназначить и все.


person ATR    schedule 30.06.2020    source источник


Ответы (1)


Во-первых, решение:

let s:BSsplitscolor = ['darkestgreen', 'brightgreen']
[...]
let s:p.normal.left = [ s:BSsplitscolor + ['bold'], ['white', 'gray4'] ]

Во-вторых, объяснение:

Вы пытаетесь составить список из трех элементов:

['darkestgreen', 'brightgreen', 'bold']

из строки, отдаленно похожей на список:

"'darkestgreen', 'brightgreen'"

и список с одной строкой:

['bold']

вставив эту строку в этот список:

[ s:BSsplitscolor, 'bold']

что дает вам это чудовище:

['''darkestgreen'', ''brightgreen''', 'bold']

который представляет собой список из двух элементов, а вовсе не то, что вы пытаетесь построить. Я не знаю языка сценариев, на котором можно было бы ожидать, что что-то подобное будет работать.

Фактическое решение состоит в том, чтобы сделать s:BSsplitscolor список:

let s:BSsplitscolor = ['darkestgreen', 'brightgreen']

и объедините его с ['bold']. Это можно сделать несколькими способами. С :help expr-+:

let s:p.normal.left = [ s:BSsplitscolor + ['bold'], ['white', 'gray4'] ]

или с :help extend():

let s:p.normal.left = [ extend(s:BSsplitscolor, ['bold']), ['white', 'gray4'] ]
person romainl    schedule 02.07.2020