Строка состояния Vim не расширяет группу цветов / выделений из выражения

Я написал функцию, которая возвращает строку:

function! StatusBricks()
    let l:stat = Brick(statusbricks#ReportLinecount('raw'), {
        \ 'brick_color': 'LineNr',
        \ 'delimiter_position': 'right',
        \ 'delimiter_right': '❯'
        \ })
    return l:stat
endfunction

Результат имеет следующий формат, сгенерированный Brick():

%#HighlightGroup#SomeData

Когда я использую функцию в качестве выражения внутри строки состояния, я ожидаю highlight group чтобы расшириться, чтобы раскрасить соответствующий раздел строки состояния:

set statusline =%{StatusBricks()}

Но то, что я получаю, это статусная строка, буквально показывающая %#HighlightGroup#ExpandedData скорее, чем ExpandedData:

vim statusline выделение группы

Что я делаю неправильно?

2 ответа

Результат %{ далее не интерпретируется, однако результат %! является. использование

set statusline=%!StatusBricks()

%! в справочном файле нет тега, но он упоминается в начале :help 'statusline',

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

set stl=%#error#%r%#search#

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

tl;dr - использовать {% %}

Я понимаю, что это старый вопрос, но я нашел ответ, который могут использовать будущие читатели.

Скорее, чем

set statusline =%{StatusBricks()}

тебе нужно

set statusline =%{%StatusBricks()%}

Из :help 'statusline':

          {% -  This is almost same as { except the result of the expression is
          re-evaluated as a statusline format string.  Thus if the
          return value of expr contains % items they will get expanded.
          The expression can contain the } character, the end of
          expression is denoted by %}.
          The For example:
            func! Stl_filename() abort
                return "%t"
            endfunc

            `stl=%{Stl_filename()}`   results in `"%t"`
            `stl=%{%Stl_filename()%}` results in `"Name of current file"`
Другие вопросы по тегам