2018年12月10日

emacs中英文等宽字体配置

在emacs中一直用Consolas(英文)+Yahei(中文)的字体组合,但是不是中英文等宽显示。今天测试了几种中英文等宽字体组合。比较满意的字体是Ubuntu Mono和FiraCode。

在Win10上,微软雅黑(Yahei)的等宽中文字体的显示效果是最好,且不需要安装就能用的字体,所以中文字体确定使用Yahei。在网上找了几种等宽英文字体,逐一和Yahei配合测试,看看什么组合能达到中英文混批时能够等宽显示,测试什么中英文size组合能让2个英文字符正好等于一个中文字符的宽度。

测试的几种英文字体的 1l0o 都能很好区分的。而微软的 Consolas 字体中的1和l就需要认真看才能区分出来。

Menlo Mono Nerd Font

Menlo 在macos的 terminal.app 里使用比 Ubuntu Mono 好点, Ubuntu Mono 的字体小了一点,看着费劲。

Ubuntu Mono Nerd font + 等距更纱黑体 T SC [2021-08-16 Mon 18:01] updated

Ubuntu Mono Nerd font在Ubuntu Mono的基础上增加了很多glyphs,强烈推荐。

Ubuntu Mono正好可以和更纱黑等比例缩放。更纱黑的的效果比微软雅黑好。

字体 效果
Ubuntu Mono 11 在win10上,1920x1080
Ubuntu Mono 22 在macos上,1920x1080
  (defun albert-notebook-font()
    "Config font on HP zhan66."
    (interactive)
    (if (eq system-type 'windows-nt)
        (progn
          (set-face-attribute 'default nil :font "Ubuntu Mono 11")
          (setq face-font-rescale-alist '(("等距更纱黑体 T SC" . 1)))

          (dolist (charset '(kana han symbol cjk-misc bopomofo))
            (set-fontset-font (frame-parameter nil 'font)
                              charset
                              (font-spec :family "等距更纱黑体 T SC"))))))

(defun albert-macos-notebook-font()
  "macbook air on 1680x1050."
  (interactive)
  (if (eq system-type 'darwin)
      (progn
        ;; https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts/UbuntuMono/Regular
        (set-face-attribute 'default nil :font "UbuntuMono Nerd Font Mono 20")

        (setq face-font-rescale-alist '(("苹方-简" . 1)))

        (dolist (charset '(kana han symbol cjk-misc bopomofo))
          (set-fontset-font (frame-parameter nil 'font)
                            charset
                            (font-spec :family "苹方-简")))
        )))

Consolas + Yahei

两种字体都是系统自带的,不需要网上下载。奇怪的是两种字体的size不是等比例的。如测试的大部分字体都是英文size=8 + 中文size=20和英文size=10 + 中文size=24,只有这两种组合是等宽的。

字体 效果
Consolas 8 + Microsoft Yahei 20 org mode table可以对齐,但是英文太小了
Consolas 10 + Microsoft Yahei 24 org mode table可以对齐,但是英文太小了
Consolas 11 + Microsoft Yahei 20 我原来一直用的组合,不能对齐。

Consolas-with-Yahei

把Consolas和Yahei打到一个ttf字体里了,造成了一个问题,无论选择什么size都做不到对不齐,而且size<10的时候中文显示非常难看。如此强大的emacs根本不需要二合一字体,直接可以控制中英文分别用不同的字体即可。

Source Code Variable

试了一下英文显示效果不错,但是无法和Yahei配合对齐。

Liberation-sans-narrow

不是太好看。字体有点小,而且缩放时不清晰,明显不如其他字体。

Monaco

github

字体下载url可用

感觉支持的字符数有点少。Ubuntu更多,更新更快,免费(大家都免费,哈哈)。

字体 效果
Monaco 8 + Microsoft Yahei 20 org mode table可以对齐,但是英文太小了。但是比Consolas的字体大一点,高一点,效果好很多。
Monaco 10 + Microsoft Yahei 24 org mode table可以对齐,但是中文太小了

Ubuntu Mono + Yahei

官网下载

似乎可以支持显示不少字符。

Ubuntu Mono正好可以和Yahei等比例缩放,这点比较神奇。其他字体只有2种组合能中英文对齐。

字体 效果
Ubuntu Mono 10 + Microsoft Yahei 20 org mode table可以对齐,但是英文太小了。字母a、e有点难看
Ubuntu Mono 12 + Microsoft Yahei 24 org mode table可以对齐,但是size 24的中文太大了,size 12的英文也有点大
Ubuntu Mono 11 + Microsoft Yahei 22 org mode table可以对齐,中文大小稍微大了一点,size 20就好了,勉强可以接受

FiraCode

官网下载

字体 效果
Fira Code 8 + Microsoft Yahei 20 org mode table可以对齐,但是英文太小了,不如Ubuntu的组合多。
Fira Code 10 + Microsoft Yahei 24 org mode table可以对齐,但是size 24的中文太大了

DejaVu

github

linux上的老牌等宽字体。

字体 效果
DejaVu Sans Mono 8 + Microsoft Yahei 20 org mode table可以对齐,但是英文太小了。
DejaVu Sans Mono 10 + Microsoft Yahei 24 org mode table可以对齐,但是size 24的中文太大了,size 12的英文也有点大

emacs配置

(defun albert|notebook-font()
  "Config font on HP zhan66."
  (interactive)
  (if (eq system-type 'windows-nt)
    (progn
      ;; Setting English Font
      (set-face-attribute 'default nil :font "Ubuntu Mono 11")
      ;; Chinese Font
      (dolist (charset '(kana han symbol cjk-misc bopomofo))
              (set-fontset-font (frame-parameter nil 'font)
                            charset
                            (font-spec :family "Microsoft Yahei" :size 22))))))

(defun albert|s2319-font()
  "Config font on dell s2319. 
   Ubuntu Mono 10 + Yahei 14 太小了
   Ubuntu Mono 12 + Yahei 16 比较合适
   "
  (interactive)
  (if (eq system-type 'windows-nt)
    (progn
      ;; Setting English Font
      (set-face-attribute 'default nil :font "Ubuntu Mono 12")
      ;; Chinese Font
      (dolist (charset '(kana han symbol cjk-misc bopomofo))
              (set-fontset-font (frame-parameter nil 'font)
                            charset
                            (font-spec :family "Microsoft Yahei" :size 16))))))

(if (eq window-system 'w32)
  (progn
    ;; 根据显示器实际宽度(以毫米为单位),显示字体.
    ;; DELL S2319HS 分辨率: 1920x1080, 屏幕尺寸: 509mm * 286mm
    ;; EIZO EV2451 分辨率: 1920x1080, 屏幕尺寸: 528mm * 297mm
    ;; (display-mm-height)
    (if (>= (display-mm-width) 509)
      (albert|s2319-font))

    ;; 宽度在500mm的认为是笔记本?或者更加精确一点的方式来匹配不同的笔记本型号?
    ;; HP ZHAN66 309mm X 175mm
    ;; Thinkpad T430 4xxmm X 20xmm?
    (if (eq (display-mm-width) 309)
      (albert|notebook-font))))