Emacs 字体设置的种种: Difference between revisions

From 清冽之泉
Jump to navigation Jump to search
Line 28: Line 28:
需要调试,可以 M-x eval-expression 执行下列命令:
需要调试,可以 M-x eval-expression 执行下列命令:
<syntaxhighlight lang="elisp" line>
<syntaxhighlight lang="elisp" line>
;; 列出当前 Frame 可使用的字体家族
(font-family-list)
;; 字体查找,能找到就有,找不着就 nil
;; 字体查找,能找到就有,找不着就 nil
(find-font
(find-font

Revision as of 21:06, 14 July 2026

在 GUI Frame 中,Emacs 通过 face 和 fontset,从系统已安装的字体中决定字族、字号、粗体斜体、中文字体、Emoji、符号及字体回退链。

在 TUI Frame 中,字族和字号由终端模拟器或 Linux 虚拟控制台决定;Emacs 仍然负责 face、颜色、语法高亮,并向终端请求粗体、斜体等显示效果。终端不支持的属性会被忽略。

总览

字体设置极简总览:

;; 统一控制基础字号
(set-face-attribute
 'default nil
 :height 160)

;; 汉字优先使用 Noto Sans CJK SC
(set-fontset-font
 "fontset-default"
 'han
 (font-spec :family "Noto Sans CJK SC"))

;; 主字体缺少某些汉字时,再尝试文泉驿正黑
(set-fontset-font
 "fontset-default"
 'han
 (font-spec :family "WenQuanYi Zen Hei")
 nil
 'append)

需要调试,可以 M-x eval-expression 执行下列命令:

;; 列出当前 Frame 可使用的字体家族
(font-family-list)

;; 字体查找,能找到就有,找不着就 nil
(find-font
 (font-spec :family "DejaVu Sans Mono"))

;; 查找实际使用的英文字体
(face-font 'default nil ?A)

;; 查找实际使用的中文字体
(face-font 'default nil ?中)

核心

face 层:文字用途与外观
face 职责
default 普通文本的基础,也是编程环境的默认字体
fixed-pitch 明确要求等宽的内容,如代码、表格、代码块
variable-pitch 适合文章阅读的比例字体
variable-pitch-text variable-pitch 类似,但默认稍大,更适合长文
fontset 层:为不同字符指定字体
字符类别 一般由谁决定
英文、数字、普通标点 defaultfixed-pitchvariable-pitch 的字体家族
汉字 fontset 中的 han
Emoji fontset 中的 emoji
特殊符号 fontset 中的 symbol 或具体字符范围

细节

  • default face 常用于设置西文基础字体,也可用于符号
  • fontset 常用于设置中文等非拉丁字符,也可用于西文
  • append 表示备用,prepend 表示优先
  • 建议编程用等宽字体
  • 建议阅读用比例字体
  • Org 写作用可选比例字体
  • pixelsize 依赖 DPI 和屏幕缩放比例,用 :height 可以表达更稳定的排版字号概念
  • default 用 :height 160 这种绝对整数,表示 16 point;其他用 :height 1.1 这种浮点数,表示底层字体高度的 1.1 倍
  • 字族与字号不要混在一起,分开写
  • 不要指望英文等宽字体同时负责显示汉字

Windows

;;; init-windows.el --- Windows 10 平台配置

;; ----------------------------------------
;; 编程字体
;; ----------------------------------------

;; 普通代码、界面和绝大多数缓冲区的基础字体
(set-face-attribute
 'default nil
 :family "Consolas"
 :height 160)

;; 明确要求等宽显示的内容
;; 使用相对字号,跟随 default 一起缩放
(set-face-attribute
 'fixed-pitch nil
 :family "Consolas"
 :height 1.0)

;; 汉字字体
(set-fontset-font
 "fontset-default"
 'han
 (font-spec :family "Microsoft YaHei UI"))

;; ----------------------------------------
;; 阅读字体
;; ----------------------------------------

;; 在启用 variable-pitch-mode 的缓冲区中使用
(set-face-attribute
 'variable-pitch nil
 :family "Segoe UI"
 :height 1.0)

(provide 'init-windows)

Debian-GUI

;;; init-debian-gui.el --- Debian 图形界面配置

;; ----------------------------------------
;; 编程字体
;; ----------------------------------------

;; 开源等宽西文字体
(set-face-attribute
 'default nil
 :family "DejaVu Sans Mono"
 :height 180)

;; 代码块、表格及其他要求等宽的内容
(set-face-attribute
 'fixed-pitch nil
 :family "DejaVu Sans Mono"
 :height 1.0)

;; 开源中文黑体
(set-fontset-font
 "fontset-default"
 'han
 (font-spec :family "WenQuanYi Micro Hei"))

;; 如果以后确实遇到缺字,再启用备用字体:
;;
;; (set-fontset-font
;;  "fontset-default"
;;  'han
;;  (font-spec :family "WenQuanYi Zen Hei")
;;  nil
;;  'append)

;; ----------------------------------------
;; 阅读字体
;; ----------------------------------------

;; 西文阅读使用开源衬线字体
(set-face-attribute
 'variable-pitch nil
 :family "DejaVu Serif"
 :height 1.0)

(provide 'init-debian-gui)

Debian-TUI

;;; init-debian-tui.el --- Debian 终端环境配置

;; TUI Emacs 不负责选择字体家族和字号。
;;
;; 字体应在实际使用的终端中配置,例如:
;; GNOME Terminal、Konsole、kitty、WezTerm 或 Linux 控制台。
;;
;; 此文件故意不设置:
;; default 的 :family / :height
;; fixed-pitch 的 :family / :height
;; variable-pitch 的 :family / :height
;; fontset-default 的 han 字体

(provide 'init-debian-tui)