为不同显示器上的不同 frame 设置不同的字体大小

我的笔记本是 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)))
5 个赞