doom emacs下中文字体的设置

我目前在使用doom emacs, 我想单独为中文设置字体, 相关片段如下:

(setq face-font-rescale-alist `((“STkaiti” . ,(/ 16.0 13))))

(set-fontset-font t 'han (font-spec :family “STKaiti” :size 16))

(set-fontset-font t 'cjk-misc (font-spec :family “STKaiti” :size 16))

尝试了以下做法:

  1. 在~/.doom.d/config.el中插入上述片段, 发现无效; 原因我猜是doom在doom-after-init-modules-hook中加入了doom|init-fonts;
  2. 将上述代码用lambda函数加入到 doom-after-init-modules-hook末尾, 此时会报错: Invalid function: (set-fontset-font t (quote han) (font-spec :family "STKaiti" :size 16))

真心请教一下doom emacs下如何单独为中文设置字体

Update: 上述代码片段是没有问题的, 在启动emacs之后, 拷贝到scratch buffer 然后 evaluate之后, 能够让设置生效.

1 个赞

哇,没人用doom吗

我用了cnfonts

(defun custom-font()
;; your settings
)

(add-hook 'after-make-frame-functions #'custom-font)

cnfont 有一些问题, 在doom中使用cnfont之后, modeline的字体会出现问题. 所以我没有用cnfont了

非常感谢您的回复, 但是这样还是不起作用

(defun +my/better-font()
  (interactive)
  ;; english font
  (if (display-graphic-p)
      (progn
        (set-face-attribute 'default nil :font (format "%s:pixelsize=%d" "Fira Code" 17)) ;; 11 13 17 19 23
        ;; chinese font
        (dolist (charset '(kana han symbol cjk-misc bopomofo))
          (set-fontset-font (frame-parameter nil 'font)
                            charset
                            (font-spec :family "Sarasa Mono SC")))) ;; 14 16 20 22 28
    ))

(defun +my|init-font(frame)
  (with-selected-frame frame
    (if (display-graphic-p)
        (+my/better-font))))

(if (and (fboundp 'daemonp) (daemonp))
    (add-hook 'after-make-frame-functions #'+my|init-font)
  (+my/better-font))

这是我现在的设置,是之前论坛一个帖子中提到的,在Doom中用起来一切正常。

9 个赞
(when IS-WINDOWS
  (when (display-graphic-p)
    (defun set-font (english chinese english-size chinese-size)
      (set-face-attribute 'default nil :font
                          (format   "%s:pixelsize=%d"  english english-size))
      (dolist (charset '(kana han symbol cjk-misc bopomofo))
        (set-fontset-font (frame-parameter nil 'font) charset
                          (font-spec :family chinese :size chinese-size))))
    (set-font "Source Code Pro" "simsun" 12 14)
    ))
1 个赞

谢谢您的回复, 这段代码是work的, 确实写得逻辑完备, 学习了~谢谢

谢谢回复, 这段代码也可以~

你好,我也在用这段代码。但是发现了一个问题。

Doom默认的字体是monaco 12。这段代码里如果我把english那里的字体或size设置成别的,就一点问题没有。如果那里和doom默认一样也是monaco 12,那后面的中文字体直接就不加载了。我跑到代码这里手动C-x C-e才生效。不知道这种问题有遇到过吗?可否帮忙解决一下?

Doom FAQ 里提到如何修改字体,既然用了 doom emacs 就不要再用其它方法了,免的冲突或者不生效。

~/.doom.d/config.el:

;; Doom exposes five (optional) variables for controlling fonts in Doom. Here
;; are the three important ones:
;;
;; + `doom-font'
;; + `doom-variable-pitch-font'
;; + `doom-big-font' -- used for `doom-big-font-mode'; use this for
;;   presentations or streaming.
;;
;; They all accept either a font-spec, font string ("Input Mono-12"), or xlfd
;; font string. You generally only need these two:
;; (setq doom-font (font-spec :family "monospace" :size 12 :weight 'semi-light)
;;       doom-variable-pitch-font (font-spec :family "sans" :size 13))
(setq doom-font (font-spec :family "Menlo" :size 12 :weight 'semi-light)
      doom-unicode-font (font-spec :family "monospace"))
5 个赞

从陈斌哪里看到了 cnfonts的包 这个包 可以分别设置中文和英文字体大小

调整等宽 如果觉得 cnfont太重 还可以把设置好的配置 直接复制出来 我测试了一下 在doom中是生效的

;; Auto generated by cnfonts
;; <https://github.com/tumashu/cnfonts>
(set-face-attribute
 'default nil
 :font (font-spec :name "-*-Courier New-normal-normal-normal-*-*-*-*-*-m-0-iso10646-1"
                  :weight 'normal
                  :slant 'normal
                  :size 16.0))
(dolist (charset '(kana han symbol cjk-misc bopomofo))
  (set-fontset-font
   (frame-parameter nil 'font)
   charset
   (font-spec :name "-*-STKaiti-normal-normal-normal-*-*-*-*-*-p-0-iso10646-1"
              :weight 'normal
              :slant 'normal
              :size 20.0)))

用doom emacs官方的方式设置, 目前测试下来是最好的. 好像他还同样解决了两中等宽字体的宽度适配问题.