夜雨聆风学习资料网

ARTICLE · 1051252

换电脑后终端中文变丑,一份能照抄的字体配置

换电脑后终端中文变丑,一份能照抄的字体配置

换电脑之后我做的第一件让自己别扭的事不是装环境,是终端里的中文,我平时在终端里跑 Claude Code 这类命令行 agent,它们会输出大段中文,系统默认拿苹方来显示,笔画细、字重也飘,盯着看半个小时眼睛就发酸,我想换成霞鹜文楷,一款开源楷体,中文社区里用得很多,装是好装,Homebrew 一条命令的事,可换上之后中文却比英文小了半号,字和字之间还发空,看着比苹方更不舒服。

苹方回退 vs 霞鹜文楷回退,中文一眼两样

我盯着那行字看了很久,第一反应是自己哪里配错了,改来改去没用,折腾了一下午,最后把字体文件翻出来、写了个脚本去量,才发现关键其实就一个数,0.5。

先说这个数怎么来的。我写了个纯标准库的小脚本 fontwidth.py,直接读字体文件里的 head 和 hmtx 表,量任意字体的西文步进和 CJK 步进,单位是 em,也就是相对字号的比例。量下来霞鹜文楷等宽版的西文是 0.500em,中文是 1.000em,它自己内部正好是 1 比 2,可终端里的格子宽度并不是文楷决定的,是主字体 Menlo 决定的,Menlo 的西文步进是 0.602em,中文占两格就是 1.204em,而文楷的中文字形只有 1.000em,差了 20%,终端要么把中文放大 20% 显得笔画偏粗,要么留白显得中文疏松偏小,我看到的发空就是后者。

换成 Iosevka 之后中文立刻正常了,因为 Iosevka 的西文步进是 0.500em,两格正好 1.000em,中文严丝合缝,更纱黑体拿 Iosevka 做西文部分也是这个原因。所以判断一个西文等宽字体能不能跟文楷配得上,实际上只看它的步进是不是 0.5em,市面上主流的 JetBrains Mono、Fira Code、Maple Mono 都是 0.6,只有 Iosevka 系是 0.5。

西文 0.5em 时中文两格严丝合缝,0.602em 时每个中文右边多出一道缝

搞清楚这个之后,剩下的就是一份能照抄的清单。装两个东西,霞鹜文楷本身,和一个只含图标符号的 Nerd Font,后者是给状态符号和箭头兜底用的,就两个字体文件。

brew install --cask font-lxgw-wenkai brew install --cask font-symbols-only-nerd-font

这里有个地方我一开始没注意,装完会往系统里塞六个文件,Light、Regular、Medium 三个字重各有普通版和等宽版,我以为写 LXGW WenKai Mono 就能拿到一整套字重,结果怎么调都只有一个粗细。去读了 ttf 的 name 表才明白,Light 和 Medium 在 macOS 里注册成了独立的字体族,不是 Regular 的字重,想要真的粗体只能显式写 LXGW WenKai Mono Medium,但那样常规文本也跟着变粗了,我选择接受系统合成的伪粗体。

终端和编辑器用等宽版 LXGW WenKai Mono,网页和 Markdown 预览用比例版 LXGW WenKai。终端必须用 Mono 版,原因倒不是怕中文错位,终端是网格渲染,中文永远占两格,真正的原因是比例版的西文步进不固定,硬塞进固定宽度的格子里会挤在一起或者被裁掉。

主字体决定格子宽度,后面接一条回退链,按顺序找字形,西文走 Menlo,中文落到文楷等宽版,图标落到那个符号包,文楷没有的生僻字再落苹方,emoji 交给系统。tty7 我现在的主力终端,配置在 ~/.config/tty7/config.json:

"font_family": "Menlo", "font_fallbacks": ["LXGW WenKai Mono", "Symbols Nerd Font Mono", "PingFang SC", "Apple Color Emoji"]

Ghostty 是多行 font-family 组成回退链,第一条决定格子宽度,它内置了 Nerd Font 符号回退,所以图标不会变方块。iTerm2 在 Text 面板勾上 Use a different font for non-ASCII text,非 ASCII 字体设文楱等宽版,这是所有终端里中英分治最干净的一种。cmux 稍微绕一点,它底层是 libghostty,字体不在自己的设置面板里改,直接读 Ghostty 的配置文件,我用 ghostty +show-config 验证过它确实读到了。

最后说为什么我没用那个比例完美的 Iosevka。因为我看不惯它的英文,0.5em 是等宽字体里最窄的一档,同屏能多塞不少字符,但字形被压得很瘦,我盯了一会儿就换回来了,中文那 20% 的落差实际看起来是可以接受的,英文不顺眼却是每一行都在提醒我。

这实际上是个纯粹的取舍,比例完美但西文不顺眼,还是西文顺眼但中文略小,我选了后者,你也可以选前者,把 Menlo 换成 IosevkaTerm Nerd Font Mono 就行。你现在的终端字体配的是什么,中文回退有没有单独调过。

顺带说一句,这套字体我也接到自己的博客网页上了,正文的中文就是这款霞鹜文楷,标题、小标题、正文都是它,加粗没用粗体,楷体一合成假粗就发糊,改成了主题色做轻强调,只有导航和按钮这些界面元素还留着黑体,正文用一套读的字、界面用一套操作的字,点进下面的链接就能直接看到效果。

博客网页的正文也换成了霞鹜文楷,标题正文同屏,加粗走主题色

—— 更多见 blog.rainnut.com

相关学习资料