如何定义多个emacs面?

如何定义多个emacs面?,emacs,emacs-faces,Emacs,Emacs Faces,我正在尝试定义一些emacs字体面来进行一些自定义高亮显示。当我单独定义它们时,这似乎起作用: (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

我正在尝试定义一些emacs字体面来进行一些自定义高亮显示。当我单独定义它们时,这似乎起作用:

(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
但是,我有几十个,我想从某种颜色表中一次性定义它们:

(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") ))
我的困难在于为每个面组合符号名称,即将“My-”和“-face”连接到表中条目的任一侧。我发现(实习生)可以从字符串中生成一个新符号,但是(defface)不接受这个符号,因为我所做的似乎等同于(defface“my-r-face…”,而defface不喜欢引用的符号,而是期望(defface my-r-face..)。我的尝试如下:

(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)
)
(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)))
  )
)
运行此命令将导致

Lisp error: (wrong-type-argument symbolp (intern (concat "fegs-" (nth 1 tpl) "-face")))
  (defvar (intern (concat "fegs-" ... "-face")) (quote (intern ...)) "colour")
有人能解释一下我做错了什么,或者如果我完全找错了方向,有更好的方法吗


谢谢。

defvar是一种特殊的形式,defface是一个宏(因此参数是未赋值传递的)。您是否尝试在

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

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

最终工作的完整代码如下所示:

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

我的defvar行稍有不同,因为这允许突出显示代码将人脸作为全局变量拾取到其他位置。

您可以避免
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)

我试图避免eval,这种情况下它真的是适合这份工作的工具吗?我不知道足够多的lisp来声称(甚至不知道)eval是适合这份工作的工具。我只是认为它是适合这份工作的工具:-)。请不要做“defvar”的事情:你只需要“defface”。由于各种原因,这是针对字体锁定使用的原始面执行的,从那时起,每个人都复制了此错误。如果我删除defvar(或下面代码中的变体)然后,所有突出显示都无法正常工作。这是由于模式其余部分中使用的机制造成的吗?它通过将面和一些关键字regexp添加到一个列表中,然后在字体锁定的内部使用该列表,如果没有defvar,这将停止工作。这是因为您的字体锁定规则是错误的:它们可能需要说
“my-r-face”
而不是
my-r-face
。如上@Stefan所述,只要在使用defvar行的字体锁定定义中引用了该行的名称,就不需要defvar行。