Wie gebe ich ein benutzerdefiniertes Gesicht mit den Standardeinstellungen für die Schriftsperre an?


11

Wenn ich Schlüsselwörter für die Schriftsperre mit vorhandenen Gesichtern definiere, kann ich die Zeichenfolge 'foo' hervorheben.

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

Dies hebt richtig hervor:

foo richtig hervorgehoben

Wenn ich jedoch mein eigenes Gesicht definiere:

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

Es wird keine Hervorhebung angewendet:

keine Hervorhebung

Wie kann ich font-lock-defaultsein Gesicht verwenden, das ich selbst definiert habe?

Antworten:


8

Werfen Sie einen Blick auf den C-hvWert des font-lock-type-faceWertes ist nur das Symbol font-lock-type-face. Schauen Sie sich nun den C-hvWert von an my-mode-foo-face. Ach nein! du kannst nicht! Es ist keine Variable!

Sie benötigen eine Variable, um auf Ihr Gesicht zugreifen zu können. Durch das Deklarieren des foo-faceGesichts wird die foo-faceVariable nicht deklariert .

Fügen Sie (defvar my-mode-foo-face 'my-mode-foo-face)nach dem Gesicht Definition und dann font-lock können Ihre verwenden my-mode-foo-facevar , um den Zugriff auf my-mode-foo-faceGesicht. Verwirrend weiß ich.


Bearbeiten: Es scheint eine bessere Lösung zu geben, basierend auf den Aussagen von 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.

Das könnte Wilfreds Lösung sein, das Gesicht in den Schlüsselwörtern doppelt zu zitieren.


3
Aha, also erwartet es eine Variable. (cons "foo" ''my-mode-foo-face))funktioniert auch, aber ich bin mir nicht sicher, was idiomatisch ist.
Wilfred Hughes

1
Hmm, meine Antwort scheint die veraltete Lösung für das Problem zu sein, basierend auf dem, was ich lesefont-lock.el
Jordon Biondo

3
Es erwartet tatsächlich einen Ausdruck, den es auswerten wird. Sie können dort also auch eine Logik einfügen.
Dmitry
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.