PragmataPro

purchase

今天下单买了心水已久的PragmataPro(€19的Essential Regular版本)。与Iosevka ss08对比了一下,还是有点儿不同的。PragmataPro的清晰度、可读性确实好一点(差别不算很大,也可能是花钱带来的心理暗示。引用作者的话就是: Try to believe! :P。不过确定的是,PragmataPro的x-height更高,看上去更饱满)。

至于覆盖更多glyphs的full version我暂时不打算买了。Essential PragmataPro包含的glyphs已经覆盖了我平时看代码/笔记99%的场景中能看到的字符。另一方面,有Iosevka这样的优秀字体补充Essential PragmataPro未能支持的字符,购买昂贵的full version带给我的额外满足感可能微乎其微。我当前使用的VS Code font fallback配置是:

{
"editor.fontFamily": "Essential PragmataPro, Iosevka Fixed",
"editor.fontLigatures": "'ss08'",  // only affects Iosevka since Essential PragmataPro doesn't support ligatures
}

由于Iosevka的x-height比PragmataPro稍低一些,所以诸如aàáâ这样的字符放在一起的话,我们可以看到后面3个带调号的àáâ(fallback到Iosevka)比不带调号的a(以Essential PragmataPro字体显示)要矮一些,有点儿不和谐。如果实在介意这一点,可以使用Pragmasevka(一个Iosevka的custom build,微调了x-height)。不过这种字符对我的use case来说太少见了,而且也只有不同字体的相近字母变种紧贴在一起我才会感觉怪异,如果一些非基本拉丁字母被单独显示,例如 α β γ δ,若不是事先知情,我很难意识到它们fallback到Iosevka了。

a

不过,€19买不到Bold和Italic字重有点儿遗憾(Essential Bold可以再花 €19购买,Italic则仅包含在€59的SKU中)。以VS Code为例,如果 editor.fontFamily 列表的第一个typeface支持某个字符但没有Bold/Italic字重,VS Code不会fallback到下一个typeface,而会直接以伪粗体或伪斜体(Oblique)显示该字符。一般来说Italic与Regular的设计风格是有些不同的,例如Regular使用double-storey g而Italic使用single-storey g。Oblique则是通过算法强行把Regular的字形倾斜一定角度。

一些color scheme(e.g., Solarized)会把comments渲染为斜体/伪斜体,如果不喜欢,可以通过override textMateRules的方式对某些语法元素禁用粗体/斜体。

"editor.tokenColorCustomizations": {
    "textMateRules": [
        {
            "scope": [
                "comment"
            ],
            "settings": {
                "fontStyle": ""
            }
        }
    ]
},

这样一来comments就会以Regular字重显示,不过好在与其他代码元素仍可通过颜色区分,影响不大。 Ghostty则直接提供了font-synthetic-style这样的选项来控制是否允许使用伪斜体/伪粗体。

History

PragmataPro这个项目几年来一直在不断演进(例如微调字形、支持新的glyphs/ligatures、引入variable fonts等现代字体特性)。version history

重新去听了Kernel Panic Ep.05 “编程字体”,2:01:28处,吴涛推荐了PragmataPro。那个时候还没有Iosevka,PragmataPro也还很原始。十多年后的今天,我们有了更多现代、优秀、免费的“编程字体”可选,Condensed design、Ligatures等特性早已不再是PragmataPro的独有优势。As DiabloD3 puts it:

… the only reason PragmataPro stands out so well is the ridiculous amount of hand tuning at every height, not necessarily the actual aesthetic look of the font (of which, Iosevka certainly picks up important design cues from, even without SS08 enabled).

CJK compatibility

我很看重的CJK compatible(即两个西文字符刚好与一个CJK字符宽度对齐)特性是2016年3月的v0.822版本才引入的。此前的版本字符宽度稍宽一点。

值得注意的是,在VS Code中,默认的Word Wrap(折行)算法(simple假定所有全角字符是一样宽的,并使用U+FF4D(全角)作为宽度参考。而早期PragmataPro(v0.825之前)把U+FF4D也实现为半角宽度,这会误导VS Code的折行算法,使中英文混排的文本无法在正确位置折行。v0.825修正了这个问题。

另外,较新的PragmataPro又分为Modularspaced和Monospaced版本,其中后者(字体名为PragmataPro Mono (Liga))的所有glyphs都是半宽的,所以始终存在上述折行问题(当然也可以开启VS Code的"editor.wrappingStrategy": "advanced"选项来解决,但有额外性能开销)。

至于Essential PragmataPro,虽然它也是Monospaced(所有字符都是半宽),但由于其根本不支持U+FF4D这个码点,反而不会误导VS Code的折行算法。只要其fallback到的字体(我用Iosevka)正确实现了全角的U+FF4D,就可以正确折行。

Essential PragmataPro v1.4 supported glyphs

As of 2026-05, Essential PragmataPro v1.4支持的glyphs有656个,可以用如下命令查看。

fc-query --format='%{charset}\n' <font_file>.ttf

包括Basic Latin (0020-007E), Mathematical Operators (2200-22FF), Control Pictures (2400-2426), Box Drawing/Block Elements (2500-259F);另有一些零散的glyphs,例如希腊字母中只支持了Ω (03A9)和π (03C0)这2个。官方Handbook列出了Essential和完整版的差异。

Essential PragmataPro v1.4的字体文件创建日期(Bold是2023-12-13/Regular是2024-01)大约与完整版0.830发布时间一致。自从v0.830微调了一些基本字符的字形后,近几年的0.9xx版本主要更新内容是ligatures、更多glyphs、variable font version等,基本不涉及Essential覆盖的字符;所以我推测当前Essential最新的v1.4版本就是0.830的子集。