Skip to content

Push color palette (CSI # P)

Category: modes · Baseline: rich · Tags: Xterm Extensions · Specification ↗

ESC [ # P
XTPUSHCOLORS pushes the current color palette (the 256-color ANSI palette plus the default fg/bg) onto an internal stack. The sequence is CSI # P (or CSI Pi # P to push at a specific stack index). XTPOPCOLORS (CSI # Q) pops the most recent palette; XTREPORTCOLORS (CSI # R) reports the current stack depth. Applications use this when they want to install a custom palette (e.g., a specific set of OSC 4 colors for syntax highlighting) without permanently overriding the user's theme. Push the current palette, install the new one, do the work, pop on exit. Without XTPUSHCOLORS, applications need to query every palette slot via OSC 4 ; n ; ? (slow and not universally supported) or simply leave the user's terminal in a modified state. Introduced by xterm in patch #357, paired with XTPUSHSGR. Adopted by Ghostty, foot, Contour, and other modern terminals.
How this is testedautomated
Send \x1b[#P (XTPUSHCOLORS), verify the sequence is consumed and the terminal stays responsive.

The same probe runs against headless backends (via Termless) and real terminal apps (via a daemon launched in each terminal). This lets us distinguish parser correctness from rendering correctness.

Analysis2026-04-06

Supported by 8 of 9 terminals (89%). Not supported by: Alacritty. Part of the Rich TUI baseline. Notes: Alacritty: Color palette stack not implemented by alacritty.

Supported by 9 of 14 backends (64%)

Terminal Applications

TerminalVersionSupportNotes
iTerm23.6.9✓ yesSequence consumed; terminal responsive
Ghostty1.3.1✓ yesSequence consumed; terminal responsive
Terminal.app2.15✓ yesSequence consumed; terminal responsive
Kitty0.46.2✓ yesColor palette stack not exposed via Python batch bridge
VS Code1.113.0? unknown
Warp0.2026.03.18.08.24.03? unknown
Cursor2.6.21? unknown

Headless Backends

Parser correctness only — a means the parser accepts the sequence.

BackendVersionSupportNotes
vt100.js0.2.1✓ yes
vterm0.2.0✓ yes
xterm.js5.5.0✓ yes
WezTerm0.1.0-fork.5~ partialColor palette stack not exposed in headless mode
Alacritty0.26.0✗ noColor palette stack not implemented by alacritty