Неожиданный результат от face-font-rescale-alist в emacs

Неожиданный результат от face-font-rescale-alist в emacs

Я пытаюсь изменить размер шрифта по умолчанию с помощью

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

С моей обычной .emacsверсией на git:

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_scoreв font.c(связь). Та же проблема возникает в версии git, если я заменяю (add-to-list ...)на (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после кода, который пытается стереть настройки. Это можно сделать, прикрепив advice к 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так, как я и ожидал, исходя из прочтения документации.

Связанный контент