拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Nerd Fonts 中的 Hasklig(Hasklug):带编程连字的 Haskell 开发字体及其补丁机制全解析

Nerd Fonts 中的 Hasklig(Hasklug):带编程连字的 Haskell 开发字体及其补丁机制全解析
  • 开发工具
  • CLI

【免费下载链接】nerd-fonts

Iconic font aggregator, collection, & patcher. 3,600+ icons, 50+ patched fonts: Hack, Source Code Pro, more. Glyph collections: Font Awesome, Material Design Icons, Octicons, & more

项目地址:https://gitcode.com/GitHub_Trending/ne/nerd-fonts
点击查看免费下载

Hasklig 是一款专为编程(尤其是 Haskell)设计、带有丰富代码连字(ligatures)的字体,其上游源自分支自 Source Code Pro。本篇文章以 patched-fonts/Hasklig/Black/README.md 为骨架,结合 nerd-fonts 仓库中的未打补丁原始字体、font-patcher源码与配置文件,系统讲解 Hasklig 为何以Hasklug名义发布、Nerd Fonts 三种变体(NFM / NF / NFP)的选型逻辑、连字的保留与移除方案,以及“直接下载”与“自行打补丁”两条完整实战路径。读完本文,你将能够准确理解 Hasklig 与 Hasklug 的关系,并能基于仓库中的font-patcher为任何字体家族生成定制化的 Nerd Fonts 变体。

Hasklig 是什么:为 Haskell 编程打造的连字字体

Hasklig 是一类特殊的编程字体:它在普通等宽字体的基础上加入了大量编程连字(ligatures),使得->、=>、>>=、::等 Haskell 中高频出现的符号组合能够渲染为更紧凑、更贴合语义的视觉形态,从而显著提升代码的可读性。按照该 README 的说明,Hasklig 是从 [Source Code Pro] 分支(fork)而来的字体项目,当前版本为1.2。

在 nerd-fonts 仓库中,Hasklig 的原始(未打补丁)字体完整保存在 src/unpatched-fonts/Hasklig/,共包含 14 个风格文件:

  • 常规字重:Hasklig-Regular.otf、Hasklig-Bold.otf、Hasklig-Semibold.otf、Hasklig-Medium.otf、Hasklig-Light.otf、Hasklig-ExtraLight.otf、Hasklig-Black.otf
  • 斜体字重:Hasklig-It.otf、Hasklig-BoldIt.otf、Hasklig-SemiboldIt.otf、Hasklig-MediumIt.otf、Hasklig-LightIt.otf、Hasklig-ExtraLightIt.otf、Hasklig-BlackIt.otf

其中Hasklig-Black.otf即本文关联目录 patched-fonts/Hasklig/Black/ 所对应的上游原始字体(Black 字重,即最粗的一档显示字重)。

仓库还保留了上游的完整版本发布记录,见 src/unpatched-fonts/Hasklig/relnotes.txt。从这些记录可以还原 Hasklig 的演进脉络:例如 v1.013 加入盒绘图字符与块元素、v1.016 新增 Medium 字重、v1.017 起持续改进星号与连字符的提示信息(hinting)以贴合程序员偏好、v2.001 起加入 Powerline 符号与数学运算符、v2.032 移除 SVG 表以支持文本编辑器中的彩色文字渲染等。这些细节说明 Hasklig 从一开始就是面向编程场景持续打磨的字体。

为什么打补丁后叫Hasklug而不是Hasklig

这是 Hasklig 相关 README 中最核心的命名话题。打补丁后的字体文件统一以Hasklug命名(例如HasklugNerdFont-Black.otf),而不是沿用原名的Hasklig。其原因并非拼写错误,而是为了遵守 SIL Open Font License(OFL)中的 Reserved Font Name(保留字体名)机制。

该机制的核心条款如下(引自原文档):

No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.

也就是说,未获得版权方明确书面许可时,任何“修改版本”的字体软件都不得使用被保留的字体主名称。Nerd Fonts 对字体进行补丁后属于“修改版本”,因此必须更换主名称,Hasklig因此成为Hasklug(Hasklig 与 Nerd Fonts 项目名 Nerd 的合成词)。原文档进一步总结了保留字体名机制的主要设计目标:

  • Avoid collisions(避免撞名):防止不同修改版本之间产生同名冲突;
  • Protect authors(保护原作者):避免修改版影响原作者的声誉与品牌;
  • Minimize support(最小化支持负担):防止用户把修改版的问题错误反馈给原作者;
  • Encourage derivatives(鼓励衍生作品):在不破坏原名信誉的前提下,允许并鼓励衍生与分支。

