升级到 emacs pgtk 两周以后的使用心得小结,字体配置等
settings sharing in new emacs pgtk, mostly configurate fonts
zping
1032 字
2025-04-29 21:55 +0000
这个之前一篇里提到过光标的配置。
(blink-cursor-mode -1)
除此以外,一些万年不变的配置,像下面的这几行:
(setq bookmark-watch-bookmark-file 'silent)
;; https://github.com/emacs-mirror/emacs/blob/8ac894e2246f25d2a2a97d866b10e6e0b0fede5a/lisp/bookmark.el#L1250
(setq initial-major-mode 'text-mode)
;; ;; just answer `y' or `n'
(defalias 'yes-or-no-p 'y-or-n-p)
当然,这次的重点是作为日常使用 emacs 敲中文,一个技术性问题就是中文字体设置。这里更进一步地,还有中英文混排时对齐的问题。特别是在 Markdown , org 或者代码文件中这些纯文本文件中的那些符号表格。对此我的解决方式是直接把主字体设为一款等宽简中字体。提一下,这里要注意字体的字号不要设置得过小。
(set-frame-font "Noto Sans Mono CJK SC-12")
不过,这个简中等宽字体是缺少,比如说西里尔字母(cyrillic)这种非拉丁字母的,自然这样配置就无法无法显示,因此需要反过来重新配置对其它字符集的支持('unicode) 。
(set-fontset-font "fontset-default" 'unicode "FreeMono" nil 'prepend)
(set-fontset-font "fontset-default" 'unicode "Font Awesome 6 Free" nil 'prepend)
(set-fontset-font "fontset-default" 'unicode "Font Awesome 6 Brands" nil 'prepend)
(set-fontset-font "fontset-default" 'unicode "Noto Sans Mono" nil 'prepend)
(set-fontset-font "fontset-default" 'emoji "Noto Color Emoji" nil 'prepend)
(set-fontset-font "fontset-default" 'symbol "Symbols Nerd Font Mono" nil 'prepend)
当然,从绘制符号表格的角度,这样做,如果表格中有希腊、西里尔等字母,那表格仍不会对齐。如果要满足这个需求,简单地设置字体就不够了。需要 cnfonts 这种工具来调整不同字体间的字体实现对齐,同时要考虑为不同的场景(emacs mode)选用不同的字体集(fontset)。如此会让配置会变得有那么一点点复杂,这里就不再进一步耗费过多精力去讨论了。
最后还有一点需要谈一下,就是 use-default-font-for-symbols 变量,如不将其设为 nil 的话,那么 Emacs 缺省行为是直接使用默认字体来渲染标点(punctuation)和符号(symbol),而不会顾及我们在上面的那些配置。这个其实是比较坑的。
最明显的就是现代的英文文本中会广泛使用弯引号,特别是直接会使用右单弯引号作为省字符号和所有格符号。而这种用法下,如果使用中文字体来渲染右单弯引号,那么英文会根本没法看。
主要原因在于 ASCII 集内的引号是不分左右的,而相当多的平面媒体出于用户阅读体验的考虑,则希望区分左右引号。这样它们使用其实是 Unicode 集内的单双引号(即 0x2018, 0x2019, 0x201C, 0x201D 这四个字符)。当然,中文标点当然也是这四个。大部分 CJK 字体渲染这四个字符用的标准的全角(full-width),而非 CJK 字体等宽根本就没有这个概念。这也是使用 CJK 字体渲染英文文本时最常遇到的问题。对于浏览器打开的 html 文档来说,浏览器会尝试确认内容的语言,不同的语言会用不同的字体来渲染。只是用 Emacs 处理纯文本这个地方就比较坑。
个人觉得这是标准的坑。毕竟 Unicode 本身是有专门的两个区间(U+3000..U+303F 和 U+FF00..U+FFEF),用于 CJK 相关的标点符号,包括逗号和句号,甚至是括号。然而类似的左右单双引号,却要共用字符集代码。我反正不能理解这个思路。