Warum inspizieren Hauptmodi nicht einfach die Gesichter?

10

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 Anrufe syntax-ppss
  • haskell-fill-paragraphAnrufe syntax-ppssundre-search-forward
  • c-in-comment-line-prefix-p bewegt Punkt herum und ruft looking-at
  • sp-point-in-commentruft an syntax-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.

Wilfred Hughes
quelle
1
Ich mag diese Frage. Was ist jedoch, wenn Sie nicht verwenden font-lock-mode? (Nicht, dass ich denke, dass Sie sollten.)
mbork

Antworten:

12

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.

  1. Für den Anfang hätte der Benutzer deaktivieren können font-lock-mode(vielleicht ist es ein riesiger Puffer), aber selbst wenn font-lock-modeaktiviert, sind Gesichter etwas instabil.

  2. Der Benutzer könnte auch einen Nebenmodus haben, der einige hinzufügt font-lock-keywords(wie das Hervorheben TODOin 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.

Malabarba
quelle
2

Ich denke, der Hauptgrund ist, dass Font-Lock verwendet syntax-ppss.

Stefan
quelle