首页
/ Fira Code:免费编程连字等宽字体的完整特性指南与本地构建实战

Fira Code:免费编程连字等宽字体的完整特性指南与本地构建实战

2026-09-04 12:23:21作者:咎竹峻Karen

本文基于 Fira Code 官方中文文档(README_CN.md)展开,系统讲解编程连字的原理与价值、字体的全部呈现特性、编辑器与终端兼容性矩阵,并深入 script/build.sh 源码,把 -f-n-w 等构建参数的实现机制和完整构建流水线讲透。读完你既能正确启用字体特性,也能修改 FiraCode.glyphs 后自行编译出定制版 OTF/TTF/WOFF 字体。

字体特性一览

Fira Code 对字母与标点所做的排版微调示意

Fira Code 对 ASCII 与框绘制字符、Powerline 等控制台 UI 的支持

问题:多字符操作符为什么需要连字

开发者日常使用的编程语言中,大量逻辑标记是用两到三个 ASCII 字符编码的。对于人脑而言,-><=:= 这样的序列是单一的逻辑标记,尽管它们在屏幕上显示为两三个字符。眼睛并非零成本地扫描、解析并把多个字符归并为一个逻辑字符。

理想情况下,每种编程语言都应当为操作符设计成熟的 Unicode 符号,但现状并非如此。连字(ligature)正是弥合这一缺口的呈现层方案。

解决方案:连字是字体呈现特性,不改变底层代码

