emacs 中 face-font-rescale-alist 的意外结果

emacs 中 face-font-rescale-alist 的意外结果

我正在尝试使用以下方法修改字体的默认大小

(add-to-list 'face-font-rescale-alist (cons "^.*STIXGeneral.*$" 0.95) t)

这应该将所有名为 STIXGeneral 的字体按 0.95 缩放,因为对我来说该字体比标准字体略高。结果值为face-font-rescale-alist

(("-cdac$" . 1.3) ("^.*STIXGeneral.*$" . 0.95))

但是,在 emacs 24.3(也是 git 版本,也是预发布版本 24.3.92.1)中,添加上述代码的结果.emacs是,除初始帧外,每个帧的字体都是错误的。运行 24.3 会-Q --eval="<expression above>"得到:

(message "%s" (face-all-attributes 'default (selected-frame)))
New frame: ((:family . Geneva) (:foundry . apple) (:width . normal) (:height . 120) (:weight . normal) (:slant . normal) (:underline) (:overline) (:strike-through) (:box) (:inverse-video) (:foreground . Black) (:background . White) (:stipple) (:inherit))
Initial frame: ((:family . Menlo) (:foundry . apple) (:width . normal) (:height . 120) (:weight . normal) (:slant . normal) (:underline) (:overline) (:strike-through) (:box) (:inverse-video) (:foreground . Black) (:background . White) (:stipple) (:inherit))

使用我的常规.emacsgit 版本:

New frame: "((:family . Helvetica) (:foundry . nil) (:width . normal) (:height . 110) (:weight . normal) (:slant . normal) (:underline) (:overline) (:strike-through) (:box) (:inverse-video) (:foreground . #000000) (:background . AliceBlue) (:stipple) (:inherit))"
Initial frame: ((:family . Source Code Pro) (:foundry . nil) (:width . normal) (:height . 110) (:weight . normal) (:slant . normal) (:underline) (:overline) (:strike-through) (:box) (:inverse-video) (:foreground . #000000) (:background . AliceBlue) (:stipple) (:inherit))

初始帧中的脸部是我期望的。face-font-rescale-alist影响字体的地方font_scorefont.c关联(add-to-list ...))。如果我用替换 ,git 版本也会出现同样的问题(setq face-font-rescale-alist nil)

我在这里做错了什么?

答案1

嗯。startup.el以下代码检测到了 的变化face-font-rescale-alist,并重置了默认字体,同时还忽略了来自 的变化custom-set-face(这是我使用自定义界面设置字体的方式):

;; startup.el:670
(unless (eq face-font-rescale-alist old-face-font-rescale-alist)
 (set-face-attribute 'default nil :font (font-spec)))

因此,需要face-font-rescale-alist在尝试清除自定义的代码之后进行设置。这可以通过将建议附加到 来完成frame-notice-user-settings,该建议在面部重置代码之后运行:

;; in .emacs
(defadvice frame-notice-user-settings (before my:rescale-alist)
  (message "Set face-font-rescale-alist")
  (add-to-list 'face-font-rescale-alist
               (cons (font-spec :family "STIXGeneral") 0.95) t))
(ad-activate 'frame-notice-user-settings)

这适用face-font-rescale-alist,因为我已从阅读文档中预期它能够工作。

相关内容