Dlaczego główne tryby nie sprawdzają tylko twarzy?

10

Pisząc tryb główny, często warto wiedzieć, że „jest ciąg w ciągu?” „ma sens w komentarzu?”.

Wydaje się, że większość głównych trybów próbuje analizować język programowania. Na przykład:

  • python-syntax-content połączenia syntax-ppss
  • haskell-fill-paragraphpołączenia syntax-ppssire-search-forward
  • c-in-comment-line-prefix-p przesuwa punkt i dzwoni looking-at
  • sp-point-in-commentwywołuje, syntax-ppssale sprawdza również, czy jest na ograniczniku komentarza

Jednak w niektórych przypadkach nie działa. W buforach w trybie organizacji komentarze w blokach źródłowych nie są poprawnie wykrywane przez te podejścia.

Wydaje się to również bezcelowe, ponieważ bufor pokazuje już podświetlone komentarze .

Zamiast tego możesz po prostu sprawdzić twarze w punkcie:

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

Dlaczego główne tryby tego nie robią? Bufor jest już czcionki, więc spodziewałbym się, że będzie szybszy, bardziej niezawodny i wymaga mniej kodu.

Wilfred Hughes
źródło
1
Podoba mi się to pytanie. Co jednak, jeśli nie używasz font-lock-mode? (Nie sądzę, że powinieneś.)
mbork

Odpowiedzi:

12

Problem polega na tym, że nie jest on bardziej niezawodny.

Po pierwsze, główne tryby są dokładnie tymi, które decydują o tym, co jest komentarzem lub ciągiem znaków. Jeśli byliby w stanie je z powodzeniem zdefiniować do celów blokowania czcionek, powinni być w stanie zrobić to samo dla innych celów.

Po drugie, czytanie składni w celu ustalenia kontekstu, w którym znajduje się dany punkt, jest bardziej niezawodnym sposobem na zrobienie tego, jeśli jest wykonane poprawnie. Jeśli znalazłeś przypadki, w których to się nie udaje, warto przesłać raport o błędzie do autora trybu głównego.


Powodem, dla którego sprawdzanie twarzy jest mniej niezawodne, jest to, że może się nie powieść w niektórych sytuacjach.

  1. Na początek użytkownik mógł wyłączyć font-lock-mode(może to ogromny bufor), ale nawet po font-lock-modewłączeniu twarze są nieco niestabilne.

  2. Ponadto użytkownik może mieć tryb pomocniczy, który dodaje niektóre font-lock-keywords(jak podświetlanie TODOw komentarzach). Lub może istnieć mniejszy tryb, który dynamicznie stosuje niektóre twarze po font font-font, który buforował bufor.

Podsumowując, tryb główny nie gwarantuje, że zdefiniowane przez niego ściany są ścianami aktualnie stosowanymi.

Malabarba
źródło
2

Myślę, że głównym powodem jest użycie blokady czcionek syntax-ppss.

Stefan
źródło