如何将字体规范属性作为参数传递给 set-face-attribute?

How to pass font-spec attributes as arguments to set-face-attribute?

假设我在变量 my-font-spec 中有一些字体规范。例如

(setq my-font-spec (font-spec :family "XYZ"
                              :height 120
                              :weight 'normal
                              :width 'normal))

我想将此字体规范中的属性作为 &rest 参数传递给 set-face-attribute。 IOW,实际上,我想调用

(set-face-attribute some-face nil
                    :family "XYZ"
                    :height 120
                    :weight 'normal
                    :width 'normal)

但这样做时没有详细说明属性(正如我上面所做的),而是通过 my-font-spec.

的某些函数间接地进行

我不确定为什么,但是调用 (font-face-attributes my-font-spec) 不会 return 您指定的 :height 属性的值:

(:family "XYZ" :weight normal :width normal)

如果是这样,您只需调用:

(apply 'set-face-attribute some-face nil (font-face-attributes my-font-spec))

但是为了确保获取所有指定属性的值,您可以使用 face-attribute-name-alist 变量获取完整的属性列表,从 [=16 检索每个属性的值(如果存在) =],然后将它们应用到 some-face:

(let (props)
  (mapcar #'(lambda (attrval)
              (let* ((attr (car attrval))
                     (prop (font-get my-font-spec attr)))
                (if prop
                    (progn (push prop props)
                           (push attr props))))) face-attribute-name-alist)
  (apply 'set-face-attribute some-face nil props))