Como especifico uma face personalizada com os padrões de bloqueio de fonte?

11

Se eu definir palavras-chave de bloqueio de fonte usando faces existentes, destacarei a string '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)))

Isso destaca corretamente:

foo destacado corretamente

No entanto, se eu definir meu próprio rosto:

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

Nenhum destaque é aplicado:

sem destaque

Como posso usar font-lock-defaultscom um rosto que me defini?

Wilfred Hughes
fonte

Respostas:

8

Dê uma olhada no C-hvvalor do font-lock-type-facevalor é apenas o símbolo font-lock-type-face. Agora observe o C-hvvalor de my-mode-foo-face. Ah não! você não pode! Não é uma variável!

Você precisa de uma variável para acessar seu rosto. Declarar a foo-faceface não declara a foo-facevariável.

Adicione (defvar my-mode-foo-face 'my-mode-foo-face)após a definição da face e o bloqueio de fonte pode usar seu my-mode-foo-facevar para acessar a my-mode-foo-faceface. Confuso eu sei.


Edit: parece haver uma solução melhor com base no que font-lock.el diz:

;; 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.

Essa pode ser a solução de Wilfred de citar duas vezes o rosto nas palavras-chave.

Jordon Biondo
fonte
3
Aha, então está esperando uma variável. (cons "foo" ''my-mode-foo-face))também funciona, mas não tenho certeza do que é idiomático.
Wilfred Hughes
1
Hmm, a minha resposta parece ser a solução antiquada para o problema com base no que eu estou lendo emfont-lock.el
Jordon Biondo
3
Está esperando uma expressão, na verdade, que será avaliada. Então você também pode colocar alguma lógica lá.
Dmitry