【发布时间】:2013-11-28 19:31:56
【问题描述】:
我正在尝试定义一些 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)
)
运行这个结果
Lisp error: (wrong-type-argument symbolp (intern (concat "fegs-" (nth 1 tpl) "-face")))
(defvar (intern (concat "fegs-" ... "-face")) (quote (intern ...)) "colour")
谁能解释一下我做错了什么,或者我是否完全找错了树并且有更好的方法来做到这一点?
谢谢。
【问题讨论】:
-
请不要做“defvar”的事情:你只需要“defface”。由于各种原因,这是为 font-lock 使用的原始面孔做的,从那时起每个人都复制了这个错误。
-
如果我删除了 defvar(或我下面代码中的变体),那么所有突出显示都不能正常工作。这是由于其余模式中使用的机制造成的吗?它通过将面孔和一些关键字正则表达式添加到列表中来继续,然后在字体锁定的内部使用该列表,并且没有 defvar 这将停止工作。
-
那是因为你的字体锁定规则是错误的:他们可能需要说
'my-r-face而不是my-r-face。
标签: emacs emacs-faces