Skip to main content

Color Emoji

Pragtical supports color emoji in documents and interface text. With System Fallback enabled, which is the default, the editor can use an installed emoji font automatically. You do not need to add it to every font list. The font configuration guide explains platform support and how to opt out.

To choose a particular emoji design, or use a font without installing it system-wide, add an explicit fallback after your regular text font. Configured fonts keep priority over automatically discovered system fonts.

Color emoji rendered with Noto-COLRv1.ttf in Pragtical

Choose an Emoji Font​

Noto Color Emoji is one option. The Noto-COLRv1.ttf variant supports color outlines and is used for the explicit fallback example below. It is available from the official Noto Emoji project:

Download Noto-COLRv1.ttf

Create a fonts folder inside your user directory and place the downloaded file there. For a standard Linux configuration, the resulting path is ~/.config/pragtical/fonts/Noto-COLRv1.ttf. Pragtical searches this folder for fonts, so a system-wide installation is not required.

Add the Fallback​

Open your user module and create a font group:

local style = require "core.style"

style.code_font = renderer.font.group {
renderer.font.load(
DATADIR .. "/fonts/JetBrainsMono-Regular.ttf",
15 * SCALE,
{ system_fallback = true }
),
renderer.font.load(
USERDIR .. "/fonts/Noto-COLRv1.ttf",
15 * SCALE,
{ system_fallback = true }
)
}

Keep your preferred code font first and add any other fallback fonts as additional entries. Load each font separately: font groups cannot be nested.

To display color emoji in interface text as well, configure style.font:

style.font = renderer.font.group {
renderer.font.load(DATADIR .. "/fonts/FiraSans-Regular.ttf", 15 * SCALE),
renderer.font.load(
USERDIR .. "/fonts/Noto-COLRv1.ttf",
15 * SCALE,
{ system_fallback = true }
)
}

Emoji Sequences and Fallback Order​

Supported emoji sequences are shaped as complete graphemes, including skin tones, variation selectors, flags, and joined emoji. This works independently of optional programming ligatures. Font coverage still matters: the selected font must be able to render the complete sequence.

Arrow movement, mouse placement, selection and deletion keep a displayed grapheme together, so the caret does not stop inside a composed emoji or between a letter and its combining accent. The underlying text is preserved.

If an emoji appears monochrome, an earlier font may already provide that character. Move Noto Color Emoji ahead of other symbol or emoji fallbacks. If characters appear as boxes, check that the font loaded successfully and that you downloaded the color variant named above. For automatic fallback on Linux, also check that Fontconfig and an emoji font are available. An unsupported sequence can appear as separate symbols even when its individual characters exist in a font.