| |
include("http://www.linux-faqs.com/body.left.inc") ?>

|
|
Name
console_codes — Linux console escape and control
sequences
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, etc. 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.
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.
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
CHARACTER SETS section
below for discussion.
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.
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 LINUX CONSOLE CONTROLS section
below for discussion.
It is generally not good practice to hard-wire terminal
controls into programs. Linux supports a 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 ncurses(3), tput(1), or reset(1).
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.
Control characters
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-1f are regarded as control
characters, regardless of any `display control characters'
mode.
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:
BEL (0x07, ^G) beeps;
BS (0x08, ^H) backspaces one column (but not past the
beginning of the line);
HT (0x09, ^I) goes to the next tab stop or to the end of
the line if there is no earlier tab stop;
LF (0x0A, ^J), VT (0x0B, ^K) and FF (0x0C, ^L) all give
a linefeed;
CR (0x0D, ^M) gives a carriage return;
SO (0x0E, ^N) activates the G1 character set, and if
LF/NL (new line mode) is set also a carriage return;
SI (0x0F, ^O) activates the G0 character set;
CAN (0x18, ^X) and SUB (0x1A, ^Z) interrupt escape
sequences;
ESC (0x1B, ^[) starts an escape sequence;
DEL (0x7F) is ignored;
CSI (0x9B) is equivalent to ESC [.
ESC- but not CSI-sequences
ECMA-48 CSI sequences
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.
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.)
The action of a CSI sequence is determined by its final
character.
ECMA-48 Set Graphics Rendition
The ECMA-48 SGR sequence ESC [ parameters 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.
ECMA-48 Mode Switches
- ESC [ 3 h
-
DECCRM (default off): Display control chars.
- ESC [ 4 h
-
DECIM (default off): Set insert mode.
- ESC [ 20 h
-
LF/NL (default off): Automatically follow echo of
LF, VT or FF with CR.
ECMA-48 Status Report Commands
- ESC [ 5 n
-
Device status report (DSR): Answer is ESC [ 0 n
(Terminal OK).
- ESC [ 6 n
-
Cursor position report (CPR): Answer is ESC [
y ;
x R, where
x,y is the
cursor location.
DEC Private Mode (DECSET/DECRST) sequences.
These are not described in ECMA-48. We list the Set Mode
sequences; the Reset Mode sequences are obtained by
replacing the final `h' by `l'.
- ESC [ ? 1 h
-
DECCKM (default off): When set, the cursor keys
send an ESC O prefix, rather than ESC [.
- 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
resizecons(8) has to
change the hardware registers on the console video
card.
- ESC [ ? 5 h
-
DECSCNM (default off): Set reverse-video mode.
- ESC [ ? 6 h
-
DECOM (default off): When set, cursor addressing
is relative to the upper left corner of the scrolling
region.
- 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.
- ESC [ ? 8 h
-
DECARM (default on): Set keyboard autorepreat
on.
- ESC [ ? 9 h
-
X10 Mouse Reporting (default off): Set reporting
mode to 1 (or reset to 0) — see below.
- ESC [ ? 25 h
-
DECTECM (default on): Make cursor visible.
- ESC [ ? 1000 h
-
X11 Mouse Reporting (default off): Set reporting
mode to 2 (or reset to 0) — see below.
Linux Console Private CSI Sequences
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.
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.
There are two character sets, called G0 and G1, and one of
them is the current character set. (Initially G0.) Typing ^N
causes G1 to become current, ^O causes G0 to become
current.
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.
The sequence ESC c causes a terminal reset, which is what
you want if the screen is all garbled. The oft-advised "echo
^V^O" will only make G0 current, but there is no guarantee
that G0 points at table a). In some distributions there is a
program reset(1) that just does
"echo ^[c". If your terminfo entry for the console is correct
(and has an entry rs1=\Ec), then "tput reset" will also
work.
The user-defined mapping table can be set using
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 setfont(8).
MOUSE TRACKING
The mouse tracking facility is intended to return
xterm-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 gpm(8) daemon.
The mouse tracking escape sequences generated by
xterm encode
numeric parameters in a single character as value+040. For example, `!'
is 1. The screen coordinate system is 1-based.
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, xterm sends ESC [ M
bxy (6 characters).
Here b is
button−1, and x and y are the x and y coordinates
of the mouse when the button was pressed. This is the same
code the kernel also produces.
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, xterm sends ESC [ M
bxy. The low two
bits of b 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 x and y are the x and y coordinates
of the mouse event. The upper left corner is (1,1).
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 xterm(1).
Control-character handling
The VT102 also recognized the following control
characters:
NUL (0x00) was ignored;
ENQ (0x05) triggered an answerback message;
DC1 (0x11, ^Q, XON) resumed transmission;
DC3 (0x13, ^S, XOFF) caused VT100 to ignore (and stop
transmitting) all codes except XOFF and XON.
VT100-like DC1/DC3 processing may be enabled by the tty
driver.
The xterm
program (in VT100 mode) recognizes the control characters
BEL, BS, HT, LF, VT, FF, CR, SO, SI, ESC.
Escape sequences
VT100 console sequences not implemented on the Linux
console:
The program xterm (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 , ESC Z (it
answers ESC [ ? 1 ; 2 c, `I am a VT100 with advanced video
option') and ESC ^ ... ESC 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.
The user can configure xterm 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.
It accepts ESC ] (OSC) for the setting of certain
resources. In addition to the ECMA-48 string terminator
(ST), xterm
accepts a BEL to terminate an OSC string. These are a few
of the OSC control sequences recognized by xterm:
It recognizes the following with slightly modified
meaning (saving more state, behaving closer to
VT100/VT220):
It also recognizes
It also recognizes ESC % and provides a more complete
UTF-8 implementation than Linux console.
CSI Sequences
Old versions of xterm, e.g., from X11R5,
interpret the blink SGR as a bold SGR. Later versions which
implemented ANSI colors, e.g., 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
xterm, however
xterm implements
several ECMA-48 and DEC control sequences not recognized by
Linux.
The xterm
program recognizes all of the DEC Private Mode sequences
listed above, but none of the Linux private-mode sequences.
For discussion of xterm's own private-mode
sequences, refer to the Xterm
Control Sequences 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,
http://invisible-island.net/xterm/xterm.log.html
details changes to xterm.
The vttest
program
http://invisible-island.net/vttest/
demonstrates many of these control sequences. The
xterm source
distribution also contains sample scripts which exercise
other features.
NOTES
ESC 8 (DECRC) is not able to restore the character set
changed with ESC %.
BUGS
In 2.0.23, CSI is broken, and NUL is not ignored inside
escape sequences.
Some older kernel versions (after 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.
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 xterm may interpret this as a
control sequence which requires a string terminator (ST).
Unlike the setterm sequences which will be
ignored (since they are invalid control sequences), the
palette sequence will make xterm 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 xterm resource brokenLinuxOSC to true.
An older version of this document implied that Linux
recognizes the ECMA-48 control sequence for invisible text.
It is ignored.
SEE ALSO
console(4), console_ioctl(4), charsets(7)
t
Copyright (c) 1996 Andries Brouwer <aeb@cwi.nl>, Mon Oct 31 22:13:04 1996
This is free documentation; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
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
|
|
|
include("http://www.linux-faqs.com/body.right.inc") ?>

|
|