背景

最近把 Windows Terminal 的默认字体换成了 Maple Mono NF CN

这个字体比较适合终端和代码环境:

  • Maple Mono:面向代码阅读的等宽字体
  • NF:Nerd Font,内置终端和开发工具常用图标
  • CN:包含中文 CJK 字形,中英文混排更稳

用在 Windows Terminal、Codex、Neovim、VS Code 终端里都比较合适。尤其是终端 TUI、prompt 图标、中文日志混排这些场景,不容易出现图标缺失、中文 fallback、行高突变的问题。

下载来源

官方预览页:

https://font.subf.dev/en/

GitHub release:

https://github.com/subframe7536/maple-font/releases/latest

需要下载的包是:

MapleMono-NF-CN.zip

这里不要只下 MapleMono-NF.zip,它有 Nerd Font 图标,但不带中文 CJK;也不要只下 MapleMono-CN.zip,它有中文,但没有 Nerd Font 图标。

安装位置

当前用户安装字体时,字体文件应该放到:

%LOCALAPPDATA%\Microsoft\Windows\Fonts

展开后通常会得到这些文件:

MapleMono-NF-CN-Regular.ttf
MapleMono-NF-CN-Bold.ttf
MapleMono-NF-CN-Italic.ttf
MapleMono-NF-CN-BoldItalic.ttf
...

关键坑点

Windows 当前用户字体需要写注册表:

HKCU\Software\Microsoft\Windows NT\CurrentVersion\Fonts

踩坑点在这里:注册表 value 最好写完整路径,不要只写文件名

错误示例:

MapleMono-NF-CN-Regular.ttf

更稳的写法:

C:\Users\<User>\AppData\Local\Microsoft\Windows\Fonts\MapleMono-NF-CN-Regular.ttf

如果只写文件名,字体文件和注册表项看起来都存在,但 Windows Terminal 可能仍然报:

找不到以下字体:Maple Mono NF CN。请安装它们或选择其他字体。

原因是 Windows Terminal 通过系统字体枚举拿字体族名,短文件名注册不一定能被当前用户字体缓存正确识别。

应用到 Windows Terminal

Windows Terminal 配置文件通常在:

%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json

修改:

"profiles": {
  "defaults": {
    "font": {
      "face": "Maple Mono NF CN",
      "size": 12
    }
  }
}

如果原来已经有 font.size,保留原字号,只改 face 就行。

改之前建议备份一下 settings.json

Copy-Item $settings "$settings.bak-$(Get-Date -Format 'yyyyMMdd-HHmmss')"

给 Agent 的通用 Prompt

下面这段可以直接丢给 Codex / Claude Code,让它在 Windows 上自动安装并应用:

请在 Windows 上安装 Maple Mono NF CN 字体,并把 Windows Terminal 默认字体设置为 Maple Mono NF CN。
 
要求:
1. 先确认当前环境是 Windows,并读取项目/全局 AGENTS.md、CLAUDE.md 等本地说明。
2. 从官方来源下载 Maple Mono 最新 release 中的 MapleMono-NF-CN.zip:
   https://github.com/subframe7536/maple-font/releases/latest
3. 解压后安装所有 MapleMono-NF-CN-*.ttf 到当前用户字体目录:
   %LOCALAPPDATA%\Microsoft\Windows\Fonts
4. 注册字体到:
   HKCU\Software\Microsoft\Windows NT\CurrentVersion\Fonts
 
注意:注册表 value 必须写完整字体文件路径,不要只写文件名。例如:
C:\Users\<User>\AppData\Local\Microsoft\Windows\Fonts\MapleMono-NF-CN-Regular.ttf
 
5. 安装后调用 AddFontResourceW 并广播 WM_FONTCHANGE,确保当前系统字体枚举能看到 Maple Mono NF CN。
6. 验证系统能枚举到字体族名:
   Maple Mono NF CN
7. 找到 Windows Terminal settings.json,通常在:
   %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
8. 修改 profiles.defaults.font.face 为:
   Maple Mono NF CN
 
保留原来的字号和其他配置。修改 settings.json 前先生成带时间戳的备份。
 
9. 最后验证 settings.json 里已设置:
   "font": {
     "face": "Maple Mono NF CN"
   }
 
如果 Windows Terminal 已经打开,提醒我重启 Terminal 才能加载新字体缓存。

验证字体是否真的生效

可以用 PowerShell 查系统字体枚举:

Add-Type -AssemblyName System.Drawing
(New-Object System.Drawing.Text.InstalledFontCollection).Families |
  Where-Object { $_.Name -like '*Maple*' } |
  Select-Object -ExpandProperty Name

正常应该能看到:

Maple Mono NF CN
Maple Mono NF CN ExtraBold
Maple Mono NF CN ExtraLight
Maple Mono NF CN Light
Maple Mono NF CN Medium
Maple Mono NF CN SemiBold
Maple Mono NF CN Thin

如果这里看不到,Windows Terminal 大概率也看不到。

刷新字体缓存

安装后可以调用 AddFontResourceW,再广播 WM_FONTCHANGE

$sig = @'
using System;
using System.Runtime.InteropServices;
public static class FontRefreshNativeMethods {
  [DllImport("gdi32.dll", CharSet=CharSet.Unicode)]
  public static extern int AddFontResourceW(string lpszFilename);
 
  [DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
  public static extern IntPtr SendMessageTimeout(
    IntPtr hWnd,
    uint Msg,
    UIntPtr wParam,
    string lParam,
    uint fuFlags,
    uint uTimeout,
    out UIntPtr lpdwResult
  );
}
'@
 
Add-Type -TypeDefinition $sig
 
Get-ChildItem "$env:LOCALAPPDATA\Microsoft\Windows\Fonts" -Filter 'MapleMono-NF-CN-*.ttf' |
  ForEach-Object {
    [FontRefreshNativeMethods]::AddFontResourceW($_.FullName) | Out-Null
  }
 
$result = [UIntPtr]::Zero
[FontRefreshNativeMethods]::SendMessageTimeout(
  [IntPtr]0xffff,
  0x001D,
  [UIntPtr]::Zero,
  'Fonts',
  0x0002,
  5000,
  [ref]$result
) | Out-Null

如果 Windows Terminal 已经打开,最好关闭后重新打开。字体缓存有时不会在已运行进程里立刻刷新。