Question

J'essaie de définir certaines polices Emacs pour effectuer une mise en évidence personnalisée.Cela semble fonctionner lorsque je les définis individuellement :

(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

Cependant, j'en ai quelques dizaines et je souhaite les définir tous en une seule fois à partir d'une sorte de table de couleurs :

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

Ma difficulté réside dans l'assemblage des noms de symboles pour chaque face, c'est-à-dire la concaténation de "mon-" et "-face" de chaque côté d'une entrée de la table.J'ai découvert (stagiaire) qui peut créer un nouveau symbole à partir d'une chaîne, mais ce symbole n'est alors pas acceptable à (effacer), car il semble que ce que je fais équivaut à (effacer 'mon-r-face..., et defface n'aime pas le symbole cité, et attend (defface my-r-face ..plutôt.Ma tentative est la suivante :

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

L'exécution de ceci entraîne

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

Quelqu'un peut-il faire la lumière sur ce que je fais de mal, ou si j'aboie complètement dans le mauvais arbre et qu'il existe une meilleure façon de procéder ?

Merci.

Était-ce utile?

La solution

Defvar est une forme spéciale, Defface est une macro (les arguments sont donc passés inévalués).Avez-vous essayé d'utiliser quelque chose dans la ligne de

(eval `(defface ,(intern "foo") '((t (:foreground "red"))) "Highlight" :group 'fortran))

(eval `(defvar ,(intern "bar")))

Autres conseils

Vous pouvez éviter 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)

Le code complet qui a fonctionné à la fin est le suivant:

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

(dolist (tpl ctable)
  (let ((fname (concat "fegs-" (nth 1 tpl) "-face")))
    (eval `(defface ,(intern fname) '((t (:foreground ,(car tpl)))) "Highlight" :group 'fortran))
    (eval `(defvar ,(intern fname) ',(intern fname)))
  )
)

My Defvar Line est légèrement différent car cela permet de ramasser le visage par le code de surbrillance ailleurs en tant que variable globale.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top