‹ Guides

Font ligatures v26.5.1+

-> != => drawn as the single symbols your font designed for them, without moving a column.

Available in Term v26.5.1 and later.

Written

What changes

Coding fonts come with ligatures: -> becomes one arrow, != a crossed-out equals sign, >= a real ≥. Term used to draw every character on its own, so a font's ligatures never showed. Turn them on and they do.

OFF Terminal capture in Iosevka Term: a few lines of code with ->, !=, >=, =>, ===, <=, |>, -->, ==> and <=> drawn as separate characters.
Off: every character on its own, exactly as typed.
ON The same lines with ligatures on: an arrow for ->, a crossed equals sign for !=, ≥ and ≤, a double arrow for =>, and a triple bar for ===.
On: the same lines, same phone, same font. Each operator is one symbol, and nothing has moved — every character still sits in its own column.

It only changes how the characters are drawn. The text is untouched: -> is still two characters, so the cursor steps over it one character at a time, copying it copies ->, and a program lining up columns sees exactly what it saw before.

Turn it on

Settings → Terminal → Font ligatures. The switch takes effect at once, in every open tab. It is off by default, because plenty of people would rather see the characters they typed.

Settings → Terminal: Terminal font set to Iosevka Term, Terminal font size 11pt, and the Font ligatures switch turned on.
Settings · Terminal. The switch sits right under the font size. It only does something in a font that has ligatures.

Four fonts in the list have them: Iosevka Term (built in, the default), and JetBrains Mono, Fira Code and Cascadia Code, which download from Terminal font. The others have no ligatures to show, so with the switch on they draw exactly as before. Monaspace Neon keeps its ligatures in optional style sets that Term does not turn on.

Each font draws its own

A ligature is a design, not a rule, so the same line reads differently in each font.

The same line of operators in four fonts, one per row: Cascadia Code, JetBrains Mono, Fira Code and Iosevka Term.
Top to bottom: Cascadia Code, JetBrains Mono, Fira Code, Iosevka Term. The same line, a->b != c => d === e <= f >= g |> h --> ==> <=> :: www. The arrows and bars change with the font; www stays letters (see below).

Does it slow anything down

Not in a way you will notice. Term only looks at runs of two or more symbols; ordinary text and ls output skip that step entirely. Each run is worked out once and remembered, so scrolling back over the same code costs nothing extra. In our tests on a phone, a screen scrolling through nothing but operators ran just as smoothly with the switch on as off.

When a ligature comes apart

Some places deliberately show the plain characters.

CURSOR ON = A shell prompt with [ "$a" != "$b" ] typed and the cursor on the = sign: != drawn as two characters.
CURSOR MOVED AWAY The same line with the cursor at the end: != drawn as one crossed equals sign.
Under the cursor, an operator shows the characters you are editing. Move on and it joins again.

A colour change splits it

When the two halves of an operator are in different colours — a syntax highlighter colouring - and > differently — they stay two characters, so no colour ever bleeds into its neighbour.

Symbols only, not letters

Term joins operators made of punctuation. Ligatures made of letters, such as Fira Code's www and 0x, are left as letters, and so is Monaspace's letter-width “texture healing”.

More on the terminal's fonts: Bold Chinese that stays readable · Text and emoji