我的笔记本是 Retina 屏幕,同样的字体大小在笔记本屏幕上比外接显示器上看起来要大,而且我喜欢用两个 frame,每个屏幕一个。这样的话,如果设置的字体大小在笔记本屏幕上看起来合适,在外接显示器上看起来就有点小,在外接显示器上合适的字体大小,在笔记本屏幕上又显得有点大,我找到一个办法可以根据显示器是否是 Retina (当然也可以根据其他属性,比如横/纵向像素数)来设置不同的字体大小:
(defun lx/set-monospaced-font (english chinese english-retina-size chinese-retina-size english-normal-size chinese-normal-size)
(when window-system
(dolist (monitor-attrs (display-monitor-attributes-list))
(let* ((scale-factor (cdr (assoc 'backing-scale-factor monitor-attrs)))
(english-size (if (> scale-factor 1) english-retina-size english-normal-size))
(chinese-size (if (> scale-factor 1) chinese-retina-size chinese-normal-size))
(frames (cdr (assoc 'frames monitor-attrs))))
(dolist (frame frames)
(set-face-attribute 'default frame :font
(format "%s:pixelsize=%d" english english-size))
(dolist (charset '(kana han symbol cjk-misc bopomofo))
(set-fontset-font (frame-parameter frame 'font) charset
(font-spec :family chinese :size chinese-size) frame)))))))
(lx/set-monospaced-font "Monaco" "STHeiti" 12 14 13 16)
(add-hook 'window-configuration-change-hook #'(lambda () (lx/set-monospaced-font "Monaco" "STHeiti" 12 14 13 16)))