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łączeniasyntax-ppss
haskell-fill-paragraph
połączeniasyntax-ppss
ire-search-forward
c-in-comment-line-prefix-p
przesuwa punkt i dzwonilooking-at
sp-point-in-comment
wywołuje,syntax-ppss
ale 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.
major-mode
syntax-highlighting
Wilfred Hughes
źródło
źródło
font-lock-mode
? (Nie sądzę, że powinieneś.)Odpowiedzi:
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.
Na początek użytkownik mógł wyłączyć
font-lock-mode
(może to ogromny bufor), ale nawet pofont-lock-mode
włączeniu twarze są nieco niestabilne.Ponadto użytkownik może mieć tryb pomocniczy, który dodaje niektóre
font-lock-keywords
(jak podświetlanieTODO
w 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.
źródło
Myślę, że głównym powodem jest użycie blokady czcionek
syntax-ppss
.źródło