Fira Code 是一种免费的等宽字体,内置常用编程语言中多种字符组合的连字。需要强调的关键事实是:

  • 这只是字体呈现功能:渲染层把字符序列画成一个连字字形,底层代码仍然与 ASCII 完全兼容,不影响语法高亮、编辑、复制粘贴;
  • 它有助于更快地阅读和理解代码:多字符操作符被压缩为一个视觉单元;
  • 它能纠正间距:对于一些常见序列(如 ..//),连字允许字体在视觉上纠正字符间距。

字体里都有哪些特征

连字(Ligatures)

原始文档以左右对照图说明:左侧是 Fira Code 中呈现的连字,右侧是没有连字的相同字符序列(见 extras/ligatures.png)。覆盖范围包括比较运算(<=>=!===)、逻辑运算(&&||)、箭头(->)、函数调用风格的点号序列,以及 ...=>===!== 等大量编程语言惯用序列。

可自由组合的箭头

Fira Code 带有种类繁多的箭头。更棒的是:您可以随心所欲地制作它们,并根据需要组合开始/中间/结束片段。完整的箭头集见 extras/arrows.png

标点与字母对的排版微调

Fira Code 不仅与连字有关,还对标点符号和频繁的字母对(如 fi、fl)进行了一些微调(见 extras/typographics.png)。对应源码位于 features/calt/ 目录下的 .fea 特征文件中,例如 features/calt/fi_fl.feafeatures/calt/cross.fea

样式集与字符变体

可以使用样式集(stylistic sets)/ 字符变体更改或启用某些连字(见 extras/ligature_variants.png)。仓库中这些变体以独立的 OpenType 特征文件组织在 features/ 目录下:ss01.fea ~ ss32.fea(样式集)、cv01.fea ~ cv32.fea(字符变体),以及 zero.fea(斜杠零)、onum.fea(旧式数字)等。这些正是构建参数 -f / --features 可以指定"烘焙"进字体的特性名,下文构建章节详述。

控制台 UI 支持

作为一种编程字体,Fira Code 对 ASCII/框绘图、Powerline 和其他形式的控制台 UI 具有出色的支持(见 extras/console.png)。

专用进度条字形

Fira Code 是第一个提供专用字形来渲染进度条的编程字体:// 之类的字符被映射为半宽字形,使 ░░░░██████ 50% 这类 ASCII 进度条宽度整齐。静态效果见 extras/progress.png,运行效果见 extras/progress.gif

数学排版

Unicode 覆盖使 Fira Code 成为数学写作的绝佳选择(见 extras/math.png)。

它看起来怎样

实际样本见 extras/samples.pngextras/samples2.png

下载和安装

官方发布包为 Fira_Code_v6.2.zip(2021 年 12 月 6 日发布,约 2.5 MB),仓库发布页可获取。下载后按操作系统安装到系统字体目录即可(macOS 可复制到 ~/Library/Fonts)。

安装后的启用方式因编辑器而异:多数现代编辑器需要显式打开"连字/ligatures"开关;浏览器环境则通过 CSS 启用。仓库的 distr/fira_code.css 即为随包分发的样式文件。

编辑器兼容性列表

以下清单完整继承自官方文档(官方 wiki 对各编辑器附有专门说明):

支持 不支持
Abricotine Arduino IDE
Android Studio (2.3+) Adobe Dreamweaver
Anjuta (除非在 EOF) Delphi IDE
AppCode (2016.2+) Standalone Emacs(需按官方 Emacs 方案配置)
Atom 1.1 或更新版本 IDLE
BBEdit (14.6+) KDevelop 4
Brackets(需安装第三方插件) Monkey Studio IDE
Chocolat UltraEdit
CLion (2016.2+)
Cloud9
Coda 2
CodeLite
CodeRunner
Comma(在 首选项 > 编辑器 > 字体 中)
CotEditor
Eclipse
elementary Code
Geany (1.37+)
gEdit / Pluma
GNOME Builder
Godot
GoormIDE
gVim(Windows / GTK 均可)
IntelliJ IDEA (2016.2+)
Kate, KWrite
KDevelop 5+
Komodo
Leafpad
LibreOffice
LightTable
LINQPad
MacVim 7.4 或更新版本
Mancy
MATLAB
Meld
Mousepad
NeoVim-gtk
NetBeans
Notepad (Windows)
Notepad++(需按官方方案配置)
Notepad3
Nova
PhpStorm (2016.2+)
PyCharm (2016.2+)
QOwnNotes (21.16.6+)
QtCreator
Rider
RStudio
RubyMine (2016.2+)
Scratch
Scribus (1.5.3+)
SublimeText (3143+/3146+)
Spyder IDE(仅适用于 Qt5)
SuperCollider 3
TeXShop
TextAdept (Linux, macOS)
TextEdit
TextMate 2
VimR
Visual Studio (2015+)
Visual Studio Code
WebStorm (2016.2+)
Xamarin Studio/Monodevelop
Xcode (8.0+,否则需第三方连字插件)
Xi
Probably work: Smultron, Vico Under question: Code::Blocks IDE

终端兼容性列表

支持 不支持
crosh Alacritty
Hyper Cmder
iTerm 2 ConEmu
Kitty GNOME Terminal
Konsole gtkterm(等待上游 VTE 支持)
Mintty guake(等待上游 VTE 支持)
QTerminal LXTerminal(等待上游 VTE 支持)
st(需连字补丁) mate-terminal
Terminal.app PuTTY
Termux rxvt
Token2Shell sakura(等待上游 VTE 支持)
Wez's terminal Terminator(等待上游 VTE 支持)
Windows Terminal terminology
ZOC (macOS) Windows Console
xfce4-terminal(等待上游 VTE 支持)
xterm
ZOC (Windows)

浏览器支持

通过 HTML 引入样式表:

<!-- HTML -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/firacode@6.2.0/distr/fira_code.css">

或在 CSS 中直接导入:

/* CSS */
@import url(https://cdn.jsdelivr.net/npm/firacode@6.2.0/distr/fira_code.css);

指定字体族(含对可变字体的渐进增强):

/* Specify in CSS */
code { font-family: 'Fira Code', monospace; }

@supports (font-variation-settings: normal) {
  code { font-family: 'Fira Code VF', monospace; }
}

浏览器侧注意事项:

  • IE 10+、Edge Legacy:需额外启用 font-feature-settings: "calt";calt 即 contextual alternates,是连字生效的核心特征名);
  • Firefox、Safari、Chromium 系浏览器(Chrome、Opera):直接支持;
  • 代码编辑组件 ACECodeMirror 可用(CodeMirror 需启用 font-variant-ligatures: contextual;)。

使用 Fira Code 的项目

官方列出的使用者包括:CodePen、Blink Shell、Klipse、IlyaBirman.net、EvilMartians.com、FromScratch、PEP20.org。

备选方案

带连字的免费等宽字体:Hasklig、Monoid、Fixedsys Excelsior、Iosevka、DejaVu Sans Code、Victor Mono、Cascadia Code、JetBrains Mono。

带连字的付费等宽字体:PragmataPro、Mono Lisa。

在本地构建 Fira Code

如果你修改过 FiraCode.glyphs 并希望自己构建 OTF / TTF / WOFF 文件,可以走"本机工具链"或"Docker 容器"两条路径。

路径一:macOS 本机构建

# 安装所有编译需要的工具
./script/bootstrap_macos.sh

# 编译字体文件
./script/build.sh

# 将 otf 文件安装到 ~/Library/Fonts
cp distr/otf/*.otf ~/Library/Fonts

script/bootstrap_macos.sh 会通过 Homebrew 安装 python@3.12pkg-configzlibttfautohintwoff2sfnt2woff-zopfli,并用 requirements.txt 建立 Python 虚拟环境(含 fontmakegftools 等字体构建工具)。Linux 侧对应 script/bootstrap_linux.sh,通过 apt 安装 ttfautohintwoff2sfnt2woff-zopfli 等依赖。

路径二:Docker 构建

# install dependencies in a container and build the font files
make

# package the font files from dist/ into a zip
make package

Makefile 中这两个目标分别对应:在容器中执行 ./script/build.sh(挂载当前目录到容器 /opt),以及调用 script/package.sh。镜像由 Dockerfile 定义:基于 python:3,复用 bootstrap_linux.sh 安装依赖。script/package.shgit describe --tags 得到版本号,把 distr/ 目录压缩为 Fira_Code_v<版本>.zip

构建参数详解:-f-n-w

如果你想要永久开启某个特定的样式集或字符变体(而你的编辑器可能不允许单独开启它们),可以把想要的功能作为逗号分隔的列表,通过 -f / --features 标志加入编译脚本。默认:无。

要用不同的字体版本做区分,可以用 -n / --family-name 指定字体系列名称。特殊值 'features' 会在默认系列名后追加一个有序的、空格分隔的已启用功能列表。默认:"Fira Code"。

-w / --weights 可限制要编译的字重。默认:"Light,Regular,Retina,Medium,SemiBold,Bold"

# 在你本地的 shell 中
./script/build.sh --features "ss02,ss08,ss10,cv03,cv07,cv14" --family-name "Fira Code straight" --weights "Regular,Bold"

# 或者通过一个 docker 容器(创建系列名为:'Fira Code cv01 cv02 cv06 cv31 onum ss01 ss03 ss04 zero')
docker run --rm -v "${PWD}":/opt tonsky/firacode:latest ./script/build.sh -f "cv01,cv02,cv06,ss01,zero,onum,ss03,ss04,cv31" -n "features"

源码解析:构建流水线是怎么跑的

script/build.sh 的源码结构看,完整流程分为四步:

1. 参数解析script/build.sh#L20-L57):脚本支持 -f / --features-w / --weights-n / --family-name-g / --generate-glyphs-only 四个标志,并兼容 -f="1,2,3" 这种等号写法;-f 的输入会被拆成数组并去重排序。

2. 烘焙特性script/build.sh#L67-L77):当指定了 --features 时,调用 script/bake_in_features.sh。该脚本对每个特性名去 features/ 目录查找同名的 .fea 文件(如 features/ss02.fea),用 grep 抽出其中的特征代码(剔除 lookup 外壳与注释),再用 sed 把代码块插入 FiraCode.glyphsname = calt; 声明行上方——也就是说,被指定的特性会被直接写入 calt(contextual alternates)上下文特征内,随连字一起默认生效,不再需要编辑器单独开启。找不到对应 .fea 文件会直接报错退出,因此特性名必须与 features/ 下的文件名精确对应。

3. 改写系列名script/build.sh#L79-L90):若系列名不是默认的 "Fira Code",脚本用 awk 替换 glyphs 文件中的 familyName 字段,并把结果另存为 <系列名>.glyphs。注意脚本全程在临时副本上操作,不会改动仓库中的原始 FiraCode.glyphs

4. 五路并行产物script/build.sh#L97-L101):依次调用

脚本 产物 关键工具
script/build_otf.sh distr/otf/Fira Code/FiraCode-<字重>.otf fontmake -o otf,按 .* <字重> 实例过滤
script/build_ttf.sh distr/ttf/Fira Code/FiraCode-<字重>.ttf fontmake -o ttf + ttfautohint 自动提示
script/build_variable.sh distr/variable_ttf/Fira Code/FiraCode-VF.ttf fontmake -o variable + gftools fix-nonhinting / fix-gasp
script/build_woff.sh WOFF 文件 sfnt2woff 工具链
script/build_woff2.sh WOFF2 文件 woff2 / sfnt2woff-zopfli

几个值得注意的实现细节:

  • 默认字重列表script/build_otf.sh#L15 中硬编码为 Light Regular Retina Medium SemiBold Bold-w 参数可将其覆盖为任意子集(如只编译 Regular,Bold 以缩短构建时间);
  • 可变字体的构建会先用 awk 生成一份临时 glyphs,把 Retina 实例标记为 exports = 0script/build_variable.sh#L25-L26),再交给 fontmake,最后用 gftools 修复 GASP 表与非提示元数据;
  • TTF 会追加自动提示script/build_ttf.sh#L28-L30 对每个字重执行 ttfautohint --no-info --ignore-restrictions,这是 TTF 与 OTF 产物管线的主要差别;
  • -g / --generate-glyphs-only 可只生成定制后的 .glyphs 源文件而不进入字体编译,方便先用 Glyphs 应用审查结果。

制作人员

  • 作者:Nikita Prokopov(@nikitonsky)
  • 基于此项目:Fira Mono(Mozilla Fira 字体家族)
  • 灵感来源:Hasklig
  • 翻译:墨抒颖(@moshuying)
登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
903
1.82 K
docsdocs
暂无描述
Markdown
888
5.78 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
527
590
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.51 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.33 K
1.45 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384
flutter_flutterflutter_flutter
本仓库是 Flutter SDK 与 Flutter Engine 的 OpenHarmony 适配版本,由 CPF-Flutter 团队维护。开发者可使用熟悉的 Flutter 技术栈开发 OpenHarmony 应用,3.35.7 及以后的适配版本可基于本仓库源码构建支持 OpenHarmony 的 Flutter Engine。
Dart
1.17 K
341