这一命名约束在 nerd-fonts 仓库中是系统性的:对比未打补丁目录 src/unpatched-fonts/Hasklig/ 与已打补丁目录 patched-fonts/Hasklig/ 即可发现,所有打补丁产物均以HasklugNerdFont系列命名,且每个字重目录(如Black/、Black-Italic/、Bold/等)下的 README 都复用了同一份说明。这份说明实际来自仓库的通用模板 src/readme-per-directory-addendum.md,由构建流程自动注入到每个字体子目录的 README 中。

Black 字重:已打补丁字体文件的组成与命名规律

先看实际的产物布局。Hasklig 打补丁后的字体文件并不放在各自的字重子目录里,而是统一放在 patched-fonts/Hasklig/ 根目录下,例如 Black 字重对应的三个变体文件:

  • HasklugNerdFont-Black.otf—— 常规 Nerd Font 变体(NF)
  • HasklugNerdFontMono-Black.otf—— Nerd Font Mono 变体(NFM)
  • HasklugNerdFontPropo-Black.otf—— Nerd Font Propo 变体(NFP)

而 patched-fonts/Hasklig/Black/ 这个子目录本身只存放该字重的README.md与LICENSE.md(Black-Italic/、Bold/、Regular/等 14 个目录同理)。因此,当你想直接使用 Black 字重时,应到父目录 patched-fonts/Hasklig/ 中下载对应的HasklugNerdFont-Black*文件,而不是到Black/子目录里找字体。

命名中的三要素分别对应三种使用场景,这也是整个 nerd-fonts 仓库通用的变体体系:

变体关键字缩写适用场景
Nerd Font(无 Mono 后缀)NF默认变体,图标通常约 1.5 个普通字母宽,大多数终端均支持
Nerd Font MonoNFM严格等宽变体,适合受等宽限制的终端、编辑器等场景
Nerd Font PropoNFP比例(proportional)变体,适合 GUI 元素、幻灯片等比例排版场景

选择哪个变体:TL;DR 快速决策指南

原文档给出了精炼的选型建议,这里完整保留并补充说明:

  • 受限于等宽字体(例如你的终端强制等宽渲染):选带Nerd Font Mono(NFM)后缀的字体,即HasklugNerdFontMono-*;
  • 想要更大的图标(通常约为普通字母宽度的 1.5 倍):选不带Mono的Nerd Font(NF),即HasklugNerdFont-*,大多数终端支持,但效果因终端而异;
  • 工作在比例(proportional)场景(如 GUI 控件、编辑演示文稿):选带Nerd Font Propo(NFP)后缀的字体,即HasklugNerdFontPropo-*。

在源码层面,这三个变体的差异由 font-patcher 的命令行参数控制,与你最终选择的文件一一对应:

  • --mono/-s(font-patcher):创建等宽字体,已有与新增字形均为单倍宽,隐含--single-width-glyphs;
  • --single-width-glyphs(font-patcher):仅将新增的图标字形生成单倍宽而非默认的双倍宽;
  • --variable-width-glyphs(font-patcher):不调整字形前进宽度(advance width,即不做“overhang”),对应 Nerd Font Propo 变体。

连字(Ligatures)支持:默认保留,可按需移除

Hasklig 的灵魂在于编程连字,因此连字在打补丁后是否存续是用户最关心的问题。原文档明确给出结论:

  • 连字在打补丁字体中通常会被保留;
  • 历史版本中,Nerd Fontsv2.0.0的Nerd Font Mono字体不包含连字,但从v2.1.0起这一限制已被取消,Mono 变体同样保留连字;
  • 如果你使用支持连字的终端,却不希望看到连字效果,通常可以在终端设置中直接关闭连字渲染。

如果你希望在字体层面彻底移除连字(而不是依赖终端设置),仓库同样提供了底层支持:font-patcher的--removeligs/--removeligatures参数(font-patcher)会依据配置文件中的Subtables段删除指定的连字子表。其实现位于remove_ligatures()方法(font-patcher):先读取配置中的ligaturesJSON 列表,再逐条从字体 GSUB 表中移除匹配的连字子表。仓库给出了完整的配置示例 src/config.sample.cfg:

[Config] commandline: --removeligatures --makegroups 2 abort-mono-patch: True [Subtables] # 每条为:一个子表名字符串,或 [字体名正则, 子表名] 二元组(正则可加 '!' 取反) ligatures: [ "'dlig' Discretionary Ligatures lookup 12 contextual 0", "'dlig' Discretionary Ligatures lookup 11 subtable", "'dlig' Discretionary Ligatures lookup 9 subtable", ["!Italic", "'liga' Standard Ligatures in Latin lookup 6 subtable"] ]

