Nerd Fonts 补丁版 Noto Mono 字体指南:字体变体选择、图标集构成与自助打补丁实操
Nerd Fonts 补丁版 Noto Mono 字体指南:字体变体选择、图标集构成与自助打补丁实操
Noto 系列是 Google 面向"全语言阅读体验"打造的字体家族,而在 Nerd Fonts 仓库中,patched-fonts/Noto/Mono/README.md 是补丁版 Noto Mono 的官方说明文档,它同时回答了三个核心问题:Noto Mono 的版本与连字处理方式、补丁字体里注入了哪些图标集,以及拿到字体后如何在"等宽图标版 / 大图标版 / 比例版"三种变体之间做选择。读完本文,你将掌握 Noto Mono 在 Nerd Fonts 中的完整资产构成、三种命名变体(NF / NFM / NFP)的取舍逻辑,以及"直接下载已补丁字体"与"用 font-patcher 自行补丁"两条获取路径的具体操作。
Noto 与 Noto Mono:面向全语言的阅读体验
文档开篇点明了 Noto 项目的宗旨:为所有语言提供优美的阅读体验("Noto's goal is to provide a beautiful reading experience for all languages")。在这个宏大的家族之下,补丁版目录覆盖了四个子族,仓库中的实际资产分布如下:
- Mono:即本篇文章的主角,见 patched-fonts/Noto/Mono;
- Sans:包含从 Thin 到 Black、Condensed/ExtraCondensed/SemiCondensed 等大量字重的 Noto Sans;
- Sans-Mono:Noto Sans Mono,补丁后文件形如
NotoSansMNerdFont-Regular.ttf; - Serif:包含完整字重与斜体、多种窄版变体的 Noto Serif。
值得注意的是文档特别说明:Noto Mono 是一款"古老"的字体(ancient font),如今的等价替代品是 Noto Sans Mono。也就是说,如果追求的是现代的等宽 Noto 体验,应当优先选择 Sans-Mono 而非 Mono;Noto Mono 之所以仍保留在仓库中,更多是出于历史兼容与老用户习惯的考虑。
版本信息
文档明确列出了各子族对应的上游版本号,这是判断字体新旧程度的第一手依据:
| 字体子族 | 版本 |
|---|---|
| Noto Serif | 2.015 |
| Noto Sans | 2.015 |
| Noto Sans Mono | 2.014 |
| Noto Mono | 1.0(2007 年) |
"Version: 1.0 (2007)" 这一行与上文"古老字体"的说法互相印证——Noto Mono 自 2007 年定型后基本不再演进。这一细节也能在仓库元数据中得到旁证:fonts.json 中 Noto 条目的 version 字段被标记为 div(即各子族版本不同,需分别看待),isMonospaced 为 true,licenseId 为 OFL-1.1-no-RFN(不保留 Reserved Font Name,见下文许可说明)。该条目对 Noto 的视觉特征描述也值得留意:"0 和 O 非常相似,字形要么偏圆润曲线、要么偏直线条"——在挑选替代等宽字体时,这一特性决定了它适合"不依赖 0/O 强区分"的使用场景。
补丁版 Noto Mono 的仓库资产
在 patched-fonts/Noto/Mono 目录下,实际交付的文件只有一组 Regular 字重,但按三种变体分别输出:
NotoMonoNerdFont-Regular.ttf——标准版(图标按双宽度布局);NotoMonoNerdFontMono-Regular.ttf——等宽版(图标单宽度);NotoMonoNerdFontPropo-Regular.ttf——比例版(图标不撑宽字符单元);- 附带
OFL.txt、LICENSE_OFL.txt两份许可文本与本文档。
对应的未补丁源字体位于 src/unpatched-fonts/Noto/Mono/NotoMono-Regular.ttf,其父目录 src/unpatched-fonts/Noto/config.cfg 中写有补丁参数 commandline: --makegroups 5,说明 Noto 系列在批量补丁时使用 --makegroups 5 的分组命名策略(--makegroups 的取值区间为 -1~6,详见下文 font-patcher 部分)。
许可与 Reserved Font Name
Noto 的许可为 SIL Open Font License 1.1(OFL),且属于 no-RFN 形态——即上游没有保留字体名称。这一点在 fonts.json 中以 "RFN": false 明确记录。OFL 的"保留字体名称(Reserved Font Name)"机制原本要求:未经版权方书面许可,修改版字体不得使用保留名称,其目的在于避免命名冲突、保护作者、减少混淆并鼓励衍生(见 src/readme-rfn-addendum.md)。由于 Noto 未使用 RFN,Nerd Fonts 可以放心地把补丁产物命名为 NotoMonoNerdFont-* 而无许可障碍。
图标集构成:注入的 14 个上游图标集
文档用一张完整的表格列出了补丁进 Noto Mono 的所有图标来源。这张表既是"这字体里到底有哪些图标"的答案,也是校验补丁结果的清单:
| 图标集名称 | 上游项目 | 版本 | 许可 |
|---|---|---|---|
| Codicons | microsoft/vscode-codicons | 0.0.45 | CC BY 4.0 |
| Devicons | devicons/devicon | 2.17.0 | MIT |
| extraglyphs | source-foundry/Hack | - | MIT |
| Font Awesome | FortAwesome/Font-Awesome | 6.5.1 | CC BY 4.0 |
| Font Awesome Extension | AndreLZGava/font-awesome-extension | 0.0.3 | MIT |
| Font Logos | lukas-w/font-logos | 1.3.0 | unlicensed |
| MaterialDesign | Templarian/MaterialDesign-Font | Oct 6, 2022 | Apache 2.0 |
| Octicons | primer/octicons | 18.3.0 | MIT |
| Seti and original | jesseweed/seti-ui | 0.8.1 | MIT |
| Pomicons | gabrielelana/pomicons | 1.001 | OFL 1.1 RFN |
| Powerline Extra | ryanoasis/powerline-extra-symbols | 1.200 | MIT |
| Powerline Symbols | powerline/powerline | 1.000(约 2013) | MIT |
| Power Symbols IEC | jloughry/Unicode | Feb 2015 | MIT |
| Weather Icons | erikflowers/weather-icons | 2.0.10 (1.100) | OFL 1.1 |
从这张表可以得到两个直接结论:
- 覆盖开发场景的主流图标体系:Font Awesome、Material Design、Octicons、Codicons(VSCode 图标)、Devicons、Seti(编辑器文件图标)、Font Logos(Linux/浏览器/编程语言 logo)几乎包揽了终端与编辑器状态栏、文件树的常见符号需求;
- Powerline 体系完整:Powerline Symbols、Powerline Extra、Power Symbols IEC 三件套保证了在 powerline 风格的状态栏(如 tmux、zsh 主题)中分隔符与箭头不缺失。
在源码层面,这些图标集的字形原料存放在 src/glyphs(含 94 个 SVG 及多份字体源文件)与 src/svgs 中,由 font-patcher 在补丁时按需注入。这些图标集与 font-patcher 的符号选项一一对应(--codicons、--fontawesome、--fontawesomeext、--fontlogos、--material、--octicons、--pomicons、--powerline、--powerlineextra、--powersymbols、--weather,以及 --complete 全量注入),也就是说:下载的已补丁字体默认是"全家桶",而自己补丁时可以精确裁剪图标集。
三种变体如何选:NF / NFM / NFP
文档给出的选择逻辑非常精炼,是全篇最具操作性的部分:
- Nerd Font Mono(NFM):当你的环境被限制为等宽字体时(例如严格对齐的终端)选择它。图标与字母同宽,保证列对齐;
- Nerd Font(NF):想要更大图标(通常是普通字母的约 1.5 倍宽)时选择不带
Mono的版本。大多数终端支持这种宽图标,但体验因人而异(文档原话为 "ymmv",即 your mileage may vary); - Nerd Font Propo(NFP):在比例字体语境下使用,例如 GUI 元素、演示文稿排版等不需要等宽约束的场景。
结合补丁器的源码行为可以进一步理解这三种变体的底层差异(选项说明见 readme.md 的 font-patcher 帮助文本):
- NFM 对应补丁参数
--mono/--single-width-glyphs:所有已存在与新注入的字形都被强制为单宽度; - NF 是默认行为:图标按双宽度注入(默认即 double-width);
- NFP 对应
--variable-width-glyphs:不调整前进宽度(不做"悬垂"),让图标按自身自然宽度参与排版。
另外 install.sh 也提供了 -s, --mono(安装单宽度变体)与 -p, --use-proportional-glyphs(安装比例变体)两个开关,与上述命名体系完全对应,安装时可按需筛选。
连字:保留策略与 Noto Mono 的特殊处理
文档关于连字(ligatures)的说明有三层,都值得展开:
- 总体策略:连字在补丁字体中一般被保留。
fi、fl这类印刷连字以及编程字体常见的->、=>箭头连字不会因补丁而丢失; - 版本演进:Nerd Fonts v2.0.0 时代,
Nerd Font Mono字体中没有连字;这一限制在 v2.1.0 被取消——即从 v2.1.0 起等宽补丁字体也保留连字。如果你用的是支持连字的终端却不想看到连字效果,通常可以在终端设置里关闭(文档原话"usually"),无需更换字体文件; - Noto Mono 的特殊裁剪:文档特别注明,补丁版中移除了一些
ldot以及fi/fl连字,因为它们在 Noto Mono 中等宽环境下只映射到一个前进宽度(advance width)。也就是说,这些连字合并后与拆开书写占用完全相同的宽度,在等宽字体里既没有视觉收益、还可能干扰字形映射,因此被裁掉。这是等宽字体补丁中一个典型的"连字与单宽度约束冲突"处理案例。
获取方式一:下载已经补丁好的字体
文档提供的第一条路径是"拿来即用",适合绝大多数用户:
- 稳定版:从 Nerd Fonts 的 Release 页面下载字体包,Noto 系列提供两个压缩格式:
Noto.zip——完整压缩包;Noto.tar.xz——体积更小的替代包;
- 开发版:直接从本仓库的 patched-fonts/Noto/Mono 目录获取对应变体的
.ttf文件(该目录即开发分支产物,可能领先于 Release 版本)。
拿到 .ttf 后,可以用仓库自带的 install.sh 完成安装。例如只安装 Noto 的等宽变体并复制到用户字体目录:
./install.sh --copy --mono NotoMonoNerdFontMono-Regular.ttf
其他常用选项包括 --link(符号链接安装,便于版本更新)、--list(预览将安装哪些文件)、--clean(清空旧的 Nerd Fonts 安装目录)、--install-to-user-path / --install-to-system-path(用户级或系统级安装位置),完整说明见脚本的 --help 输出。Linux 桌面环境还可参考仓库根目录的 10-nerd-font-symbols.conf,将 Nerd Fonts 的符号字体映射为 Unicode 后备字体,保证图形界面中图标不出现"豆腐块"。
获取方式二:使用 font-patcher 自行补丁
如果你的需求超出预置变体——比如只要某几个图标集以减小体积、或者想对 Noto Mono 应用自定义度量调整——文档给出了第二条路径:用 Nerd Fonts 自带的 font-patcher 脚本自己打补丁。完整用法与全部选项见 readme.md,这里摘取与 Noto Mono 最相关的部分。
前置条件:FontForge、Python 3、python-fontforge 与 argparse 包;Windows/macOS 上可用 brew install fontforge,Linux 上可安装发行版包或使用 FontForge AppImage。仅下载 font-patcher 脚本本身是不够的,还需要其配套的符号字形文件(仓库中即 src/glyphs)。
基础调用(推荐方式,以仓库内的 Noto Mono 源字体为例):
fontforge -script font-patcher src/unpatched-fonts/Noto/Mono/NotoMono-Regular.ttf
与变体选择直接相关的参数:
# 生成等宽变体(等价于 NFM,图标单宽度)
./font-patcher src/unpatched-fonts/Noto/Mono/NotoMono-Regular.ttf --mono
# 生成比例变体(等价于 NFP,图标不撑宽)
./font-patcher src/unpatched-fonts/Noto/Mono/NotoMono-Regular.ttf --variable-width-glyphs
# 全量注入所有图标集(等价于下载版默认行为,通常你想要的选项)
./font-patcher src/unpatched-fonts/Noto/Mono/NotoMono-Regular.ttf --complete
# 只注入特定图标集,控制最终文件体积
./font-patcher src/unpatched-fonts/Noto/Mono/NotoMono-Regular.ttf --fontawesome --octicons --powerline
其他常用选项(节选自 readme.md):
--outputdir/-out:指定输出目录(AppImage 方式下输出路径必须显式给出);--makegroups [-1,0,1,2,3,4,5,6]:切换补丁字体的命名分组策略,默认 1;Noto 的批量补丁配置使用了 5(见 src/unpatched-fonts/Noto/config.cfg);--careful:检测到已有字形时不覆盖;--removeligs(需配合--configfile):按配置文件移除指定连字——如果对 Noto Mono 的连字裁剪策略不满意,可以反向操作,自行控制去留;--adjust-line-height:调整行高,让 powerline 分隔符更居中;--dry:只检查命名、不实际写文件,适合先验证参数。
文档还提醒:补丁后的字体族名会被自动规范为"原字体名去空格加 CamelCase 后再追加 Nerd Font",例如 NotoMono 补丁后即为 NotoMono Nerd Font(见 readme.md),安装到系统时请按这个族名在终端、编辑器或 GTK/KDE 配置中引用。
小结:一份可执行的决策清单
综合文档与仓库实现,选用 Nerd Fonts 补丁版 Noto Mono 时可遵循以下清单:
- 若你其实想要"现代的 Noto 等宽字体",优先看 patched-fonts/Noto/Sans-Mono(Noto Sans Mono);Noto Mono 是 2007 年的老字体,仅在历史兼容场景下有明确价值;
- 按运行环境选变体:终端列对齐选
NotoMonoNerdFontMono-*(NFM),要大图标选NotoMonoNerdFont-*(NF),GUI/演示等比例场景选NotoMonoNerdFontPropo-*(NFP); - 需要稳定版从 Release 下载
Noto.zip或Noto.tar.xz,需要开发版直接用本仓库 patched-fonts/Noto/Mono 下的文件; - 对图标集有定制需求(如裁剪体积、只保留 powerline 符号)时,用
font-patcher配合--mono/--variable-width-glyphs/--complete及各类--*icons选项自行补丁,源字体在 src/unpatched-fonts/Noto/Mono/NotoMono-Regular.ttf; - 注意连字预期:Noto Mono 的
ldot/fi/fl连字因单宽度约束被移除,其余连字自 v2.1.0 起在等宽补丁字体中同样保留。
以上所有结论均可在本仓库的文档、元数据与源码中得到印证:字体清单与版本见 fonts.json,补丁配置见 src/unpatched-fonts/Noto/config.cfg,补丁器全部参数与示例见 readme.md,安装脚本用法见 install.sh。