Pregunta

Estoy intentando definir algunas fuentes de emacs para hacer un resaltado personalizado.Esto parece funcionar cuando los defino individualmente:

(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

Sin embargo, tengo algunas docenas de estos y quiero definirlos todos de una sola vez a partir de algún tipo de tabla de colores:

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

Mi dificultad es ensamblar los nombres de los símbolos para cada cara, es decir, concatenar "mi-" y "-cara" a cada lado de una entrada de la tabla.He descubierto (pasante) que puede crear un nuevo símbolo a partir de una cadena, sin embargo, este símbolo no es aceptable para (defface), ya que parece que lo que estoy haciendo es equivalente a (defface 'my-r-face..., y a defface no le gusta el símbolo entre comillas y espera (defface my-r-face ..en cambio.Mi intento es el siguiente:

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

Ejecutar esto da como resultado

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

¿Alguien puede arrojar algo de luz sobre lo que estoy haciendo mal, o si estoy ladrando al árbol equivocado por completo y hay una mejor manera de hacerlo?

Gracias.

¿Fue útil?

Solución

Defvar es una forma especial, Deface es una macro (por lo que se pasan los argumentos no intalados).¿Ha intentado usar algo en la línea de

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

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

Otros consejos

puedes evitar 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)

El código completo que funcionó al final es el siguiente:

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

Mi línea de defvir es ligeramente diferente, ya que esto permite que la cara sea recogida por el código de resaltado en otro lugar como una variable global.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top