Hervorhebung von Klassen- und Funktionsnamen in Vim

Lesezeit: 7 Minuten

Hervorhebung von Klassen und Funktionsnamen in Vim
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.

Bildvergleich zwischen Textmate(links) und Vim(rechts)
(Quelle: ivzhao.com)

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.

    – 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

1643305210 958 Hervorhebung von Klassen und Funktionsnamen in Vim
Eduardo

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):

http://pastebin.com/f33aeab77

Und der obligatorische Screenshot:

Geben Sie hier die Bildbeschreibung ein

  • 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.)

    – Ragnar

    22. Juli 15 um 16:52 Uhr


  • Ich verwende Vi derzeit nicht, habe aber Folgendes gefunden: vim.wikia.com/wiki/Syntax-based_folding

    – Janosimas

    23. Juli 15 um 18:08 Uhr

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.

Hier hat jemand damit begonnen, die cpp-Syntaxdatei zu erweitern, um Methodennamen zu unterstützen. Es ist ein Anfang, denke ich.
http://vim.wikia.com/wiki/Highlighting_of_method_names_in_the_definition

  • Die Frage bezieht sich auf das Hervorheben von Funktionsnamen im Code.

    – Mykola Golubjew

    20. April 09 um 10:48 Uhr

Hervorhebung von Klassen und Funktionsnamen in Vim
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.

1643305210 40 Hervorhebung von Klassen und Funktionsnamen in Vim
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.
1643305211 384 Hervorhebung von Klassen und Funktionsnamen in Vim

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.

Vor
nach

  • 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

1643305211 295 Hervorhebung von Klassen und Funktionsnamen in Vim
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.

    – rfornal

    3. April 15 um 14:29 Uhr

1643305211 595 Hervorhebung von Klassen und Funktionsnamen in Vim
Yogesh Arora

Versuchen Sie es mit diesem Plugin http://www.vim.org/scripts/script.php?script_id=2646
Es macht alle Ctags-Hervorhebungen sehr effizient für Sie

.

663380cookie-checkHervorhebung von Klassen- und Funktionsnamen in Vim

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy