Nie działa font-lock-add-words
Więc próbowałem dodać niestandardowe podświetlanie składni dla cyfr przy użyciu font-lock-add-keywordsi regex.
Przeglądałem wszystkie zasoby Emacsa, aby to zrobić i chociaż udało mi się z powodzeniem zdefiniować twarz, font-lock-add-keywordsnie działało z żadnego widocznego powodu.
Skopiowałem nawet przykłady z różnych źródeł i bezpośrednio próbowałem zmusić je do pracy bez widocznego sukcesu. Nie potrafię zrozumieć, co jest nie tak z moim kodem. Nie otrzymuję żadnych błędów, ale kiedy próbuję oszacować font-lock-add-keywords(z C-x C-e), drukuje nilw *Messages*buforze.
Aktualizacja
Posłuchałem rady Gillesa i stworzyłem tryb pomocniczy, ustawiłem font-lock-add-keywordsten niestandardowy tryb pomocniczy i użyłem cytatu dla twarzy. Chociaż widzę tryb pomocniczy w linii trybu i wiem, że działa, font-lock-add-keywordsnadal nie działa. Oto mój zaktualizowany kod:
(defgroup gio-group nil
"Group for customization"
:prefix "gio-")
(defface gio-highlight-numbers-face
'((t :inherit (default)
:foreground "#ffff00"))
"Face for numbers"
:group 'gio-group )
(define-minor-mode gio-minor-mode
"Minor mode for customizaion"
:init-value t
:lighter " GioMode"
:global t
:group 'gio-group)
(font-lock-add-keywords 'gio-minor-mode '(("[0-9]+" . 'gio-highlight-numbers-face)))
Używam GNU Emacs 26.3 (kompilacja 1, x86_64-w64-mingw32) na Windows 10. Każda pomoc jest bardzo mile widziana! Dziękuję Ci!
Odpowiedzi
Po dalszych badaniach i pewnej pomocy komentarzy Gillesa i Lindydancera odkryłem, że nie można dodawać słów kluczowych blokady czcionki do mniejszych trybów. Zamiast tego musisz dodawać i usuwać słowa kluczowe w trybie głównym, gdy tryb pomocniczy jest ładowany i usuwany.
Oto działający kod, który wyróżnia słowa kluczowe w trybie pomocniczym:
(defgroup gio-group nil
"Group for customization"
:prefix "gio-")
(defface gio-highlight-numbers-face
'((t :inherit (default)
:foreground "#ffff00"))
"Face for numbers"
:group 'gio-group )
(defvar gio-keywords '(("\\(\\b\\|[-]\\)\\([-]?\\([0-9]+\\)\\(\\.?[0-9]\\)*\\)\\b" . 'gio-highlight-numbers-face)) ;; Integers & Decimals
"Keywords for gio-minor-mode highlighting")
(define-minor-mode gio-minor-mode
"Minor mode for customization"
:init-value 1
:lighter " GioMode"
:group 'gio-group
(when (bound-and-true-p gio-minor-mode)
(font-lock-add-keywords nil gio-keywords)
(font-lock-fontify-buffer))
(when (not (bound-and-true-p gio-minor-mode))
(font-lock-remove-keywords nil gio-keywords)
(font-lock-fontify-buffer)))
(define-globalized-minor-mode gio-global-minor-mode gio-minor-mode gio-minor-mode :group 'gio-group)
(gio-global-minor-mode 1)
font-lock-add-keywordsdodaje słowa kluczowe dla określonego trybu głównego , takiego jak tryb Lisp, tryb C lub tryb HTML. Ponieważ font-lock-modenie jest to tryb główny, (font-lock-add-keywords 'font-lock-mode …)nigdy nie ma żadnego efektu.
Jeśli naprawdę chcesz, aby słowa kluczowe blokujące czcionki były stosowane w każdym głównym trybie, musisz zdefiniować tryb pomocniczy. Tak działa tryb białych znaków . Wiele trybów białych znaków jest bardziej skomplikowanych niż to, czego potrzebujesz. Być może mógłbyś dodać ustawienie „podświetlenia cyfr” do trybu białych znaków, ale łatwiej byłoby zdefiniować własny tryb. Funkcja wygody define-minor-modepomaga, ale nadal musisz ręcznie dodawać i usuwać słowa kluczowe, gdy tryb jest włączony lub wyłączony, dzwoniąc (font-lock-add-keywords nil …)i (font-lock-remove-keywords nil …). Zobacz Czy mogę dodać podświetlenie w trybie pomocniczym? po instrukcje.
Ponadto jest pewien problem w działaniu twarzy: nazwa twarzy to symbol, który nie jest zmienną. (MATCHER . FACESPEC)Forma font-lock-keywordswymaga FACESPEC, aby być wyrażeniem, którego wartość określa twarz. custom-faces-highlight-numbers-facenie działa, ponieważ nie jest prawidłowym wyrażeniem, ponieważ symbol custom-faces-highlight-numbers-facenie jest powiązany. Są na to dwa rozwiązania. Tradycyjnym rozwiązaniem jest zdefiniowanie zmiennej o takiej samej nazwie jak twarz; tak to działa w przypadku twarzy, które definiuje tryb blokady czcionki, ale
Zwróć uwagę, że w nowym kodzie w zdecydowanej większości przypadków nie ma potrzeby tworzenia zmiennych określających nazwy twarzy. Wystarczy użyć bezpośrednio twarzy. Blokada czcionek nie jest szablonem do naśladowania w tym obszarze.
Zalecanym, ale uciążliwym rozwiązaniem jest cytowanie symbolu.
(font-lock-add-keywords 'gyo-highlight-numbers-mode '(("[0-9]+" . 'custom-faces-highlight-numbers-face)))