Frage

Ich versuche, einige Emacs-Schriftarten zu definieren, um benutzerdefinierte Hervorhebungen vorzunehmen.Dies scheint zu funktionieren, wenn ich sie individuell definiere:

(defface my-r-face `((t (:foreground "red")))  "Red highlight")
(defvar m-r-face 'my-r-face "Red.")
(defface my-g-face `((t (:foreground "green")))  "Green highlight")
(defvar m-g-face 'my-g-face "Green.")
(defface my-b-face `((t (:foreground "#0088ff")))  "Blue highlight")
(defvar m-b-face 'my-b-face "Blue.")
....etc

Ich habe jedoch ein paar Dutzend davon und möchte sie alle auf einmal aus einer Art Farbtabelle definieren:

(setq ctable '(("red" "r")
           ("orange" "o")
           ("yellow" "y")
           ("#88ff00" "gy")
           ("green" "g")
           ("#00ff88" "gc")
           ("cyan" "c")
           ("#0088ff" "bc")
           ("blue" "b")
           ("purple" "bm")
           ("magenta" "m")
           ("#ff0088" "rm")
           ("grey" "lg")
           ("white" "w") ))

Meine Schwierigkeit besteht darin, die Symbolnamen für jedes Gesicht zusammenzusetzen, dh "mein-" und "-Gesicht" auf beiden Seiten eines Eintrags aus der Tabelle zu verketten.Ich habe (intern) entdeckt, dass aus einer Zeichenfolge ein neues Symbol erstellt werden kann, aber dieses Symbol ist dann für (defface) nicht akzeptabel, da es den Anschein hat, dass das, was ich tue, äquivalent zu (defface 'my-r-face ..., und defface mag das zitierte Symbol nicht und erwartet (defface my-r-face ..stattdessen.Mein Versuch ist wie folgt:

(dolist (tpl ctable)
  (defvar (intern (concat "my-" (nth 1 tpl) "-face"))
    (quote (intern (concat "my-" (nth 1 tpl) "-face"))) "colour")
  (defface (intern (concat "my-" (nth 1 tpl) "-face"))
    `((t (:foreground ,(car tpl)))) "Highlight" :group 'fortran)
)

Das Ausführen führt zu

Lisp error: (wrong-type-argument symbolp (intern (concat "fegs-" (nth 1 tpl) "-face")))
  (defvar (intern (concat "fegs-" ... "-face")) (quote (intern ...)) "colour")

Kann jemand etwas Licht ins Dunkel bringen, was ich falsch mache, oder wenn ich ganz auf dem Holzweg bin und es einen besseren Weg gibt, dies zu tun?

Danke.

War es hilfreich?

Lösung

defvar ist ein spezielles Formular, deface ist ein Makro (somit werden Argumente ungeloptiert).Haben Sie versucht, etwas in der Linie von

zu verwenden? generasacodicetagpre.

Andere Tipps

Sie können vermeiden eval:

(defconst my-ctable '(...))

(defmacro my-init-cfaces ()
  `(progn
    ,@(mapcar (lambda (tpl)
               `(defface ,(intern (format "my-%s-face" (nth 1 tpl)))
                  '((t :foreground ,(car tpl)))
                  ,(format "Face for color %s." (car tpl))
                  :group 'fortran))
              my-ctable)))

(my-init-cfaces)

Der vollständige Code, der am Ende funktioniert, ist wie folgt:

generasacodicetagpre.

Meine Defvar-Linie ist etwas anders, da dadurch das Gesicht von dem Hervorhebungscode an anderer Stelle als globale Variable aufgenommen werden können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top