Add ligatures to any programming font!
This script copies the ligatures (glyphs and rendering information) from FiraCode into any other TrueType or OpenType font.
This repo contains a Fontforge python script that you can use to add the FiraCode ligatures to any font, as well as submodules for some popular programming fonts and another script for ligating all of them at once.
Pre-ligated versions are available under releases.
Using the Fonts: See the FiraCode README for a list of supported editors.
Script: This script requires FontForge python bindings. For Debian/Ubuntu they are available in python-fontforge
package. For Arch, OpenSUSE and NixOS, they are included in the fontforge
package. For macOS, they are available via brew (brew install fontforge
).
It also requires a python library called glyphsLib
.
Use automatic mode to easily convert a font family.
-
Generate a script and configuration template with:
$ scripts/generate_build.sh "FONT_FAMILY_NAME"
For example:
$ scripts/generate_build.sh "Space Mono"
-
Put the family font(s) into
input/FONT_FAMILY_NAME
-
Go to
fonts/FONT_FAMILY_NAME
-
Edit
config.py
to disable ligatures you don't want, change glyphs scale factor, and/or enable any (non-ligature) characters you want from FiraCode in addition to the ligatures. -
Edit
build.sh
to edit the output family font name, the output directory, the ligatures' weight and many more settings. -
Return to the git root directory
-
Run
$ fonts/FONT_FAMILY_NAME/build.sh
The ligated fonts will be located in the
output
directory.
-
Move/copy the font you want to ligate into
input
(or somewhere else convenient). -
Edit
config_sample.py
to disable any ligatures you don't want, etc. -
Run the script:
$ python ligate.py path/to/input/font.ttf --output-dir=path/to/output/dir/ \ --output-name='Name of Ligated Font'
For exmaple:
$ python ligate.py input/Hack/Hack-Regular.ttf --output-dir='output/Ligated Hack' \ --output-name='Liga Hack'
Which will produce
output/Ligated Hack/LigaHack-Regular.ttf
.
The font weight will be inherited from the original file; the font name will be replaced with whatever you specified in --output-name
. You can also use --prefix
instead, in which case the original name will be preserved and whatever you put in --prefix
will be prepended to it.
ligate.py
supports some additional command line options to, for example, change which font ligatures are copied from or enable copying of individual character glyphs; run python ligate.py --help
to list them.
I don't know what do the features
' values from a config.py
mean? Where are they from?
In a config.py
you have a dictionary called "features"
with keys and values. Each key is the name of some feature defined in fira.fea
, a file that specifies font properties, and each value is a list of strings, that may be empty.
In this file. each feature contains rules that makes certain ligatures work. The majority of these rules are grouped into named blocks called lookups
. I say "named" because these are the strings that are contained in the corresponding value's list.
If you don't know how to read that fira.fea
file, I recommend you to visit this page.
This repo is a redesign of the ToxicFrog/Ligaturizer implementation because, principally, it does not work with the Firacode's ligatures above v3.1, missing incredible features like infinite arrow combinations.
Contributions always welcome! Please submit a Pull Request, or create an Issue if you have an idea for a feature/enhancement (or bug).