summaryrefslogtreecommitdiffstats
path: root/man4/console_codes.4
diff options
context:
space:
mode:
Diffstat (limited to 'man4/console_codes.4')
-rw-r--r--man4/console_codes.4810
1 files changed, 810 insertions, 0 deletions
diff --git a/man4/console_codes.4 b/man4/console_codes.4
new file mode 100644
index 0000000..e2ac4e8
--- /dev/null
+++ b/man4/console_codes.4
@@ -0,0 +1,810 @@
+'\" t
+.\" Copyright (c) 1996 Andries Brouwer <aeb@cwi.nl>, Mon Oct 31 22:13:04 1996
+.\"
+.\" SPDX-License-Identifier: GPL-2.0-or-later
+.\"
+.\" This is combined from many sources.
+.\" For Linux, the definitive source is of course console.c.
+.\" About vt100-like escape sequences in general there are
+.\" the ISO 6429 and ISO 2022 norms, the descriptions of
+.\" an actual vt100, and the xterm docs (ctlseqs.ms).
+.\" Substantial portions of this text are derived from a write-up
+.\" by Eric S. Raymond <esr@thyrsus.com>.
+.\"
+.\" Tiny correction, aeb, 961107.
+.\"
+.\" 2006-05-27, Several corrections - Thomas E. Dickey
+.\"
+.TH console_codes 4 2023-02-05 "Linux man-pages 6.05.01"
+.SH NAME
+console_codes \- Linux console escape and control sequences
+.SH DESCRIPTION
+The Linux console implements a large subset of the VT102 and ECMA-48/ISO
+6429/ANSI X3.64 terminal controls, plus certain private-mode sequences
+for changing the color palette, character-set mapping, and so on.
+In the tabular descriptions below, the second column gives ECMA-48 or DEC
+mnemonics (the latter if prefixed with DEC) for the given function.
+Sequences without a mnemonic are neither ECMA-48 nor VT102.
+.PP
+After all the normal output processing has been done, and a
+stream of characters arrives at the console driver for actual
+printing, the first thing that happens is a translation from
+the code used for processing to the code used for printing.
+.PP
+If the console is in UTF-8 mode, then the incoming bytes are
+first assembled into 16-bit Unicode codes.
+Otherwise, each byte is transformed according to the current mapping table
+(which translates it to a Unicode value).
+See the \fBCharacter Sets\fP section below for discussion.
+.PP
+In the normal case, the Unicode value is converted to a font index,
+and this is stored in video memory, so that the corresponding glyph
+(as found in video ROM) appears on the screen.
+Note that the use of Unicode (and the design of the PC hardware)
+allows us to use 512 different glyphs simultaneously.
+.PP
+If the current Unicode value is a control character, or we are
+currently processing an escape sequence, the value will treated
+specially.
+Instead of being turned into a font index and rendered as
+a glyph, it may trigger cursor movement or other control functions.
+See the \fBLinux Console Controls\fP section below for discussion.
+.PP
+It is generally not good practice to hard-wire terminal controls into
+programs.
+Linux supports a
+.BR terminfo (5)
+database of terminal capabilities.
+Rather than emitting console escape sequences by hand, you will almost
+always want to use a terminfo-aware screen library or utility such as
+.BR ncurses (3),
+.BR tput (1),
+or
+.BR reset (1).
+.SS Linux console controls
+This section describes all the control characters and escape sequences
+that invoke special functions (i.e., anything other than writing a
+glyph at the current cursor location) on the Linux console.
+.PP
+.B "Control characters"
+.PP
+A character is a control character if (before transformation
+according to the mapping table) it has one of the 14 codes
+00 (NUL), 07 (BEL), 08 (BS), 09 (HT), 0a (LF), 0b (VT),
+0c (FF), 0d (CR), 0e (SO), 0f (SI), 18 (CAN), 1a (SUB),
+1b (ESC), 7f (DEL).
+One can set a "display control characters" mode (see below),
+and allow 07, 09, 0b, 18, 1a, 7f to be displayed as glyphs.
+On the other hand, in UTF-8 mode all codes 00\[en]1f are regarded
+as control characters, regardless of any "display control characters"
+mode.
+.PP
+If we have a control character, it is acted upon immediately
+and then discarded (even in the middle of an escape sequence)
+and the escape sequence continues with the next character.
+(However, ESC starts a new escape sequence, possibly aborting a previous
+unfinished one, and CAN and SUB abort any escape sequence.)
+The recognized control characters are BEL, BS, HT, LF, VT, FF,
+CR, SO, SI, CAN, SUB, ESC, DEL, CSI.
+They do what one would expect:
+.TP
+BEL (0x07, \fB\[ha]G\fP)
+beeps;
+.TP
+BS (0x08, \fB\[ha]H\fP)
+backspaces one column
+(but not past the beginning of the line);
+.TP
+HT (0x09, \fB\[ha]I\fP)
+goes to the next tab stop or to the end of the line
+if there is no earlier tab stop;
+.TP
+LF (0x0A, \fB\[ha]J\fP)
+.TQ
+VT (0x0B, \fB\[ha]K\fP)
+.TQ
+FF (0x0C, \fB\[ha]L\fP)
+all give a linefeed,
+and if LF/NL (new-line mode) is set also a carriage return;
+.TP
+CR (0x0D, \fB\[ha]M\fP)
+gives a carriage return;
+.TP
+SO (0x0E, \fB\[ha]N\fP)
+activates the G1 character set;
+.TP
+SI (0x0F, \fB\[ha]O\fP)
+activates the G0 character set;
+.TP
+CAN (0x18, \fB\[ha]X\fP)
+.TQ
+SUB (0x1A, \fB\[ha]Z\fP)
+abort escape sequences;
+.TP
+ESC (0x1B, \fB\[ha][\fP)
+starts an escape sequence;
+.TP
+DEL (0x7F)
+is ignored;
+.TP
+CSI (0x9B)
+is equivalent to ESC [.
+.PP
+.B "ESC- but not CSI-sequences"
+.ad l
+.TS
+l l lx.
+ESC c RIS Reset.
+ESC D IND Linefeed.
+ESC E NEL Newline.
+ESC H HTS Set tab stop at current column.
+ESC M RI Reverse linefeed.
+ESC Z DECID T{
+DEC private identification. The kernel
+returns the string ESC [ ? 6 c, claiming
+that it is a VT102.
+T}
+ESC 7 DECSC T{
+Save current state (cursor coordinates,
+attributes, character sets pointed at by G0, G1).
+T}
+ESC 8 DECRC T{
+Restore state most recently saved by ESC 7.
+T}
+ESC % Start sequence selecting character set
+ESC % @ \0\0\0Select default (ISO 646 / ISO 8859-1)
+ESC % G \0\0\0Select UTF-8
+ESC % 8 \0\0\0Select UTF-8 (obsolete)
+ESC # 8 DECALN T{
+DEC screen alignment test \- fill screen with E's.
+T}
+ESC ( T{
+Start sequence defining G0 character set
+(followed by one of B, 0, U, K, as below)
+T}
+ESC ( B T{
+Select default (ISO 8859-1 mapping).
+T}
+ESC ( 0 T{
+Select VT100 graphics mapping.
+T}
+ESC ( U T{
+Select null mapping \- straight to character ROM.
+T}
+ESC ( K T{
+Select user mapping \- the map that is loaded by the utility \fBmapscrn\fP(8).
+T}
+ESC ) T{
+Start sequence defining G1 (followed by one of B, 0, U, K, as above).
+T}
+ESC > DECPNM Set numeric keypad mode
+ESC = DECPAM Set application keypad mode
+ESC ] OSC T{
+Operating System Command prefix.
+T}
+ESC ] R Reset palette.
+ESC ] P T{
+Set palette, with parameter given in 7 hexadecimal digits \fInrrggbb\fP after
+the final P. Here \fIn\fP is the color (0\[en]15), and \fIrrggbb\fP indicates
+the red/green/blue values (0\[en]255).
+T}
+.TE
+.ad
+.PP
+.B "ECMA-48 CSI sequences"
+.PP
+CSI (or ESC [) is followed by a sequence of parameters,
+at most NPAR (16), that are decimal numbers separated by
+semicolons.
+An empty or absent parameter is taken to be 0.
+The sequence of parameters may be preceded by a single question mark.
+.PP
+However, after CSI [ (or ESC [ [) a single character is read
+and this entire sequence is ignored.
+(The idea is to ignore an echoed function key.)
+.PP
+The action of a CSI sequence is determined by its final character.
+.ad l
+.TS
+l l lx.
+@ ICH T{
+Insert the indicated # of blank characters.
+T}
+A CUU T{
+Move cursor up the indicated # of rows.
+T}
+B CUD T{
+Move cursor down the indicated # of rows.
+T}
+C CUF T{
+Move cursor right the indicated # of columns.
+T}
+D CUB T{
+Move cursor left the indicated # of columns.
+T}
+E CNL T{
+Move cursor down the indicated # of rows, to column 1.
+T}
+F CPL T{
+Move cursor up the indicated # of rows, to column 1.
+T}
+G CHA T{
+Move cursor to indicated column in current row.
+T}
+H CUP T{
+Move cursor to the indicated row, column (origin at 1,1).
+T}
+J ED T{
+Erase display (default: from cursor to end of display).
+T}
+ T{
+ESC [ 1 J: erase from start to cursor.
+T}
+ T{
+ESC [ 2 J: erase whole display.
+T}
+ T{
+ESC [ 3 J: erase whole display including scroll-back
+buffer (since Linux 3.0).
+T}
+.\" ESC [ 3 J: commit f8df13e0a901fe55631fed66562369b4dba40f8b
+K EL T{
+Erase line (default: from cursor to end of line).
+T}
+ T{
+ESC [ 1 K: erase from start of line to cursor.
+T}
+ T{
+ESC [ 2 K: erase whole line.
+T}
+L IL T{
+Insert the indicated # of blank lines.
+T}
+M DL T{
+Delete the indicated # of lines.
+T}
+P DCH T{
+Delete the indicated # of characters on current line.
+T}
+X ECH T{
+Erase the indicated # of characters on current line.
+T}
+a HPR T{
+Move cursor right the indicated # of columns.
+T}
+c DA T{
+Answer ESC [ ? 6 c: "I am a VT102".
+T}
+d VPA T{
+Move cursor to the indicated row, current column.
+T}
+e VPR T{
+Move cursor down the indicated # of rows.
+T}
+f HVP T{
+Move cursor to the indicated row, column.
+T}
+g TBC T{
+Without parameter: clear tab stop at current position.
+T}
+ T{
+ESC [ 3 g: delete all tab stops.
+T}
+h SM Set Mode (see below).
+l RM Reset Mode (see below).
+m SGR Set attributes (see below).
+n DSR Status report (see below).
+q DECLL Set keyboard LEDs.
+ ESC [ 0 q: clear all LEDs
+ ESC [ 1 q: set Scroll Lock LED
+ ESC [ 2 q: set Num Lock LED
+ ESC [ 3 q: set Caps Lock LED
+r DECSTBM T{
+Set scrolling region; parameters are top and bottom row.
+T}
+s ? Save cursor location.
+u ? Restore cursor location.
+\` HPA T{
+Move cursor to indicated column in current row.
+T}
+.TE
+.ad
+.PP
+.B ECMA-48 Select Graphic Rendition
+.PP
+The ECMA-48 SGR sequence ESC [ \fIparameters\fP m sets display
+attributes.
+Several attributes can be set in the same sequence, separated by
+semicolons.
+An empty parameter (between semicolons or string initiator or
+terminator) is interpreted as a zero.
+.ad l
+.TS
+l lx.
+param result
+0 T{
+reset all attributes to their defaults
+T}
+1 set bold
+2 T{
+set half-bright (simulated with color on a color display)
+T}
+3 set italic (since Linux 2.6.22; simulated with color on a color display)
+4 T{
+set underscore (simulated with color on a color display)
+(the colors used to simulate dim or underline are set
+using ESC ] ...)
+T}
+5 set blink
+7 set reverse video
+10 T{
+reset selected mapping, display control flag,
+and toggle meta flag (ECMA-48 says "primary font").
+T}
+11 T{
+select null mapping, set display control flag,
+reset toggle meta flag (ECMA-48 says "first alternate font").
+T}
+12 T{
+select null mapping, set display control flag,
+set toggle meta flag (ECMA-48 says "second alternate font").
+The toggle meta flag
+causes the high bit of a byte to be toggled
+before the mapping table translation is done.
+T}
+21 T{
+set underline; before Linux 4.17, this value
+set normal intensity (as is done in many other terminals)
+T}
+22 set normal intensity
+23 italic off (since Linux 2.6.22)
+24 underline off
+25 blink off
+27 reverse video off
+30 set black foreground
+31 set red foreground
+32 set green foreground
+33 set brown foreground
+34 set blue foreground
+35 set magenta foreground
+36 set cyan foreground
+37 set white foreground
+38 T{
+256/24-bit foreground color follows, shoehorned into 16 basic colors
+(before Linux 3.16: set underscore on, set default foreground color)
+T}
+39 T{
+set default foreground color
+(before Linux 3.16: set underscore off, set default foreground color)
+T}
+40 set black background
+41 set red background
+42 set green background
+43 set brown background
+44 set blue background
+45 set magenta background
+46 set cyan background
+47 set white background
+48 T{
+256/24-bit background color follows, shoehorned into 8 basic colors
+T}
+49 set default background color
+90..97 T{
+set foreground to bright versions of 30..37
+T}
+100..107 T{
+set background, same as 40..47 (bright not supported)
+T}
+.TE
+.ad
+.PP
+Commands 38 and 48 require further arguments:
+.TS
+l lx.
+;5;x T{
+256 color: values 0..15 are IBGR (black, red, green, ... white),
+16..231 a 6x6x6 color cube, 232..255 a grayscale ramp
+T}
+;2;r;g;b T{
+24-bit color, r/g/b components are in the range 0..255
+T}
+.TE
+.PP
+.B ECMA-48 Mode Switches
+.TP
+ESC [ 3 h
+DECCRM (default off): Display control chars.
+.TP
+ESC [ 4 h
+DECIM (default off): Set insert mode.
+.TP
+ESC [ 20 h
+LF/NL (default off): Automatically follow echo of LF, VT, or FF with CR.
+.\"
+.PP
+.B ECMA-48 Status Report Commands
+.\"
+.TP
+ESC [ 5 n
+Device status report (DSR): Answer is ESC [ 0 n (Terminal OK).
+.TP
+ESC [ 6 n
+Cursor position report (CPR): Answer is ESC [ \fIy\fP ; \fIx\fP R,
+where \fIx,y\fP is the cursor location.
+.\"
+.PP
+.B DEC Private Mode (DECSET/DECRST) sequences
+.PP
+.\"
+These are not described in ECMA-48.
+We list the Set Mode sequences;
+the Reset Mode sequences are obtained by replacing the final \[aq]h\[aq]
+by \[aq]l\[aq].
+.TP
+ESC [ ? 1 h
+DECCKM (default off): When set, the cursor keys send an ESC O prefix,
+rather than ESC [.
+.TP
+ESC [ ? 3 h
+DECCOLM (default off = 80 columns): 80/132 col mode switch.
+The driver sources note that this alone does not suffice; some user-mode
+utility such as
+.BR resizecons (8)
+has to change the hardware registers on the console video card.
+.TP
+ESC [ ? 5 h
+DECSCNM (default off): Set reverse-video mode.
+.TP
+ESC [ ? 6 h
+DECOM (default off): When set, cursor addressing is relative to
+the upper left corner of the scrolling region.
+.TP
+ESC [ ? 7 h
+DECAWM (default on): Set autowrap on.
+In this mode, a graphic
+character emitted after column 80 (or column 132 of DECCOLM is on)
+forces a wrap to the beginning of the following line first.
+.TP
+ESC [ ? 8 h
+DECARM (default on): Set keyboard autorepeat on.
+.TP
+ESC [ ? 9 h
+X10 Mouse Reporting (default off): Set reporting mode to 1 (or reset to
+0)\[em]see below.
+.TP
+ESC [ ? 25 h
+DECTECM (default on): Make cursor visible.
+.TP
+ESC [ ? 1000 h
+X11 Mouse Reporting (default off): Set reporting mode to 2 (or reset
+to 0)\[em]see below.
+.\"
+.PP
+.B Linux Console Private CSI Sequences
+.PP
+.\"
+The following sequences are neither ECMA-48 nor native VT102.
+They are native to the Linux console driver.
+Colors are in SGR parameters:
+0 = black, 1 = red, 2 = green, 3 = brown, 4 = blue, 5 = magenta, 6 =
+cyan, 7 = white; 8\[en]15 = bright versions of 0\[en]7.
+.TS
+l lx.
+ESC [ 1 ; \fIn\fP ] T{
+Set color \fIn\fP as the underline color.
+T}
+ESC [ 2 ; \fIn\fP ] T{
+Set color \fIn\fP as the dim color.
+T}
+ESC [ 8 ] T{
+Make the current color pair the default attributes.
+T}
+ESC [ 9 ; \fIn\fP ] T{
+Set screen blank timeout to \fIn\fP minutes.
+T}
+ESC [ 10 ; \fIn\fP ] T{
+Set bell frequency in Hz.
+T}
+ESC [ 11 ; \fIn\fP ] T{
+Set bell duration in msec.
+T}
+ESC [ 12 ; \fIn\fP ] T{
+Bring specified console to the front.
+T}
+ESC [ 13 ] T{
+Unblank the screen.
+T}
+ESC [ 14 ; \fIn\fP ] T{
+Set the VESA powerdown interval in minutes.
+T}
+ESC [ 15 ] T{
+Bring the previous console to the front
+(since Linux 2.6.0).
+T}
+ESC [ 16 ; \fIn\fP ] T{
+Set the cursor blink interval in milliseconds
+(since Linux 4.2).
+T}
+.\" commit bd63364caa8df38bad2b25b11b2a1b849475cce5
+.TE
+.SS Character sets
+The kernel knows about 4 translations of bytes into console-screen
+symbols.
+The four tables are: a) Latin1 \-> PC,
+b) VT100 graphics \-> PC, c) PC \-> PC, d) user-defined.
+.PP
+There are two character sets, called G0 and G1, and one of them
+is the current character set.
+(Initially G0.)
+Typing \fB\[ha]N\fP causes G1 to become current,
+\fB\[ha]O\fP causes G0 to become current.
+.PP
+These variables G0 and G1 point at a translation table, and can be
+changed by the user.
+Initially they point at tables a) and b), respectively.
+The sequences ESC ( B and ESC ( 0 and ESC ( U and ESC ( K cause G0 to
+point at translation table a), b), c), and d), respectively.
+The sequences ESC ) B and ESC ) 0 and ESC ) U and ESC ) K cause G1 to
+point at translation table a), b), c), and d), respectively.
+.PP
+The sequence ESC c causes a terminal reset, which is what you want if the
+screen is all garbled.
+The oft-advised "echo \[ha]V\[ha]O" will make only G0 current,
+but there is no guarantee that G0 points at table a).
+In some distributions there is a program
+.BR reset (1)
+that just does "echo \[ha][c".
+If your terminfo entry for the console is correct
+(and has an entry rs1=\eEc), then "tput reset" will also work.
+.PP
+The user-defined mapping table can be set using
+.BR mapscrn (8).
+The result of the mapping is that if a symbol c is printed, the symbol
+s = map[c] is sent to the video memory.
+The bitmap that corresponds to
+s is found in the character ROM, and can be changed using
+.BR setfont (8).
+.SS Mouse tracking
+The mouse tracking facility is intended to return
+.BR xterm (1)-compatible
+mouse status reports.
+Because the console driver has no way to know
+the device or type of the mouse, these reports are returned in the
+console input stream only when the virtual terminal driver receives
+a mouse update ioctl.
+These ioctls must be generated by a mouse-aware
+user-mode application such as the
+.BR gpm (8)
+daemon.
+.PP
+The mouse tracking escape sequences generated by
+\fBxterm\fP(1) encode numeric parameters in a single character as
+\fIvalue\fP+040.
+For example, \[aq]!\[aq] is 1.
+The screen coordinate system is 1-based.
+.PP
+The X10 compatibility mode sends an escape sequence on button press
+encoding the location and the mouse button pressed.
+It is enabled by sending ESC [ ? 9 h and disabled with ESC [ ? 9 l.
+On button press, \fBxterm\fP(1) sends
+ESC [ M \fIbxy\fP (6 characters).
+Here \fIb\fP is button\-1,
+and \fIx\fP and \fIy\fP are the x and y coordinates of the mouse
+when the button was pressed.
+This is the same code the kernel also produces.
+.PP
+Normal tracking mode (not implemented in Linux 2.0.24) sends an escape
+sequence on both button press and release.
+Modifier information is also sent.
+It is enabled by sending ESC [ ? 1000 h and disabled with
+ESC [ ? 1000 l.
+On button press or release, \fBxterm\fP(1) sends ESC [ M
+\fIbxy\fP.
+The low two bits of \fIb\fP encode button information:
+0=MB1 pressed, 1=MB2 pressed, 2=MB3 pressed, 3=release.
+The upper bits encode what modifiers were down when the button was
+pressed and are added together: 4=Shift, 8=Meta, 16=Control.
+Again \fIx\fP and
+\fIy\fP are the x and y coordinates of the mouse event.
+The upper left corner is (1,1).
+.SS Comparisons with other terminals
+Many different terminal types are described, like the Linux console,
+as being "VT100-compatible".
+Here we discuss differences between the
+Linux console and the two most important others, the DEC VT102 and
+.BR xterm (1).
+.\"
+.PP
+.B Control-character handling
+.PP
+The VT102 also recognized the following control characters:
+.TP
+NUL (0x00)
+was ignored;
+.TP
+ENQ (0x05)
+triggered an answerback message;
+.TP
+DC1 (0x11, \fB\[ha]Q\fP, XON)
+resumed transmission;
+.TP
+DC3 (0x13, \fB\[ha]S\fP, XOFF)
+caused VT100 to ignore (and stop transmitting)
+all codes except XOFF and XON.
+.PP
+VT100-like DC1/DC3 processing may be enabled by the terminal driver.
+.PP
+The
+.BR xterm (1)
+program (in VT100 mode) recognizes the control characters
+BEL, BS, HT, LF, VT, FF, CR, SO, SI, ESC.
+.\"
+.PP
+.B Escape sequences
+.PP
+VT100 console sequences not implemented on the Linux console:
+.TS
+l l l.
+ESC N SS2 T{
+Single shift 2. (Select G2 character set for the next character only.)
+T}
+ESC O SS3 T{
+Single shift 3. (Select G3 character set for the next character only.)
+T}
+ESC P DCS T{
+Device control string (ended by ESC \e)
+T}
+ESC X SOS Start of string.
+ESC \[ha] PM Privacy message (ended by ESC \e)
+ESC \e ST String terminator
+ESC * ... Designate G2 character set
+ESC + ... Designate G3 character set
+.TE
+.PP
+The program
+.BR xterm (1)
+(in VT100 mode) recognizes ESC c, ESC # 8, ESC >, ESC =,
+ESC D, ESC E, ESC H, ESC M, ESC N, ESC O, ESC P ... ESC \e,
+ESC Z (it answers ESC [ ? 1 ; 2 c, "I am a VT100 with
+advanced video option")
+and ESC \[ha] ... ESC \e with the same meanings as indicated above.
+It accepts ESC (, ESC ), ESC *, ESC + followed by 0, A, B for
+the DEC special character and line drawing set, UK, and US-ASCII,
+respectively.
+.PP
+The user can configure \fBxterm\fP(1) to respond to VT220-specific
+control sequences, and it will identify itself as a VT52, VT100, and
+up depending on the way it is configured and initialized.
+.PP
+It accepts ESC ] (OSC) for the setting of certain resources.
+In addition to the ECMA-48 string terminator (ST),
+\fBxterm\fP(1) accepts a BEL to terminate an OSC string.
+These are a few of the OSC control sequences recognized by \fBxterm\fP(1):
+.TS
+l l.
+ESC ] 0 ; \fItxt\fP ST T{
+Set icon name and window title to \fItxt\fP.
+T}
+ESC ] 1 ; \fItxt\fP ST Set icon name to \fItxt\fP.
+ESC ] 2 ; \fItxt\fP ST Set window title to \fItxt\fP.
+ESC ] 4 ; \fInum\fP; \fItxt\fP ST Set ANSI color \fInum\fP to \fItxt\fP.
+ESC ] 10 ; \fItxt\fP ST Set dynamic text color to \fItxt\fP.
+ESC ] 4 6 ; \fIname\fP ST T{
+Change log file to \fIname\fP (normally disabled by a compile-time option).
+T}
+ESC ] 5 0 ; \fIfn\fP ST Set font to \fIfn\fP.
+.TE
+.PP
+It recognizes the following with slightly modified meaning
+(saving more state, behaving closer to VT100/VT220):
+.TS
+l l l.
+ESC 7 DECSC Save cursor
+ESC 8 DECRC Restore cursor
+.TE
+.PP
+It also recognizes
+.TS
+l l lx.
+ESC F T{
+Cursor to lower left corner of screen (if enabled
+by \fBxterm\fP(1)'s \fBhpLowerleftBugCompat\fP resource).
+T}
+ESC l Memory lock (per HP terminals).
+ Locks memory above the cursor.
+ESC m Memory unlock (per HP terminals).
+ESC n LS2 Invoke the G2 character set.
+ESC o LS3 Invoke the G3 character set.
+ESC | LS3R Invoke the G3 character set as GR.
+ESC } LS2R Invoke the G2 character set as GR.
+ESC \[ti] LS1R Invoke the G1 character set as GR.
+.TE
+.PP
+It also recognizes ESC % and provides a more complete UTF-8
+implementation than Linux console.
+.\"
+.PP
+.B CSI Sequences
+.PP
+Old versions of \fBxterm\fP(1), for example, from X11R5,
+interpret the blink SGR as a bold SGR.
+Later versions which implemented ANSI colors, for example,
+XFree86 3.1.2A in 1995, improved this by allowing
+the blink attribute to be displayed as a color.
+Modern versions of xterm implement blink SGR as blinking text
+and still allow colored text as an alternate rendering of SGRs.
+Stock X11R6 versions did not recognize the color-setting SGRs until
+the X11R6.8 release, which incorporated XFree86 xterm.
+All ECMA-48 CSI sequences recognized by Linux are also recognized by
+.IR xterm ,
+however \fBxterm\fP(1) implements several ECMA-48 and DEC control sequences
+not recognized by Linux.
+.PP
+The \fBxterm\fP(1)
+program recognizes all of the DEC Private Mode sequences listed
+above, but none of the Linux private-mode sequences.
+For discussion of \fBxterm\fP(1)'s
+own private-mode sequences, refer to the
+\fIXterm Control Sequences\fP
+document by
+Edward Moy,
+Stephen Gildea,
+and Thomas E.\& Dickey
+available with the X distribution.
+That document, though terse, is much longer than this manual page.
+For a chronological overview,
+.PP
+.RS
+.UR http://invisible\-island.net\:/xterm\:/xterm.log.html
+.UE
+.RE
+.PP
+details changes to xterm.
+.PP
+The \fIvttest\fP program
+.PP
+.RS
+.UR http://invisible\-island.net\:/vttest/
+.UE
+.RE
+.PP
+demonstrates many of these control sequences.
+The \fBxterm\fP(1) source distribution also contains sample
+scripts which exercise other features.
+.SH NOTES
+ESC 8 (DECRC) is not able to restore the character set changed with
+ESC %.
+.SH BUGS
+In Linux 2.0.23, CSI is broken, and NUL is not ignored inside
+escape sequences.
+.PP
+Some older kernel versions (after Linux 2.0) interpret 8-bit control
+sequences.
+These "C1 controls" use codes between 128 and 159 to replace
+ESC [, ESC ] and similar two-byte control sequence initiators.
+There are fragments of that in modern kernels (either overlooked or
+broken by changes to support UTF-8),
+but the implementation is incomplete and should be regarded
+as unreliable.
+.PP
+Linux "private mode" sequences do not follow the rules in ECMA-48
+for private mode control sequences.
+In particular, those ending with ] do not use a standard terminating
+character.
+The OSC (set palette) sequence is a greater problem,
+since \fBxterm\fP(1) may interpret this as a control sequence
+which requires a string terminator (ST).
+Unlike the \fBsetterm\fP(1) sequences which will be ignored (since
+they are invalid control sequences), the palette sequence will make
+\fBxterm\fP(1) appear to hang (though pressing the return-key
+will fix that).
+To accommodate applications which have been hardcoded to use Linux
+control sequences,
+set the \fBxterm\fP(1) resource \fBbrokenLinuxOSC\fP to true.
+.PP
+An older version of this document implied that Linux recognizes the
+ECMA-48 control sequence for invisible text.
+It is ignored.
+.SH SEE ALSO
+.BR ioctl_console (2),
+.BR charsets (7)