Hervorhebung von Klassen- und Funktionsnamen in Vim
Lesezeit: 7 Minuten
Ivan der Schreckliche
Ich habe erst kürzlich meine Vim-Umgebung von Textmate aus eingerichtet, nachdem ich süchtig nach seiner modalen Eingabe geworden bin.
Allerdings scheint das Syntax-Highlighting in Vim nicht so schön zu sein. Ich programmiere in C++ und da der Funktionsaufruf und die Klassennamen nicht hervorgehoben werden können, ist der Code schwieriger zu lesen. Ich habe ein bisschen mit dem Farbschema gespielt, konnte aber kein Feld finden, das “Klassenname” oder “Funktionsname” entsprach.
Beachten Sie im Bild unten, wie DroughtLayer:: und *.size() wird in MacVim rechts nicht hervorgehoben.
Irgendwelche Ideen, wie man das löst? Es nervt mich wirklich, da ich ein sehr visuell empfindlicher Typ bin.
Markiert Ihr TextMate irgendwelche Namen nach „neu“ oder nur die, die irgendwie deklariert wurden?
– Mykola Golubjew
16. April 09 um 10:52 Uhr
Leider ist das, was vim als Syntax-Highlighter bezeichnet, normalerweise nur ein Lexer, der Klammern abgleichen kann und den grundlegenden Kontext kennt. Das gilt sowohl für C- als auch für CPP-Syntaxdateien. Sie bräuchten einen “echten” Parser, um diese Fälle zu handhaben … Das bedeutet etwas c.vim-Hacking 😉
– Viraptor
17. April 2009 um 23:30 Uhr
Ich habe hier eine ähnliche Frage zu #defines gepostet: stackoverflow.com/questions/1512602/…. Ihre Hinweise/Vorschläge sind willkommen. Ich hoffe, es gibt eine Möglichkeit, dies wie die von Eduardo vorgeschlagene coole Antwort hervorzuheben.
Ich hatte das gleiche Problem, als ich anfing, vim zu verwenden. Die Lösung ist einfach, Sie müssen nur die von vim verwendete c-Syntaxdatei bearbeiten. So geht’s:
Wenn Sie mit der Bearbeitung einer C- oder C++-Datei beginnen, liest vim die Standard-C-Syntaxdatei, die sich in befindet
$VIMRUNTIME/syntax/c.vim
(Wo $VIMRUNTIME dort ist, wo Sie vim installiert haben. Sie können den Standardwert herausfinden, indem Sie vim öffnen und den Befehl „:echo $VIMRUNTIME“ verwenden).
Sie können diese Datei einfach überschreiben oder Ihre benutzerdefinierte C-Syntaxdatei (die von vim anstelle der Standarddatei geladen wird) an diesem Ort erstellen:
$HOME/.vim/syntax/c.vim (for UNIX)
$HOME/vimfiles/syntax/c.vim (for PC or OS/2)
(Ich habe noch nie einen Mac verwendet, daher weiß ich nicht, welcher für Sie geeignet ist. Weitere Informationen finden Sie in der vim-Hilfe, “:help vimfiles”)
Jetzt der lustige Teil. Kopieren Sie die Standarddatei „$VIMRUNTIME/syntax/c.vim“ in Ihr vimfiles-Verzeichnis („$HOME/.vim/syntax/c.vim“ für UNIX) und bearbeiten Sie sie, indem Sie diese Zeilen hinzufügen:
" Highlight Class and Function names
syn match cCustomParen "(" contains=cParen,cCppParen
syn match cCustomFunc "w+s*(" contains=cCustomParen
syn match cCustomScope "::"
syn match cCustomClass "w+s*::" contains=cCustomScope
hi def link cCustomFunc Function
hi def link cCustomClass Function
Das ist es! Jetzt werden Funktionen und Klassennamen mit der Farbe hervorgehoben, die in der Markierung “Funktion” definiert wurde (“:hi Function”). Wenn Sie die Farben anpassen möchten, können Sie die letzten beiden Zeilen oben wie folgt ändern:
hi def cCustomFunc gui=bold guifg=yellowgreen
hi def cCustomClass gui=reverse guifg=#00FF00
oder Sie können die C-Syntaxdatei in Ruhe lassen und Farben in Ihrer vimrc-Datei (“:help vimrc”) definieren:
hi cCustomFunc gui=bold guifg=yellowgreen
hi cCustomClass gui=reverse guifg=#00FF00
(Beachten Sie das Fehlen des Schlüsselworts „def“, gehen Sie zu „:help highlight-default“ für Details). Für die verfügbaren Parameter des “:hi”-Befehls siehe “:help :highlight”.
Die vollständige c.vim-Datei für Vim 7.2 finden Sie unter diesem Link (Hinweis: Verwenden Sie diese nur, wenn Sie einen nicht modifizierten Vim, Version 7.2, haben):
Tut mir leid, dass Sie der Gewinner dieses Kopfgeldes sein sollen. Aber StackOverflow hat stattdessen irgendwie automatisch den höchsten Punkt ausgewählt. Wenn Sie wissen, können wir das ändern, damit Sie 200 Punkte verdienen können (wenn Sie möchten). Vielen Dank trotzdem.
– Ivan der Schreckliche
27. April 09 um 17:53 Uhr
Sie müssen c.vim nicht kopieren. Erstellen Sie einfach eine neue als vimfiles/syntax/c.vim mit den 8 Linien.
– idbrii
7. Juli 10 um 0:35 Uhr
Sehr schöne Lösung. Ich habe es übernommen. Gibt es jemanden, der das Muster so verfeinern könnte, dass es die Funktionsnamen nur hervorhebt, wenn sie deklariert werden und nicht jedes Mal, wenn sie aufgerufen werden?
– xApple
16. November 10 um 10:37 Uhr
Was ist das (Sorry for imageshack) Pro? Warum nicht einfach das Bild einbetten?
– Adrian
17. Mai ’13 um 21:09 Uhr
Der Screenshot scheint gestorben zu sein. Kannst du das Bild einbetten?
– Greenonline
26. Mai ’15 um 19:44 Uhr
dies ist mein erster Beitrag hier und ich wusste nicht, wie ich eine Beobachtung machen sollte, die Antwort von Eduardo lässt “(” und “{” unbearbeitet aussehen und die Syntax ist fehlerhaft, ich habe sie ein wenig geändert, um dies zu beheben.
syn match cCustomParen "?=(" contains=cParen,cCppParen
syn match cCustomFunc "w+s*(@=" contains=cCustomParen
syn match cCustomScope "::"
syn match cCustomClass "w+s*::" contains=cCustomScope
hi def cCustomFunc gui=bold guifg=yellowgreen
hi def link cCustomClass Function
Ja, es bricht tatsächlich das Falten. Dies ist die richtige Antwort.
– Ayberk Özgür
24. Juli 14 um 10:00 Uhr
Dies kann mit stackoverflow.com/a/1819151/2716069 noch besser gemacht werden. Dann ist die cCustomParen wird nicht mehr benötigt, und die cCustomFunc wird "w+zes*(" (Code-Folding funktioniert immer noch, glaube ich.)
Interessanterweise unterstützen die Syntax-Highlighter in VIM nicht das Anwenden einer Syntax auf Bezeichner oder Funktionsnamen – zumindest nicht die Syntax-Highlighter für C und C++. Also, selbst wenn du es tust:
:hi Function guifg=red
oder
:hi Identifier guifg=red
es gibt diesen keine Farbe. I scheint einfach nicht viel mehr als Schlüsselwörter und Konstanten für diese Sprachen zu sein.
Die Frage bezieht sich auf das Hervorheben von Funktionsnamen im Code.
– Mykola Golubjew
20. April 09 um 10:48 Uhr
Mykola Golubjew
Die einzige Lösung ist die Verwendung einer eingebauten ctags-Datenbank. Erstellen Sie also eine mit der Tags Dienstprogramm. Setzen Sie dann die Variable ‘tags’ und fügen Sie Folgendes in die ein
~/.vim/after/syntax/c.vim
function! s:highlight()
let list = taglist('.*')
for item in list
let kind = item.kind
if kind == 'f' || kind == 'c'
let name = item.name
exec 'syntax keyword Identifier '.name
endif
endfor
endfunction
call s:highlight()
Ich muss Sie warnen, dass dies bei der sehr großen ctags-Datenbank sehr langsam funktionieren kann.
Auch gibt es eine Lösung auf vim.org, aber das habe ich nicht ausprobiert. Lassen Sie mich wissen, ob es für Sie funktioniert.
CW
BEARBEITEN: color_coded ist möglicherweise zu schwer für Sie. Versuchen octol/vim-cpp-enhanced-highlight. Es unterstützt C++11/14 und integriert die Antworten von @Eduardo.
Semantik basierter Textmarker:
ich würde empfehlen jeaye/color_codedEin vim-Plugin für libclang-basiertes Hervorheben
Es tut mir leid, dass ich neu bei Stackoverflow bin, was bedeutet, dass ich nicht genug Reputation habe, um Bilder zu posten. Sehen Sie sich die Auswirkungen an, wenn Sie es ausprobieren möchten. 🙂
Vorteile:
Einfache Installation
Semantische Hervorhebung
Clighter wie oben erwähnt, muss mit vim kompiliert werden python2.7. color_coded ist jedoch in C++ geschrieben und bietet Lua-Binding -> C++.
Nachteile:
Es verzögert sich, es sei denn, Sie machen einige vim-Ereignisse, um es zu aktivieren.
Die Anpassung ist etwas schwieriger; Sie müssen syntax/color_coded.vim selbst bearbeiten. Aber die Anpassung wurde auf die Roadmap gesetzt.
Obwohl es sich noch in der Entwicklung befindet, gewinnt es zunehmend an Aufmerksamkeit.
Können Sie einen Code / eine Dokumentation hinzufügen, die zeigt, warum dies die richtige Antwort wäre? Ein Link kann sich im Laufe der Zeit ändern, was diese Antwort dann falsch machen würde.
– rfornal
3. April 15 um 14:29 Uhr
swlasow
Sergey, ändert die erste Zeile von
syn match cCustomParen "(" contains=cParen,cCppParen
zu
syn match cCustomParen "(" contains=cParen contains=cCppParen
scheint es für mich zu beheben.
Können Sie einen Code / eine Dokumentation hinzufügen, die zeigt, warum dies die richtige Antwort wäre? Ein Link kann sich im Laufe der Zeit ändern, was diese Antwort dann falsch machen würde.
Markiert Ihr TextMate irgendwelche Namen nach „neu“ oder nur die, die irgendwie deklariert wurden?
– Mykola Golubjew
16. April 09 um 10:52 Uhr
Leider ist das, was vim als Syntax-Highlighter bezeichnet, normalerweise nur ein Lexer, der Klammern abgleichen kann und den grundlegenden Kontext kennt. Das gilt sowohl für C- als auch für CPP-Syntaxdateien. Sie bräuchten einen “echten” Parser, um diese Fälle zu handhaben … Das bedeutet etwas c.vim-Hacking 😉
– Viraptor
17. April 2009 um 23:30 Uhr
Ich habe hier eine ähnliche Frage zu #defines gepostet: stackoverflow.com/questions/1512602/…. Ihre Hinweise/Vorschläge sind willkommen. Ich hoffe, es gibt eine Möglichkeit, dies wie die von Eduardo vorgeschlagene coole Antwort hervorzuheben.
– Benutzer183442
3. Oktober 09 um 6:49 Uhr
STL verbessert: Verbesserte Hervorhebung der C++-STL-Syntax macht die STL-Syntax schöner.
– royhowie
9. Oktober 16 um 21:53 Uhr