Open a file in a coding font like Fira Code and some pairs of characters stop looking like pairs. Two equals signs become one long bar, an exclamation mark and an equals sign become a proper not-equal sign, and an arrow typed as a hyphen and a bracket turns into a real arrow. These are programming ligatures, and they divide developers roughly down the middle.
What a programming ligature actually is
A ligature is two or more characters drawn as one shape. Printers have used them for centuries — the fi in a book is usually a single piece of type, because the dot of the i would otherwise collide with the hood of the f. Programming ligatures borrow the idea for operators: the font notices a sequence like != or === and swaps in a glyph drawn to read as one symbol.
The important detail is that nothing in the file changes. The characters on disk are still an exclamation mark and an equals sign. Copy the line into another program and the ligature is gone. The font is only changing how the text is painted, which is why switching it off is a display setting and not a code change.
In a monospaced font the merged glyph still takes up exactly the width of the characters it replaces — two cells for a two-character operator. Columns stay aligned, and the cursor still moves through the pair one character at a time.
The fonts in this archive that have them
Fira Code is where most people meet the idea: it took Mozilla’s Fira Mono and added a large ligature set. JetBrains Mono is the default in JetBrains’ IDEs and draws its ligatures more conservatively. Cascadia Code is Microsoft’s, made for Windows Terminal. Victor Mono combines ligatures with a cursive italic that makes comments look handwritten. The whole group is on the ligatures style page.
Victor Mono — variable
Sphinx of black quartz, judge my vow
In the static download
Turning them on in your editor
Installing the font is not enough; most editors ship with ligatures off. The switch is one line or one tick box.
- VS Code: set
editor.fontFamilyto the font’s name andeditor.fontLigaturesto true in your settings. - JetBrains IDEs: Settings, then Editor, then Font, and tick Enable ligatures.
- Terminals: support varies. Windows Terminal and iTerm2 draw them; some fast GPU terminals deliberately do not. If a terminal shows the characters separately, the font is fine and the terminal is the limit.
On a web page, programming ligatures are usually built from the contextual alternates feature, not the standard ligature one. That catches people out: font-variant-ligatures: none may not remove them, and font-feature-settings: "calt" 0 will. If you are showing code samples on a site, see how to self-host a font first.
The case against, which is not nothing
The objection is that ligatures hide what you typed. A merged not-equal sign looks like the mathematical symbol, and in some languages the two-character operator and a single Unicode symbol mean different things. When reading someone else’s code, or teaching, the literal characters can matter more than the prettiness. There is also the plain matter of taste: some people find the merged shapes distracting.
That is why the choice belongs to the reader and not the font. Every one of these families works perfectly well with the feature switched off, and our list of the best free monospace fonts covers the ones without ligatures too.
| Family | Variable download | Static download |
|---|---|---|
| Fira Code | 138 KB1 file | 481 KB5 files |
| JetBrains Mono | 187 KB2 files | 892 KB16 files |
| Cascadia Code | 522 KB2 files | 2.0 MB12 files |
| Victor Mono | 198 KB2 files | 936 KB14 files |