该示例展示了两种写法:直接给出要删除的子表全名(如'dlig' Discretionary Ligatures lookup 12 contextual 0),或用“字体全名正则 + 子表名”的二元组做条件删除(如对非 Italic 字体删除'liga' Standard Ligatures子表)。同时注意abort-mono-patch: True的含义——当配置文件中启用了该标志时,font-patcher会放弃对等宽字体的强制补丁尝试并直接退出(对应源码 font-patcher 的日志分支)。这正是“连字与严格等宽存在张力”这一工程权衡的体现。

两种获取方式:下载成品,或亲手打补丁

原文档给出了两条使用路径,这里结合仓库实际操作细节逐一展开。

方式一:直接下载已打补丁的字体

  • 稳定版:从项目 Release 页面下载对应字体包(Hasklig 的打包产物随版本发布提供);
  • 开发版:直接从本仓库的 patched-fonts/Hasklig/ 目录取用当前最新构建产物。

对 Black 字重,即直接使用HasklugNerdFont-Black.otf、HasklugNerdFontMono-Black.otf或HasklugNerdFontPropo-Black.otf。仓库根目录还提供了跨平台的安装脚本,可参考 install.sh(Linux/macOS)与 install.ps1(Windows)完成系统级字体安装。

方式二:使用 font-patcher 自行打补丁

当你需要定制化(例如只打部分图标集以缩小体积)时,可以使用仓库根目录的 font-patcher 脚本,针对原始字体 src/unpatched-fonts/Hasklig/Hasklig-Black.otf 执行类似命令:

# 生成默认(NF)变体 ./font-patcher src/unpatched-fonts/Hasklig/Hasklig-Black.otf # 生成等宽(NFM)变体 ./font-patcher --mono src/unpatched-fonts/Hasklig/Hasklig-Black.otf # 生成比例(NFP)变体 ./font-patcher --variable-width-glyphs src/unpatched-fonts/Hasklig/Hasklig-Black.otf

font-patcher的参数体系非常完整(定义见 font-patcher),常用项包括:

  • font:要打补丁的字体文件路径(必填,位置参数);
  • --outputdir/-out:输出目录,默认当前目录;
  • --extension/-ext:强制输出文件类型(如 ttf、otf);
  • --quiet/-q与--debug:控制输出详细程度;
  • --careful:检测到已有字形时不覆盖;
  • --glyphdir:指定图标字形来源目录,默认src/glyphs/;
  • --configfile:指定 INI 风格配置文件(见示例 src/config.sample.cfg);
  • 符号集开关:--complete/-c一次性加入全部图标,也可用--fontawesome、--material/--mdi、--octicons、--codicons、--powerline、--powerlineextra、--weather、--pomicons、--braille等按需组合。

值得特别指出的是,Hasklig 在仓库中自带打补丁配置src/unpatched-fonts/Hasklig/config.cfg,内容为:

[Config] commandline: --makegroups 2

其中--makegroups用于选择打补丁后的字体族命名策略(取值 -1 到 6,默认 1,定义见 font-patcher)。2表示启用“短家族名”命名方案,使常规(Roman)、斜体(Italic)、粗体(Bold)等变体在系统中聚合为同一字体家族(相关逻辑见 font-patcher 与 font-patcher)。当你自行打补丁时,如果使用该配置文件,--makegroups 2会作为默认命令行参数被读取;若直接手写命令行,同样建议带上--makegroups 2以获得与仓库发布版一致的文件命名。

小结

围绕 Hasklig 的Black/字重 README,本文还原了完整的技术图景:Hasklig 是为 Haskell 编程设计、分支自 Source Code Pro 的连字字体(版本 1.2);由于 SIL OFL 的保留字体名机制,Nerd Fonts 打补丁后的产物统一改名为Hasklug;最终字体按Nerd Font/Nerd Font Mono/Nerd Font Propo三套变体发布,分别对应 patched-fonts/Hasklig/ 根目录下的HasklugNerdFont-*、HasklugNerdFontMono-*、HasklugNerdFontPropo-*文件。无论是下载成品还是基于 font-patcher 与 config.cfg 自行打补丁,这套体系都能保证你获得既保留 Hasklig 连字基因、又完整携带 Nerd Fonts 图标集的编程字体。

  • 开发工具
  • CLI

【免费下载链接】nerd-fonts

Iconic font aggregator, collection, & patcher. 3,600+ icons, 50+ patched fonts: Hack, Source Code Pro, more. Glyph collections: Font Awesome, Material Design Icons, Octicons, & more

项目地址:https://gitcode.com/GitHub_Trending/ne/nerd-fonts
点击查看免费下载
上一篇:Miniflux 2 终极数据库性能调优指南:10个关键配置参数优化
下一篇:终极指南:Neutralinojs如何深度整合Windows系统功能实现跨平台应用开发

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表