Wie kann ich die fehlende Syntaxhervorhebung für Python-Schlüsselwörter wie "self" beheben?

11

Ich versuche, die Syntaxhervorhebung für Python zu korrigieren. Meine Farben unterscheiden sich von denen in Screenshots, wie sie in verschiedenen Vim-Farbschemata "aussehen" sollten. Und Sie können den Unterschied beim Vergleich von .rb (das korrekt angezeigt wird) mit .py sehen, was so aussieht, als wäre es ausgeschaltet:

Geben Sie hier die Bildbeschreibung ein

Beachten Sie beispielsweise, wie selfnicht hervorgehoben wird. (Dies ist in base16, aber der Vergleich wäre in anderen Farbschemata ähnlich). Im Allgemeinen sieht es so aus, als ob die Hervorhebung der Objektsyntax falsch ist.

Einige Dinge, die ich versucht habe:

  1. Betrachten der Syntax-Skripte, die vim lädt; Der einzige Unterschied zwischen .py und .rb im folgenden Beispiel besteht darin, dass ruby ​​natürlich indent / ruby.vim und syntax / ruby.vim erhält, während python indent / python.vim und syntax / python.vim erhält. Dies sind die Dateien, die mit Homebrew Vim geliefert werden.
  2. Laden der gleichen Dateien in macvim anstatt in terminal (iterm2) vim; Gleiches Problem, die Dateien sehen genauso aus wie auf dem Bild.
  3. Hinzufügen der neuen Datei python.vim . Löst das Problem nicht, auch wenn es als .vim/afterSkript verwendet wird.

Anregungen sind willkommen; Ich habe stundenlang mit dem Kopf darauf geschlagen und kann nicht herausfinden, warum die Hervorhebung nicht wie erwartet funktioniert.

sl8r000
quelle
Beachten Sie, dass Python keine Symbole enthält. Ich würde Ihnen dringend empfehlen, die Python 3-Syntax für neuen Code zu verwenden.
Martin Tournoij

Antworten:

12

So funktioniert die Hervorhebung der Syntax in Kürze:

  • In syntax/<filetype>.vimder Syntax werden Regeln mit dem :syntaxBefehl definiert . Dieser Befehl definiert die Syntax. Es heißt "Wenn Text mit diesem regulären Ausdruck übereinstimmt, ist es eine Zeichenfolge" und so weiter. Zu diesem Zweck wird eine Markierungsgruppe zugewiesen . Es spielt nicht sagen nichts über Farben als solche.

  • :highlightsagt "Markieren Sie diese Gruppe mit diesen Farben". Dies erfolgt im Farbschema , nicht in der Syntaxdatei. Es gibt eine Reihe von Standard - Highlight - Gruppen ( String, Function, Special, usw.) , die alle Farbschemata definieren sollen.

    Sie sind jedoch keineswegs auf diese Standardgruppen beschränkt, und Sie können so viele Gruppen erstellen, wie Sie möchten (Standardsyntaxdateien jedoch normalerweise nicht).

  • Die indent/<filetype>.vimDatei steuert das automatische Einrücken. Für Ruby heißt es beispielsweise "die Zeile danach defsollte die Einrückungsstufe erhöhen" und "die Zeile danach endsollte die Einrückungsstufe um eine Stufe verringern". Es macht nichts mit Farben oder Syntaxhervorhebung.


Warum werden verschiedene Programmiersprachen unterschiedlich hervorgehoben? Zum Teil wegen der persönlichen Ästhetik und der Meinungen derjenigen, die es geschrieben haben. In Ruby wird beispielsweise die TypeMarkierungsgruppe für Klassennamen verwendet. Es könnte aber auch Functionetwas anderes gewesen sein. Warum ist es Type? Wahrscheinlich, weil der Autor dachte, dass es in seinem Farbschema besser aussieht.

Noch wichtiger ist jedoch, dass die Sprachen unterschiedliche Semantiken und Empfindlichkeiten haben. In Ruby selfist ein spezielles Schlüsselwort. Du kannst nicht self = "foo"oder def self(). Das sind Fehler. Dies ist in Python jedoch nicht der Fall. Es ist nur eine weitere Variable ohne besondere Eigenschaften. Tun:

x = Object()
x.foo()

wird von Python wirklich "übersetzt" zu:

Object.foo(x)

Der Name selfist nur eine Konvention (fast universell übernommen), aber Sie können ihn beliebig benennen. def x(this):oder def x(xxx):sind gleichermaßen gültig. Sie können den Namen auch an einer selfbeliebigen Stelle verwenden. self = 'foo'und def self():sind vollkommen in Ordnung.

Ich würde argumentieren, dass dies selfnicht hervorgehoben werden sollte, da es sich weder um ein spezielles Schlüsselwort noch um eine vordefinierte Variable (wie str) handelt. Es gibt keine Spur des Wortes selfin der Syntaxdatei, daher sieht es so aus, als hätte der Autor dasselbe begründet :-)


Wenn Sie hervorgehoben werden möchten self, müssen Sie eine Syntaxregel dafür erstellen:

:syn keyword pythonBuiltin self

Der pythonBuiltinGruppenname ist bereits in der Standardsyntaxdatei definiert und mit der FunctionMarkierungsgruppe verknüpft . Verwenden Sie zum Verwenden einer neuen Markierungsgruppe Folgendes:

:syn keyword pythonSelf self
:highlight def link pythonSelf Special

Um diese Änderungen vorzunehmen, können Sie sie nicht einfach in Ihre vimrc-Datei einfügen. Die Syntaxdatei überschreibt sie. Stattdessen müssen Sie es ausführen, nachdem die Syntaxdatei geladen wurde. Dies können Sie auf zwei Arten tun:

  1. Verwenden Sie ein FileTypeAutocmd:

    augroup python
        autocmd!
        autocmd FileType python
                    \   syn keyword pythonSelf self
                    \ | highlight def link pythonSelf Special
    augroup end
    
  2. Verwenden Sie das after-directory, ~/.vim/after/syntax/python.vim:

    syn keyword pythonSelf self
    highlight def link pythonSelf Special
    

Beide Methoden sind praktisch gleich. Verwenden Sie, was Sie bevorzugen.

Martin Tournoij
quelle