Programming Ligatures and Nerd Fonts on Linux
Install JetBrains Mono and Fira Code Nerd Fonts on Linux, refresh fontconfig, and enable programming ligatures in Kitty, WezTerm, GNOME Terminal, and VS Code.
Before you start
- ▸curl and unzip installed (sudo apt/dnf/pacman -S curl unzip)
- ▸A terminal emulator that supports custom fonts (Kitty, WezTerm, GNOME Terminal, or Konsole)
- ▸Basic familiarity with editing config files in your home directory
Programming ligatures turn multi-character sequences like ->, =>, and != into single, visually unified glyphs. Nerd Fonts patch popular coding typefaces with thousands of extra icons used by tools like Starship, Neovim plugins, and ls-color schemes. Together they make a terminal or editor feel genuinely polished rather than just functional. This guide covers installing JetBrains Mono and Fira Code (both in Nerd Fonts editions), registering them with the font system, and enabling ligatures in the most common Linux terminals and editors.
1. Download Nerd Fonts
The Nerd Fonts project ships pre-patched versions of popular typefaces. Each release is a ZIP containing .ttf or .otf files for every style weight. Pick your font family from the Nerd Fonts releases page or pull them directly from GitHub.
Download JetBrains Mono Nerd Font
mkdir -p ~/.local/share/fonts/NerdFonts
cd /tmp
curl -LO https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.zip
unzip JetBrainsMono.zip -d ~/.local/share/fonts/NerdFonts/JetBrainsMono
Download Fira Code Nerd Font
curl -LO https://github.com/ryanoasis/nerd-fonts/releases/latest/download/FiraCode.zip
unzip FiraCode.zip -d ~/.local/share/fonts/NerdFonts/FiraCode
Installing under ~/.local/share/fonts/ makes the fonts available only to your user, which is fine for a personal workstation and requires no root access. For system-wide install, use /usr/local/share/fonts/ instead.
2. Refresh the Font Cache
After copying files, tell fontconfig to index them. Applications won't see new fonts until this runs.
fc-cache -fv ~/.local/share/fonts
Verify the fonts are registered:
fc-list | grep -i "JetBrainsMono"
fc-list | grep -i "FiraCode"
Output will list paths and style names — the exact lines vary by how many weights you installed. If nothing appears, double-check you unzipped to the correct directory.
3. Distro Package Managers (Alternative Route)
If you prefer managed packages and don't need the absolute latest Nerd Fonts release, several distros package them.
Debian / Ubuntu
sudo apt install fonts-jetbrains-mono
# Nerd Fonts patched version is not yet in official repos;
# use the manual method above or the nerd-fonts-jetbrains-mono AUR/PPA equivalent
Fedora / RHEL 9+
sudo dnf install jetbrains-mono-fonts-all
Note: the DNF package is the upstream font without Nerd Fonts patching. For the full icon set you still need the manual download above.
Arch Linux
sudo pacman -S ttf-jetbrains-mono-nerd ttf-firacode-nerd
Arch's nerd-fonts group in the official repos is the cleanest option — fully patched, updated regularly, and managed by pacman.
4. Configure Per Terminal
GNOME Terminal
GNOME Terminal supports ligatures natively since version 3.36 (Ubuntu 20.04+, Fedora 32+).
- Open Preferences → Profiles → your profile → Text.
- Disable Use the system fixed-width font.
- Click the font button and type
JetBrainsMono Nerd Font. - Choose a size (13–15 pt is comfortable at 1080p) and click Select.
Ligatures are active by default once the font is selected — no extra toggle needed.
Kitty
Kitty has excellent ligature and icon support and reads from ~/.config/kitty/kitty.conf.
font_family JetBrainsMono Nerd Font Mono
bold_font JetBrainsMono Nerd Font Mono Bold
italic_font JetBrainsMono Nerd Font Mono Italic
bold_italic_font JetBrainsMono Nerd Font Mono Bold Italic
font_size 13.0
Reload with Ctrl+Shift+F5 or restart kitty. Ligatures are on by default; to disable them specifically:
disable_ligatures never # options: never | cursor | always
Alacritty
Alacritty does not support ligatures by design (upstream decision as of 0.13). You get Nerd Font icons, but ligatures are silently skipped. If ligatures matter to you, use Kitty or WezTerm instead. Font config still goes in ~/.config/alacritty/alacritty.toml:
[font]
size = 13.0
[font.normal]
family = "JetBrainsMono Nerd Font Mono"
style = "Regular"
WezTerm
WezTerm supports ligatures and is Wayland-native. In ~/.config/wezterm/wezterm.lua:
local wezterm = require 'wezterm'
return {
font = wezterm.font('JetBrainsMono Nerd Font Mono'),
font_size = 13.0,
-- ligatures are enabled by default; to disable:
-- harfbuzz_features = { 'calt=0', 'clig=0', 'liga=0' },
}
Konsole (KDE)
- Go to Settings → Edit Current Profile → Appearance.
- Click Choose Font, select
JetBrainsMono Nerd Font Mono. - Check Enable font ligatures at the bottom of the font dialog.
5. Configure in VS Code and Neovim
VS Code
Open Settings (JSON) with Ctrl+Shift+P → Preferences: Open User Settings (JSON) and add:
"editor.fontFamily": "'JetBrainsMono Nerd Font Mono', 'Fira Code', monospace",
"editor.fontLigatures": true,
"editor.fontSize": 14
Neovim (with a GUI or Kitty/WezTerm)
Neovim itself doesn't control font rendering — the terminal or GUI wrapper does. If you use Neovide, add to your init.lua:
vim.opt.guifont = "JetBrainsMono Nerd Font Mono:h13"
In a standard terminal, just ensure your terminal is configured as above and Neovim will inherit it automatically.
6. Verify Ligatures and Icons
A quick visual test — paste this into your shell or a text file open in your editor:
echo "-> => != === >= <= || && ..."
# Should render as single unified glyphs if ligatures are working
For Nerd Font icons, run:
echo -e "\ue0b0 \uf179 \uf303 \ue749"
You should see four distinct icons (a powerline arrow, the Apple logo, the Arch logo, and the Neovim logo). If you see boxes or question marks, the font is not selected correctly in your terminal.
Troubleshooting
- Icons show as boxes: You selected the non-Mono variant. Use the
Nerd Font Monovariant for terminals; the widerNerd Fontvariant is for GUI editors where double-width cells aren't a problem. - Font not appearing in picker: Run
fc-cache -fvagain, then log out and back in. Some apps (GNOME Terminal, Konsole) cache the font list at startup. - Ligatures not rendering despite correct font: Confirm your terminal supports them (Alacritty does not). In kitty, check
disable_ligaturesisn't set toalways. - Wrong weight selected automatically: Some font pickers struggle with large families. Specify exact style names in config files (e.g.,
JetBrainsMono Nerd Font Mono Bold) rather than relying on a bold toggle. - Fira Code ligatures not working in VS Code: Make sure
editor.fontLigaturesistrue, not the string"true"— JSON type matters.
Frequently asked questions
- What is the difference between 'JetBrainsMono Nerd Font' and 'JetBrainsMono Nerd Font Mono'?
- The Mono variant forces all Nerd Font icons to a single cell width, which is required for correct alignment in terminal emulators. The non-Mono variant uses double-width cells for some icons, which works better in GUI editors like VS Code but breaks terminal grid alignment.
- Do I need Nerd Fonts just for ligatures, or is any font enough?
- Ligatures alone only require a font with OpenType ligature tables, like the standard Fira Code or JetBrains Mono. You need Nerd Fonts specifically if you want the extra icons used by tools like Starship, lsd, or Neovim plugin status bars.
- Why doesn't Alacritty support ligatures?
- The Alacritty developers made an explicit design choice to omit ligature support, citing rendering complexity and performance. If ligatures are important to your workflow, Kitty or WezTerm are functionally equivalent and fully support them.
- Will installing Nerd Fonts break my existing font fallback chains?
- No. Installing additional fonts only adds to the available set; fontconfig fallback chains pick fonts by family name and coverage. Existing applications keep using whatever font they were already configured for.
- How do I keep Nerd Fonts updated?
- Arch users get updates via pacman. For manual installs, re-run the curl download commands when a new Nerd Fonts release is tagged on GitHub, re-unzip to the same directory, and run fc-cache -fv again. No application restart is needed for most terminals.
Related guides
Linux Clipboards Explained (+ Clipboard Managers)
Learn the difference between Linux's PRIMARY and CLIPBOARD selections, use xclip, xsel, and wl-clipboard from the terminal, and manage history with GPaste or Klipper.
Configure LibreOffice for Daily Use
Configure LibreOffice for daily use: set default save formats for MS Office interop, tune autosave, install fonts, and add productivity extensions.
Configure the Touchpad and Multitouch Gestures
Configure Linux touchpad behavior and multitouch gestures using libinput, libinput-gestures, and native GNOME and KDE Plasma settings on both Wayland and X11.
Wayland vs X11: How to Choose and Configure Each
Know when to run Wayland or X11, how to check your current session, switch at login with GDM/SDDM/LightDM, and handle NVIDIA and XWayland edge cases.