2009-08-25 6 views
4

Wenn ich eine vorhandene Highlight-Gruppe in vim über die Verbindung, zum BeispielSo ändern Sie die vorhandene Highlight-Gruppe in vim?

hi link my_highlight_group my_default_color 

Ist es möglich, ‚fett‘ hinzuzufügen ohne Änderung my_default_color zu my_highlight_group? nicht funktioniert folgendermaßen vor:

hi my_highlight_group gui=bold 

Überraschenderweise kann ich fett hinzufügen, wenn my_highlight Gruppe direkt definiert ist (nicht über Link):

hi my_highlight_group guifg=#F0000 
hi my_highlight_group gui=bold 

Antwort

9

als „too much php“ hat gesagt, es gibt keinen direkten Weg zu sagen "Erstellen Sie einen Wert, der wie dieser aussieht und fett hinzufügen". Der beste Weg ist, Ihr Farbschema zu ändern. Wenn Sie kein benutzerdefiniertes Farbschema verwenden, kopieren Sie eines aus dem vim-Installationsverzeichnis in das Verzeichnis ~/.vim/colors und bearbeiten Sie es entsprechend. Alternativ können Sie auf der vim scripts-Seite suchen und einige der vielen verfügbaren ausprobieren.

Schamloser Stecker: Wenn Sie einen, der einfacher zu bearbeiten ist als das Standardformat, versuchen Sie meine "Bandit" colour scheme.

Wenn Sie wirklich möchten in der Lage sein, fett im laufenden Betrieb hinzuzufügen, benötigen Sie ein ziemlich komplexes Skript, wie das untenstehende. Beachten Sie, dass dies nicht für die nächste Sitzung gespeichert werden, wenn Sie es automatisch aufrufen, nachdem Ihr Farbschema geladen oder durch so etwas wie tun:

:autocmd ColorScheme AddBoldToGroup my_highlight_group 

Das Skript in allen Ungeheuerlichkeit unten ist es. Soweit mir bekannt ist, gibt es keinen wesentlich schnelleren Weg! Natürlich könnten Sie ein paar Zeilen speichern, indem Sie weniger ausführlichen Code schreiben, aber die allgemeine Idee, redir und silent hi wiederholt zu verwenden, ist der einzige Weg.

" 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 
+0

Shameless Stecker: Wenn Sie nicht wollen, ganze colorschemes in Ihrem .vim Ordner kopieren, [dieses Plugin] (http://www.vim.org/scripts/script.php?script_id=1641) ermöglicht Ihnen, kleine Anpassungen in .vim/after/colors zu setzen. Und Bravo, um diesen Code zu veröffentlichen, würde ich dir +4 geben, wenn ich könnte. –

+0

@too viel php: Das Plugin sieht gut aus, danke für den Link (und für die Bravo!) – DrAl

+0

Fügen Sie diesen Code vor dieser Zeile: "Extrahieren Sie die Hervorhebung Details (das Bit nach" xxx ") (Die Nazi ignoriert meine Bearbeitung für einige alt-links Grund, und sie sind falsch. Sie brauchen diesen Code oder sonst die Regex wird nicht wie erwartet funktionieren, wenn ausführlich eingeschaltet ist): "Trim verbose-Modus Highlight-Ausgabe, siehe: help highlight-worse if & verbose Lassen Sie GroupDetails = ersetzen (GroupDetails, '\ s \ + \ Zuletzt festgelegt von \ _. *', '', 'G') endif – FocusedWolf

0

Angenommen, Sie nur diese Art für eine Syntax wollen, sollten Sie nur Erstellen Sie einen neuen Gruppennamen, my_bold_default_color, und wenden Sie das Fett-Attribut darauf an.

2

Durch das Ändern der Attribute einer Gruppe, die mit einer anderen verknüpft ist, wird die Verbindung getrennt. AFAIK gibt es keine einfache Möglichkeit, die Farben von my_default_color in my_highlight_group zu kopieren. Sie müssen nur die Farbwerte von Hand kopieren.

Dies sollte kein großes Problem sein, obwohl, sollten Sie alle Ihre Lichtergruppen in Ihrem Farbschema-Datei definiert haben, so setzen Sie einfach die beiden nebeneinander:

hi my_default_color guifg=#000088 
hi my_highlight_group guifg=#000088 gui=bold