Wenn Sie einen Hauptmodus schreiben, ist es oft nützlich zu wissen, ob es sich um einen Punkt in einer Zeichenfolge handelt. 'Ist Punkt in einem Kommentar?'.
Die meisten Hauptmodi scheinen zu versuchen, die Programmiersprache zu analysieren. Zum Beispiel:
python-syntax-content
Anrufesyntax-ppss
haskell-fill-paragraph
Anrufesyntax-ppss
undre-search-forward
c-in-comment-line-prefix-p
bewegt Punkt herum und ruftlooking-at
sp-point-in-comment
ruft ansyntax-ppss
, prüft aber auch, ob es sich um ein Kommentar-Delimeter handelt
Dies funktioniert jedoch in einigen Fällen nicht. In Puffern im Organisationsmodus werden Kommentare in Quellblöcken von diesen Ansätzen nicht korrekt erkannt.
Es erscheint auch sinnlos, da im Puffer bereits hervorgehobene Kommentare angezeigt werden .
Stattdessen können Sie einfach die Gesichter an der folgenden Stelle untersuchen:
(defun wh--get-faces (pos)
"Get all the font faces at POS."
(remq nil
(list
(get-char-property pos 'read-face-name)
(get-char-property pos 'face)
(plist-get (text-properties-at pos) 'face))))
(defun wh-string-p (pos)
"Return non-nil if POS is inside a string."
(memq 'font-lock-string-face (wh--get-faces pos)))
Warum machen die Hauptmodi das nicht? Der Puffer ist bereits fontifiziert, daher würde ich erwarten, dass dieser schneller und robuster ist und weniger Code benötigt.
quelle
font-lock-mode
? (Nicht, dass ich denke, dass Sie sollten.)Antworten:
Das Problem ist, dass es nicht robuster ist.
Erstens sind die Hauptmodi genau diejenigen, die für die Entscheidung verantwortlich sind, was ein Kommentar oder eine Zeichenfolge ist. Wenn sie sie erfolgreich zum Zwecke der Schriftsperrung definieren konnten, sollten sie dies auch für andere Zwecke tun können.
Zweitens ist das Lesen der Syntax, um den Kontext zu bestimmen, in dem sich der Punkt befindet, die robustere Methode, wenn dies richtig gemacht wird. Wenn Sie Fälle gefunden haben, in denen dies fehlschlägt, sollten Sie einen Fehlerbericht an den Autor im Hauptmodus senden.
Der Grund, warum die Inspektion der Gesichter weniger robust ist, liegt darin, dass sie in einigen Situationen fehlschlagen kann.
Für den Anfang hätte der Benutzer deaktivieren können
font-lock-mode
(vielleicht ist es ein riesiger Puffer), aber selbst wennfont-lock-mode
aktiviert, sind Gesichter etwas instabil.Der Benutzer könnte auch einen Nebenmodus haben, der einige hinzufügt
font-lock-keywords
(wie das HervorhebenTODO
in Kommentaren). Oder es gibt einen Nebenmodus, der einige Gesichter dynamisch anwendet, nachdem die Schriftsperre den Puffer fontifiziert hat.Zusammenfassend kann der Hauptmodus nicht garantieren, dass die von ihm definierten Gesichter die aktuell angewendeten Gesichter sind.
quelle
Ich denke, der Hauptgrund ist, dass Font-Lock verwendet
syntax-ppss
.quelle