Doom Emacs 设置中文字体的终极办法

(add-hook! 'rime-mode-hook :append
    (set-fontset-font t 'han (font-spec :family "Sarasa UI J"))
    (set-fontset-font t 'cjk-misc (font-spec :family "Sarasa UI J"))
    (set-fontset-font t '(#xf0000 . #xf0142) (font-spec :family "98WB-0")))

如果我需要显示中文,那么我一定会输入中文,而且一定会使用Emacs内部的输入法实现……Anyway,现在只要发现了中文显示有问题,那么就C-\ C-\两下就好了,不用再想办法和Doom Emacs的字体部分的代码还有Emacs的字体显示原理搏斗了。

1 个赞

原生 Emacs 就不需要考虑弯弯绕问题,我的字体配置只有这几行:

(set-face-attribute 'default nil
                    :family "Sarasa Mono SC Nerd"
                    :height 140
                    )
2 个赞

doom 是这样的,他主要先考虑的是拉丁字母,然后考虑的是all-the-icons,最后才想到非拉丁语系用户。所以为什么Doom Emacs里面“中”字和“言”字老是出问题,因为用到了weather-icons的字体了……

我也用的 doom. 之前看站里推荐的霞鹜文楷等宽. 中英文都换成了这个. 然后就没什么可抱怨的了.

1 个赞

sarasa和LXGW都用过,虽然都挺好,但是如果人就是这么喜欢折腾,突然觉得IBM Plex Mono好了,更加主要的因素还有现在主要用英文做笔记,这两款为了等宽等高而让拉丁字母过高了。

加到 emacs-startup-hook 里,我这儿中文就再没出现过问题:

      (add-hook! 'emacs-startup-hook :append
                 (dolist (script '(han kana hangul cjk-misc bopomofo))
                   (set-fontset-font t script font-chinese)))

我猜你不用emacsclient

确实不用,我 emacs 打开至少几天不关,没有用 emacsclient 的需求

我发现这样设置也可以

(setq doom-font (font-spec :family "Hack"))
(setq doom-unicode-font (font-spec :family "LXGW WenKai Screen"))  ;; “中”、“言”字测试

这样设置会导致emoji等unicode字符显示不了(在不勾选init.el中的emoji时)

Doom自身设置完字体后会执行 after-setting-font-hook,在那里设置中文字体即可。

  (setq doom-font (font-spec :family "Iosevka" :weight 'medium :size 13.0))

  (defun my-cjk-font()
    (dolist (charset '(kana han cjk-misc symbol bopomofo))
      (set-fontset-font t charset (font-spec :family "Sarasa Mono SC"))))

  (add-hook 'after-setting-font-hook #'my-cjk-font)

8 个赞

又涨知识了,还不知道有这个 hook ,之前我是放在 emacs-startup-hook 里的

安装Maple字体
scoop install Maple-Mono-SC-NF

doom中配置
(setq doom-font (font-spec :family “Maple Mono SC NF Bold”))

舒服了

分享下现在的字体配置:

;; Plan A: 中文苹方, 英文Roboto Mono
(setq doom-font (font-spec :family "Roboto Mono" :size 22)
      doom-serif-font doom-font
      doom-symbol-font (font-spec :family "PingFang SC")
      doom-variable-pitch-font (font-spec :family "PingFang SC" :weight 'extra-bold))

;; 如果不把这玩意设置为 nil, 会默认去用 fontset-default 来展示, 配置无效
(setq use-default-font-for-symbols nil)

;; Doom 的字体加载顺序问题, 如果不设定这个 hook, 配置会被覆盖失效
(add-hook! 'after-setting-font-hook
  (set-fontset-font t 'latin (font-spec :family "Roboto Mono"))
  (set-fontset-font t 'symbol (font-spec :family "Symbola"))
  (set-fontset-font t 'mathematical (font-spec :family "Symbola"))
  (set-fontset-font t 'emoji (font-spec :family "Symbola")))

in doom emacs , the below works well

(setq doom-font (font-spec :family "victor Mono" :size 19 ))
(defun init-cjk-fonts()
  (dolist (charset '(kana han cjk-misc bopomofo))
    (set-fontset-font (frame-parameter nil 'font)
      charset (font-spec :family "HYXinRenWenSongW" :size 20))))
(add-hook 'doom-init-ui-hook 'init-cjk-fonts)