^[control-codes
live in libghostty-vt

Operating system commands

OSC P Set Palette (Linux)

View as Markdown

Change a palette color, as the Linux console does.

OSC P n rrggbb ST
ECMA-48
§8.3.89 OSC – Operating System Command, p. 51
Specification
console_codes(4), Linux manual pages

OSC P n rrggbb ST sets color n, one hex digit from 0 to f, to the color rrggbb. It is the Linux console’s, which has only sixteen colors; OSC 4 does the same for the 256 of the palette, and OSC R resets them. iTerm2 also accepts it, though its Proprietary Escape Codes page advises against it, and extends n past f to its other colors: g and h for the default foreground and background, i for bold, j and k for the selection, l and m for the cursor.

The Linux console’s own definition, in console_codes(4), has no terminator: ESC ] P takes exactly seven hex digits after it, and ESC ] R none at all. A terminal that reads them as ordinary OSCs, which run until ST or BEL, swallows whatever follows one sent the console’s way, until something ends the string.

xterm, built for Linux, knows the console’s form, under its brokenLinuxOSC resource, on by default. Once an OSC string begins with P and has seven more characters, or begins with R and has one more, the next character abandons it: xterm rings the bell and handles that character as if no string had begun (charproc.c, illegal_parse). So sent the console’s way, neither swallows anything. Sent as an OSC, ended with ST, each still rings the bell, since the ESC of the ST is the character that abandons it. Either way no color changes. libghostty-vt reads them as ordinary OSCs and ignores them, with no bell, so the cases are known differences.

Support

TerminalVersionSupportNotes
VT220manual, 2nd ed., 1984NoOSC is not among the controls it recognizes (§4.2)
VT510manual, 1st ed., 1993Noignores an OSC string (chapter 4)
xtermpatch 412, xterm-411aPartlyknows its length, under brokenLinuxOSC: after P and seven characters it abandons the string and rings the bell; no color changes
libghostty-vt0f171f6Noignored
Konsole26.11.70, a24c3d71Noa letter where the number should be is a decoding error
iTerm23.7.3, its documentationYesaccepted though discouraged, with g to m for its other colors
ConEmubuild 230724, its documentationNonot in its ANSI escape codes
Linux consoleman-pages 6.19, console_codes(4)Yesexactly seven hex digits and no terminator, console_codes(4)

Validation

OSC-P-1: It does not change a color, and rings the bell

\e]P1ff0000\e\\
\e]4;1;?\a
|______|
reply \e]4;1;rgb:cdcd/0000/0000\a
bell 1

OSC-P-2: Nor iTerm2’s foreground

\e]Pg4040ff\e\\  # the foreground, iTerm2's way
\e]10;?\a
|______|
reply \e]10;rgb:0000/0000/0000\a
bell 1

OSC-P-3: Without a terminator, the text after it is printed

\e]P1ff0000  # the console's way
AB          # the A abandons the string
|AB____|
cursor 1,3
bell 1
Every example on these pages runs in your browser, in libghostty-vt compiled to WebAssembly.