如何在 emacs 中的 (custom-theme-set-faces) 中使用预定义变量或常量

如何在 emacs 中的 (custom-theme-set-faces) 中使用预定义变量或常量

我想在中使用预定义的变量或字符串类型的常量 (custom-theme-set-faces),因此它会像

(setq Blue128 "#000080")
(custom-theme-set-faces
 'thename
 '(default ((t (
                        :background Blue128))))
)

如果我尝试按上述方法表述,则会得到类型不匹配的情况:

Wrong type argument: stringp, Blue128

还尝试了defvardefconstlet。在“Emacs 手册”、“Emacs Lisp 参考”和“Emacs Lisp 编程”中寻找答案。也可以在搜索引擎中查找。

实际起作用的是:

(setq Blue128 "#000080")
(custom-theme-set-faces
 'thename
 '(default ((t (
                        :background "#000000"))))
)
(set-face-attribute 'default nil :background Blue128)

...这不是我想要的。

“面部属性”实际上是“符号属性”,对吗?看起来范围和/或“评估顺序”有些微妙,但我找不到它是什么。

答案1

结论:使用反引号和逗号代替引号。

该问题涉及 elisp'(exp)引用语法:它告诉解释器不要评估以下表达式,而是将其视为常量(在本例中是稍后要评估的表达式custom-theme-set-faces,它将解析出它的参数并获取它们的值)。

引用手动的引用:

这提供了一种包含常量符号和列表的方法,它们不是自评估对象

因此,如果我理解正确的话,我们遇到的错误发生在某个地方,custom-theme-set-faces因为它需要一个文字stringp,而不是一个需要评估的符号。

答案是使用`(exp)反引号语法,它的作用是一样的,只不过允许你指定元素想要立即评估,使用附带的,symbol逗号语法来标记您现在需要评估的内容。再次手动

所以你的代码应该是:

(setq Blue128 "#000080")

(custom-theme-set-faces
 'thename
    `(default ((t (
        :background ,Blue128))))
)

这是一个非常晚的答案,但是为了其他业余 elisp 黑客的利益而提供的......

相关内容