Jak określić niestandardową twarz z domyślnymi ustawieniami blokowania czcionek?

11

Jeśli zdefiniuję słowa kluczowe blokujące czcionkę przy użyciu istniejących ścian, mogę wyróżnić ciąg „foo”.

(defconst my-mode-font-lock-keywords
  (list
   (cons "foo" 'font-lock-type-face)))

(define-derived-mode my-mode fundamental-mode "My mode"
  "A demo mode."
  (set (make-local-variable 'font-lock-defaults) '(my-mode-font-lock-keywords)))

Podkreśla to poprawnie:

foo poprawnie podświetlone

Jeśli jednak zdefiniuję własną twarz:

(defface my-mode-foo-face
  '((t :inherit font-lock-preprocessor-face))
  "Face for highlighting 'foo'.")

(defconst my-mode-font-lock-keywords
  (list
   (cons "foo" 'my-mode-foo-face)))

(define-derived-mode my-mode fundamental-mode "My mode"
  "A demo mode."
  (set (make-local-variable 'font-lock-defaults) '(my-mode-font-lock-keywords)))

Nie stosuje się podświetlania:

bez podświetlania

Jak korzystać font-lock-defaultsz twarzy, którą sam zdefiniowałem?

Wilfred Hughes
źródło

Odpowiedzi:

8

Spójrz na C-hvwartość font-lock-type-facetej wartości to tylko symbol font-lock-type-face. Teraz spójrz na C-hvwartość my-mode-foo-face. O nie! nie możesz! To nie jest zmienna!

Potrzebujesz zmiennej, aby uzyskać dostęp do twarzy. Zadeklarowanie foo-facetwarzy nie deklaruje foo-facezmiennej.

Dodaj (defvar my-mode-foo-face 'my-mode-foo-face)po definicji twarzy, a następnie blokada czcionki może użyć twojego my-mode-foo-facevar, aby uzyskać dostęp do my-mode-foo-facetwarzy. Mylące wiem.


Edycja: wydaje się, że istnieje lepsze rozwiązanie oparte na tym, co mówi font-lock.el:

;; Originally these variable values were face names such as `bold' etc.
;; Now we create our own faces, but we keep these variables for compatibility
;; and they give users another mechanism for changing face appearance.
;; We now allow a FACENAME in `font-lock-keywords' to be any expression that
;; returns a face.  So the easiest thing is to continue using these variables,
;; rather than sometimes evalling FACENAME and sometimes not.  sm.

;; Note that in new code, in the vast majority of cases there is no
;; need to create variables that specify face names.  Simply using
;; faces directly is enough.  Font-lock is not a template to be
;; followed in this area.

To może być rozwiązanie podwójnego cytowania twarzy w słowach kluczowych przez Wilfreda.

Jordon Biondo
źródło
3
Aha, więc oczekuje zmiennej. (cons "foo" ''my-mode-foo-face))też działa, ale nie jestem pewien, co jest idiomatyczne.
Wilfred Hughes
1
Hmm, moja odpowiedź wydaje się być przestarzałym rozwiązaniem problemu opartym na tym, co czytamfont-lock.el
Jordon Biondo
3
W rzeczywistości oczekuje wyrażenia, które oceni. Możesz więc wprowadzić tam logikę.
Dmitry