Як вказати спеціальне обличчя з шрифтом-блокуванням за замовчуванням?


11

Якщо я визначаю ключові слова блокування шрифту за допомогою наявних граней, я можу виділити рядок '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)))

Це правильно підкреслює:

foo виділено правильно

Однак якщо я визначу власне обличчя:

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

Підсвічування не застосовується:

відсутність виділення

Як я можу використовувати font-lock-defaultsобличчя, яке я визначив?

Відповіді:


8

Погляньте на C-hvзначення font-lock-type-faceзначення - це просто символ font-lock-type-face. Тепер подивіться на C-hvзначення my-mode-foo-face. О ні! ти не можеш! Це не змінна!

Для доступу до обличчя вам потрібна змінна. Оголошення foo-faceобличчя foo-faceзмінною не оголошує .

Додати (defvar my-mode-foo-face 'my-mode-foo-face)після визначення обличчя, а потім блокування шрифту може використовувати ваш my-mode-foo-facevar для доступу до my-mode-foo-faceобличчя. Заплутане я знаю.


Редагувати: здається, що краще рішення базується на тому, що пише 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.

Це може бути рішення Вільфреда про подвійне цитування обличчя в ключових словах.


3
Ага, значить, очікує змінну. (cons "foo" ''my-mode-foo-face))також працює, але я не впевнений, що ідіоматично.
Вільфред Х'юз

1
Гм, моя відповідь, здається, є застарілим рішенням проблеми, заснованої на тому, що я читаюfont-lock.el
Джордон Біондо

3
Насправді це очікує вираз, який він оцінить. Так що ви можете також вкласти трохи логіки.
Дмитро
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.