Как изменить существующую группу подсветки в vim? - PullRequest
4 голосов
/ 26 августа 2009

Если у меня есть существующая группа подсветки в vim по ссылке, например

hi link my_highlight_group my_default_color

Можно ли добавить "жирный шрифт" в группу my_highlight_group без изменения my_default_color? Следующее не работает:

hi my_highlight_group gui=bold

Удивительно, но я могу добавить жирный шрифт, если группа my_highlight определена напрямую (не по ссылке):

hi my_highlight_group guifg=#F0000
hi my_highlight_group gui=bold

Ответы [ 3 ]

9 голосов
/ 26 августа 2009

Как сказал "too much php", не существует прямого способа сказать "создать значение, похожее на это, и добавить жирный шрифт". Лучший способ - изменить вашу цветовую схему. Если вы не используете пользовательскую цветовую схему, скопируйте ее из основного установочного каталога vim в каталог ~ / .vim / colors и отредактируйте ее в соответствии с вашими предпочтениями. Также можно выполнить поиск на странице сценариев vim и попробовать некоторые из множества доступных.

Бесстыдный плагин: если вам нужен тот, который легче редактировать, чем стандартный формат, попробуйте мою «Бандитскую» цветовую схему .

Если вы действительно хотите иметь возможность добавлять жирный шрифт на лету, вам понадобится довольно сложный скрипт, подобный приведенному ниже. Обратите внимание, что это не будет сохранено для вашего следующего сеанса, если вы не вызовете его автоматически после загрузки вашей цветовой схемы или сделав что-то вроде:

:autocmd ColorScheme AddBoldToGroup my_highlight_group

Сценарий во всем его масштабе ниже. Насколько я знаю, нет более быстрого способа сделать это! Очевидно, что вы могли бы сохранить несколько строк, написав меньше подробного кода, но общая идея многократного использования redir и silent hi - единственный способ.

" Call this with something like
"
" :AddBoldToGroup perlRepeat
"
command! -complete=highlight -nargs=1 AddBoldToGroup call AddBoldToGroup(<f-args>)
function! AddBoldToGroup(group)
    " Redirect the output of the "hi" command into a variable
    " and find the highlighting
    redir => GroupDetails
    exe "silent hi " . a:group
    redir END

    " Resolve linked groups to find the root highlighting scheme
    while GroupDetails =~ "links to"
        let index = stridx(GroupDetails, "links to") + len("links to")
        let LinkedGroup =  strpart(GroupDetails, index + 1)
        redir => GroupDetails
        exe "silent hi " . LinkedGroup
        redir END
    endwhile

    " Extract the highlighting details (the bit after "xxx")
    let MatchGroups = matchlist(GroupDetails, '\<xxx\>\s\+\(.*\)')
    let ExistingHighlight = MatchGroups[1]

    " Check whether there's an existing gui= block
    let MatchGroups = matchlist(ExistingHighlight, '^\(.\{-}\) gui=\([^ ]\+\)\( .\{-}\)\?$')
    if MatchGroups != []
        " If there is, check whether "bold" is already in it
        let StartHighlight = MatchGroups[1]
        let GuiHighlight = MatchGroups[2]
        let EndHighlight = MatchGroups[3]
        if GuiHighlight =~ '.*bold.*'
            " Already done
            return
        endif
        " Add "bold" to the gui block
        let GuiHighlight .= ',bold'
        let NewHighlight = StartHighlight . GuiHighlight . EndHighlight
    else
        " If there's no GUI block, just add one with bold in it
        let NewHighlight = ExistingHighlight . " gui=bold"
    endif

    " Create the highlighting group
    exe "hi " . a:group . " " NewHighlight
endfunction
2 голосов
/ 26 августа 2009

Изменение атрибутов в группе, которая связана с другой, приведет к отключению связи. AFAIK нет простого способа скопировать цвета из my_default_color в my_highlight_group. Вам просто нужно будет скопировать значения цвета вручную.

Это не должно быть большой проблемой, вы должны иметь все свои выделенные группы, определенные в вашем файле colorscheme, поэтому просто поместите эти две рядом друг с другом:

hi my_default_color   guifg=#000088
hi my_highlight_group guifg=#000088 gui=bold
0 голосов
/ 26 августа 2009

Предполагая, что вы хотите это только для одного синтаксического типа, вы должны просто создать новое имя группы, my_bold_default_color, и применить к нему атрибут bold.

...