Change the code font in under a minute
Cursor is a fork of VS Code, so font configuration is identical to VS Code and every guide written for VS Code applies unchanged. There are two routes to the same setting.
Through the settings screen. Press Cmd+, on macOS or Ctrl+, on Windows and Linux, type font family into the search box, and replace the value in the Editor: Font Family field. It takes effect as you type, with no restart.
Through the JSON file. Open the command palette with Cmd+Shift+P, run Preferences: Open User Settings (JSON), and add the keys directly. This is the version worth keeping in a dotfiles repository.
{
"editor.fontFamily": "JetBrains Mono, Menlo, Consolas, monospace",
"editor.fontSize": 14,
"editor.fontLigatures": true,
"editor.lineHeight": 1.6,
"terminal.integrated.fontFamily": "JetBrains Mono"
}The value is a CSS font stack rather than a file path. Cursor walks the list left to right and uses the first family the operating system reports as installed, which is why keeping a generic monospace at the end is worth the eight characters.
Every font setting, and what it actually touches
The confusion in most font threads comes from assuming one setting governs the whole window. It does not. These are the keys for code and terminal.
| Setting | What it controls |
|---|---|
editor.fontFamily | The code font. Takes a comma-separated fallback list; quote any family whose name contains a space. |
editor.fontSize | Code font size in pixels. Changes the editor only, not the sidebar or tabs. |
editor.fontLigatures | Boolean, or a string of CSS font-feature-settings when you want to enable some features and not others. |
editor.fontWeight | Accepts keywords or numeric weights from 100 to 900, so a variable font can sit at 350 rather than jumping to 400. |
editor.lineHeight | 0 means derive it from the font size. Values under 8 are read as a multiplier, larger values as pixels. |
editor.letterSpacing | Pixels added between characters. Small negative values tighten a font that was designed loose. |
terminal.integrated.fontFamily | The integrated terminal font. Falls back to the editor font when unset, which is why the terminal sometimes changes on its own. |
terminal.integrated.fontSize | Terminal font size, independent of the editor. |
The interface font is a separate problem
Nothing in the list above changes the sidebar, the tab bar, the command palette or the agent pane. Those use the interface font, and Cursor exposes no supported setting for its family. What it does expose is scale: window.zoomLevel takes positive or negative numbers, including decimals, and moves the entire interface together. One whole step is roughly a 20 percent change, so 0.5 is usually the right first try rather than 1.
Extensions that inject custom CSS can override the interface font, at the cost of a modified-installation warning on every update. Weigh that against how much the sidebar font really bothers you.
Ligatures, and when to switch them off
Programming ligatures replace character pairs such as !=, => and >= with single composed glyphs. Two things have to line up: the setting has to be on, and the font has to contain them. Turning the setting on with a font that has none does nothing at all, which accounts for a good share of the reports that ligatures are broken.
"editor.fontLigatures": true
// or enable specific OpenType features only
"editor.fontLigatures": "'calt' off, 'ss01', 'zero'"The string form is the useful one. calt is contextual alternates, the feature that produces most arrow ligatures, so switching it off while keeping a stylistic set gives you the slashed zero without the arrows. Turn ligatures off entirely if you pair-program with someone who does not use them, or if you have ever miscounted the characters in a regex because three of them were drawn as one.
Fonts worth trying
All of these are monospaced and render well at small sizes. The free ones are under the SIL Open Font License, so they are safe to commit into a repository alongside a devcontainer.
| Font | License | Ligatures | Why pick it |
|---|---|---|---|
| JetBrains Mono | Free, OFL | Yes | Tall x-height and a 1.2 line spacing built into the design. The safest default if you have no opinion. |
| Fira Code | Free, OFL | Yes, extensive | The font that popularised programming ligatures. The arrow and comparison glyphs are the most aggressive of any common font. |
| Cascadia Code | Free, OFL | Yes | Microsoft's terminal font. Ships in Cascadia Mono form too, which is the identical face with ligatures removed. |
| Geist Mono | Free, OFL | No | Narrow and even. Good when you keep two files side by side and need the columns to fit. |
| IBM Plex Mono | Free, OFL | No | Slightly humanist, with a distinctive italic. Pairs well with Plex Sans if you also theme your documentation. |
| Iosevka | Free, OFL | Yes, configurable | Unusually narrow by default, and buildable in dozens of variants if you want to pick your own letterforms. |
| Monaspace | Free, OFL | Yes, plus texture healing | GitHub's superfamily. Five faces designed to mix inside one buffer, so comments can be a different texture from code. |
| SF Mono / Menlo | Bundled with macOS | No | Already installed on any Mac. Menlo is Cursor's macOS default and needs no download at all. |
Install a font the normal way for your operating system, then quit and reopen Cursor. The editor reads the installed font list at launch, so a font added while Cursor was running will often not appear until it restarts. This is the second most common reason a correct font name appears to do nothing.
When the font name does nothing
- The name does not match. Use the family name the system reports, not the file name. On macOS, Font Book shows it; on Windows, the Fonts control panel does.
JetBrainsMono-Regular.ttfis a file;JetBrains Monois the family. - A space is unquoted. Inside the JSON string, a family with spaces is fine on its own but needs single quotes when it sits in a list with others:
"'Fira Code', monospace". - It was installed for one user only. Fonts installed to a user profile are sometimes invisible to an application launched from a different context. Reinstalling system-wide resolves it.
- A workspace setting is winning. A
.vscode/settings.jsonin the project overrides your user settings. The settings screen marks which scope a value came from. - You changed the wrong font. If the sidebar stayed the same, that is expected. See the interface font note above.
The other cursor: caret shape and blinking
A fair number of people searching for cursor fonts are looking for the text caret rather than the editor named Cursor. Those settings are separate from font family and live alongside it.
| Setting | Accepted values |
|---|---|
editor.cursorStyle | line, block, underline, line-thin, block-outline, underline-thin. |
editor.cursorWidth | Width in pixels when cursorStyle is line. Ignored for the block styles. |
editor.cursorBlinking | blink, smooth, phase, expand, or solid. solid stops the blink entirely. |
editor.cursorSmoothCaretAnimation | off, explicit, or on. Animates the caret between positions instead of teleporting. |
A block caret with "editor.cursorBlinking": "solid" is the usual choice for people coming from a terminal editor. The caret colour itself comes from the theme, under the editorCursor.foreground token, which you can override in workbench.colorCustomizations without forking the whole theme.
Cursor keeps the VS Code settings surface intact, so the Cursor documentation covers the agent features while editor settings follow VS Code behaviour.