console_codes(4) secuencias de escape y control de la consola de Linux

DESCRIPCIÓN

La consola de Linux implementa un vasto subconjunto de los controles de terminal de la VT102 y del estándar ECMA-48/ISO 6429/ANSI X3.64, más ciertas secuencias de modo privadas para cambiar la paleta de colores, asociaciones de conjuntos de caracteres, etc. En las descripciones tabulares de abajo, la 2ª columna da los mnemónicos ECMA-48 o DEC (éstos, prefijados por DEC) para la función dada. Las secuencias sin un mnemónico no son ni ECMA-48 ni VT102.

Después de haber hecho todo el procesamiento de salida normal, y de que un flujo de caracteres llega al controlador de consola para la impresión de verdad, la 1ª cosa que ocurre es una traducción del código empleado para el procesamiento al código empleado para la impresión.

Si la consola está en el modo UTF-8, entonces los bytes que llegan se ensamblan 1º a los códigos de 16 b Unicode. Si no, cada byte se transforma según la tabla de asociaciones en curso (que lo traduce a un valor Unicode). Vea más abajo la sección CONJUNTOS DE CARACTERES para la discusión sobre esto.

En el caso normal, el valor Unicode se convierte a un índice de tipo de letra, y éste se almacena en memoria de vídeo, de forma que aparezca en la pantalla el grafo correspondiente (según se encuentra en la ROM de vídeo). Observe que el empleo de Unicode (y el diseño del hardware del PC) nos permite usar 512 grafos diferentes simultáneamente.

Si el valor actual Unicode es un carácter de control, o estamos actualmente procesando una secuencia de escape, el valor se tratará especialmente. En vez de convertirse a un índice de tipo y presentarse como un grafismo, puede lanzar un movimiento del cursor u otra función de control. Vea la sección CONTROLES DE LA CONSOLA DE LINUX abajo para la discusión sobre esto.

Generalmente no es una buena idea codificar directamente controles de terminal en programas. Linux tiene una base de datos terminfo(5) de capacidades de terminales. En vez de emitir a mano secuencias de escape de la consola, Ud. debería casi siempre utilizar una biblioteca de pantalla que consultara terminfo o una utilidad, como ncurses(3), tput(1), o reset(1).

CONTROLES DE LA CONSOLA DE LINUX

Esta sección describe todos los caracteres de control y secuencias de escape que llaman a funciones especiales (i.e., cualquier otra cosa distinta a escribir un grafo en la localización del cursor en curso) en la consola de Linux.

Caracteres de control

Un carácter lo es de control si (antes de la transformación según la tabla de asociaciones) tiene uno de los 14 códigos 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). Uno puede establecer un modo de `mostrar caracteres de control' (vea más abajo), y permitir que los códigos 07, 09, 0b, 18, 1a, 7f se muestren como grafos. Por otro lado, en modo UTF-8 todos los códigos 00-1f se miran como caracteres de control, sin importar ningún modo `mostrar caracteres de control'.

Si tenemos un carácter de control, se actúa inmediatamente y luego se descarta (incluso en medio de una secuencia de escape) y la secuencia de escape continúa con el siguiente carácter. (Sin embargo, ESC empieza una nueva secuencia de escape, posiblemente abortando una anterior no acabada, y CAN y SUB abortan cualquier secuencia de escape). Los caracteres de control reconocidos son BEL, BS, HT, LF, VT, FF, CR, SO, SI, CAN, SUB, ESC, DEL, CSI. Hacen lo que uno esperaría:

BEL (0x07, ^G) pita;
BS (0x08, ^H) va un espacio atrás a la columna anterior (pero no pasa del principio de la línea);
HT (0x09, ^I) va a la siguiente parada de tabulación o al final de la línea si no hay antes una parada de tabulación;
LF (0x0A, ^J), VT (0x0B, ^K) y FF (0x0C, ^L) todos dan un salto de línea;
CR (0x0D, ^M) da un retorno de carro;
SO (0x0E, ^N) activa el conjunto de caracteres G1, y si está activado LF/NL (modo de nueva línea), también un retorno de carro;
SI (0x0F, ^O) activa el conjunto de carcteres G0;
CAN (0x18, ^X) y SUB (0x1A, ^Z) interrumpen secuencias de escape;
ESC (0x1B, ^[) empieza una secuencia de escape;
DEL (0x7F) no es tenido en cuenta;
CSI (0x9B) es equivalente a ESC [.

Secuencias de ESC, pero no CSI

ESC cRISInicio.
ESC DINDSalto de línea.
ESC ENELNueva línea.
ESC HHTSPone parada tab en esta columna.
ESC MRISalto de línea inverso.
ESC ZDECIDDEC identificación privada. El núcleo
devuelve la cadena ESC [ ? 6 c, diciendo
que es una VT102.
ESC 7DECSCSalva el estado actual (cordenadas del cursor,
atributos, conjuntos de caracteres apuntados por G0, G1).
ESC 8DECRCRestaura el estado salvado más reciente por ESC 7.
ESC [CSIIntroductor de secuencia de control
ESC %Empieza la secuencia de selección de conjunto de caracteres
ESC % @   Selecciona el predeterminado (ISO 646 / ISO 8859-1)
ESC % G   Selecciona UTF-8
ESC % 8   Selecciona UTF-8 (obsoleto)
ESC # 8DECALNDEC prueba de alineación en pantalla - la llena de E's.
ESC (Empieza secuencia de definición del conjunto G0
ESC ( B   Selecciona predeterminado (asociación ISO 8859-1)
ESC ( 0   Selecciona asociación de gráficos vt100
ESC ( U   Selecciona ninguna asociación - derecho a la ROM
ESC ( K   Selecciona asociación del usuario - la que se carga con
   la utilidad mapscrn(8).
ESC )Empieza la secuencia de definición de G1
(seguido por uno de B, 0, U, K, como arriba).
ESC >DECPNMPone el teclado auxiliar en modo numérico
ESC =DECPAMPone el teclado auxiliar en modo aplicación
ESC ]OSC(Debería ser: Orden del sistema operativo)
ESC ] P nrrggbb: pone paleta, con parámetro
dado en 7 dígitos hexadecimales tras la P final :-(.
Aquí n es el color (0-15), y rrggbb indica
los valores rojo/verde/azul (0-255).
ESC ] R: restaura paleta

Secuencias ECMA-48 CSI

CSI (o ESC [) es seguido por una secuencia de parámetros, como mucho NPAR (16), que son los números decimales separados por punto y comas. Un parámetro vacío o ausente se toma como 0. La secuencia de parámetros puede ir precedida por un signo de interrogación.

Sin embargo, tras CSI [ (o ESC [ [) se lee un carácter solo y esta secuencia entera no es tenida en cuenta. (La idea es no hacer caso de una tecla de función que se muestra.)

La acción de una secuencia CSI se determina por su carácter final.

@ICHInsertar el Nº indicado de caracteres blancos
ACUUMover cursor arriba el Nº indicado de filas
BCUDMover cursor abajo el Nº indicado de filas
CCUFMover cursor a la derecha el Nº indicado de columnas
DCUBMover cursor a la izquierda el Nº indicado de columnas
ECNLMover cursor abajo el Nº indicado de filas, a la columna 1
FCPLMover cursor arriba el Nº indicado de filas, a la columna 1
GCHAMover cursor a la columna indicada en la fila actual
HCUPMover cursor a la fila y columna indicadas (origen en 1,1)
JEDBorrar pantalla (p. o.: desde el cursor al final de la pantalla).
ESC [ 1 J: borrar desde el comienzo hasta el cursor.
ESC [ 2 J: borrar la pantalla entera.
KELBorrar línea (p.o.: desde el cursor al final de la línea).
ESC [ 1 K: borrar desde el comienzo de la línea al cursor
ESC [ 2 K: borrar la línea entera.
LILInsertar el Nº indicado de líneas en blanco
MDLBorrar el Nº indicado de líneas
PDCHBorrar el Nº indicado de caracteres en la línea actual
XECHBorrar el Nº indicado de caracteres en la línea actual
aHPRMover cursor a la derecha el Nº indicado de columnas
cDAReponder ESC [ ? 6 c: `Yo soy una VT102'.
dVPAMover cursor a la fila y columna indicadas
eVPRMover cursor abajo el Nº indicado de filas
fHVPMover cursor a la fila y columna indicadas
gTBCSin parámetro: quita parada TAB en la posición actual
ESC [ 3 g: borra todas las paradas de tabulación
hSMEstablece Modo (vea abajo).
lRMRestablece Modo (vea abajo).
mSGREstablece atributos (vea abajo).
nDSRInforme de estado (vea abajo).
qDECLLEstablece los LEDs del teclado.
ESC [ 0 q: apaga todos los LEDs
ESC [ 1 q: pone LED Bloq. Despl.
ESC [ 2 q: pone LED Bloq. Num.
ESC [ 3 q: pone LED Bloq. Mayús.
rDECSTBMEstablece región de rodadura; los parámetros son la fila de arriba y abajo
s?Salva la localización del cursor
u?Restaura la localización del cursor.
`HPAMover cursor a la columna indicada en la fila indicada

ECMA-48 Pone modo Gráfico

La secuencia ECMA-48 SGR ESC [ <parámetros> m establece los atributos de la pantalla. Se pueden poner varios atributos en la misma secuencia.

parresultado
0restablece todos los atributos a sus valores predeterminados
1pone negrillas
2pone medio brillo (simulado con color en una pantalla a color)
4pone subrayado (simulado con color en una pantalla a color)
(los colores para simular disminución o subrayado se ponen con
ESC ] ...)
5pone intermitencia
7pone vídeo inverso
10restaura asociación seleccionada, indicador de control de
pantalla y cambia el indicador meta
11selecciona no asociación, pone indicador de control de
pantalla, restaura indicador de cambio meta
12selecciona no asociación, pone indicador de control de
pantalla, pone indicador de cambio meta (que hace que el bit
más alto de un byte cambie antes de que se haga la traducción
de la tabla de asociación.)
21pone intensidad normal (esto no es compatible con ECMA-48)
22pone intensidad normal
24quita subrayado
25quita intermitencia
27quita vídeo inverso
30pone negro
31pone rojo
32pone verde
33pone marrón
34pone azul
35pone rosa
36pone celeste
37pone blanco
38pone subrayado, color predeterminado
39quita subrayado, pone color predeterminado
40pone negro de fondo
41pone rojo de fondo
42pone verde de fondo
43pone marrón de fondo
44pone azul de fondo
45pone rosa de fondo
46pone celeste de fondo
47pone blanco de fondo
49pone el color de fondo predeterminado

Interruptores de Modo ECMA-48

ESC [ 3 h
DECCRM (por omisión desactivado): Mostrar caracteres de control
ESC [ 4 h
DECIM (por omisión desactivado): Poner modo de inserción
ESC [ 20 h
LF/NL (por omisión desactivado): Automáticamente seguir a LF, VT o FF con CR.

Órdenes de Informe de Estado ECMA-48

ESC [ 5 n
Informe de estado de dispositivo (DSR): La respuesta es ESC [ 0 n (Terminal OK).
ESC [ 6 n
Informe de posición de cursor (CPR): La respuesta es ESC [ y ; x R, donde x,y es la localización del cursor.

Secuencias de Modo Privado DEC (DECSET/DECRST).

Éstas no se describen en ECMA-48. Listamos las secuencias de Establecer Modo; las de Reestablecer Modo se obtienen reemplazando la hache final por ele.
ESC [ ? 1 h
DECCKM (por omisisón desactivado): Cuando está activado, las teclas de cursor envían un prefijo ESC O, en vez de ESC [.
ESC [ ? 3 h
DECCOLM (por omisión desactivado = 80 columnas): interruptor de modo 80/132 columnas. En los fuentes del controlador se hace notar que esto solo no basta; alguna utilidad de usuario como resizecons(8) tiene que cambiar los registros de hardware en la tarjeta de vídeo de consola.
ESC [ ? 5 h
DECSCNM (por omisión desactivado): Pone el modo de vídeo inverso
ESC [ ? 6 h
DECOM (por omisión desactivado): Cuando está activado, el direccionamiento del cursor es relativo a la esquina superior izquierda de la región de rodadura.
ESC [ ? 7 h
DECAWM (por omisión activado): Activa el paso automático de renglón. En este modo, un carácter gráfico emitido tras la columna 80 (o la 132 si está activado DECCOLM) fuerza un cambio al principio de la siguiente línea.
ESC [ ? 8 h
DECARM (por omisión activado): Activa la auto-repetición del teclado
ESC [ ? 9 h
Informe de Ratón X10 (por omisión desactivado): Establece el modo de informe a 1 (o lo restaura a 0) - vea abajo.
ESC [ ? 25 h
DECCM (por omisión activado): Hace visible el cursor.
ESC [ ? 1000 h
Informe de Ratón X11 (por omisión desactivado): Establece el modo de informe a 2 (o lo restaura a 0) - vea abajo.

Secuencias Privadas de Consola de Linux CSI

Las siguientes secuencias no son ni ECMA-48 ni VT102 nativas. Son nativas al controlador de consola de Linux. Los colores están en los parámetros SGR: 0 = negro, 1 = rojo, 2 = verde, 3 = marrón, 4 = azul, 5 = rosa, 6 = celeste, 7 = blanco.

ESC [ 1 ; n ]Pone el color n como el de subrayado
ESC [ 2 ; n ]Pone el color n como el disminuido
ESC [ 8 ] Hace al color actual el de los atributos predeterminados
ESC [ 9 ; n ]Pone el tiempo de espera del blanqueado de la terminal a n min.
ESC [ 10 ; n ]Establece la frecuencia del pito en Hz.
ESC [ 11 ; n ]Establece la duración del pitido en ms.
ESC [ 12 ; n ]Trae al frente la consola especificada.
ESC [ 13 ] Quita el blanco de la pantalla.
ESC [ 14 ; n ] Establece el intervalo de apagado VESA en min.

CONJUNTOS DE CARACTERES

El núcleo sabe de 4 traducciones de bytes a símbolos de la pantalla de la consola. Las cuatro tablas son: a) Latin1 -> PC, b) gráficos VT100 -> PC, c) PC -> PC, d) definida por el usuario.

Hay dos conjuntos de caracteres, llamados G0 y G1, y uno de ellos es el actual. (Inicialmente G0.)

Teclear ^N hace que G1 sea el actual, ^O hace a G0 el actual.

Estas variables G0 y G1 apuntan a una tabla de traducción, y pueden ser cambiadas por el usuario. Inicialmente apuntan a las tablas a) y b) respectivamente. Las secuencias ESC ( B y ESC ( 0 y ESC ( U y ESC ( K causan que G0 apunte a la tabla a), b), c) y d) respectivamente. Las secuencias ESC ) B y ESC ) 0 y ESC ) U y ESC ) K causan que G1 apunte a la tabla a), b), c) y d), respectivamente.

La secuencia ESC c provoca una puesta a cero de la terminal, que es lo que uno quiere cuando la pantalla está liada. El otrora truco "echo ^V^O" solamente hace G0 actual, pero no hay garantías de que G0 apunte a la tabla a). En algunas distribuciones hay un programa reset(1) que simplemente hace "echo ^[c". Si su entrada de terminfo para la consola es correcto (y tiene una entrada rs1=\Ec), entonces "tput reset" también funcionará.

La tabla de asociación definida por el usuario puede ponerse con mapscrn(8). El resultado de la asociación es que si hay un símbolo c que se imprime, se envía a la memoria de vídeo el símbolo s = map[c]. El mapa de bits que corresponde a s se encuentra en la ROM de caracteres, y puede cambiarse mediante setfont(8).

PISTA DEL RATÓN

La facilidad de seguimiento de pista del ratón sirve para devolver informes de estado del ratón compatibles con xterm. Puesto que el controlador de consola no tiene forma de conocer el dispositivo ni tipo del ratón, estos informes se devuelven en el flujo de entrada de la consola sólo cuando del controlador de terminal virtual recibe un ioctl de actualización de ratón. Estos ioctls deben ser generados por una aplicación de usuario que haga uso del ratón como el duende gpm(8).

Los parámetros para todas las secuencias de escape de pista del ratón generadas por xterm codifican los parámetros numéricos en un simple carácter como valor+040. Por ejemplo, `!' es 1. El sistema de coordenadas de la pantalla empieza en 1.

El modo de compatibilidad X10 envía una secuencia de escape cuando se pulsa un botón codificando la localización y el botón del ratón pulsado. Esto se activa enviando ESC [ ? 9 h y se desactiva con ESC [ ? 9 l. Cuando se pulsa un botón, xterm envía ESC [ M bxy (6 caracteres). Aquí b es botón-1, y x y y son las coordenadas x e y del ratón cuando se pulsó el botón. Esto es el mismo código que el núcleo también produce.

El modo de pista normal (no implementado en Linux 2.0.24) envía una secuencia de escape cuando se pulas o se libera un botón. También se envía información de modificador. Se habilita enviando ESC [ ? 1000 h y se inhabilita con ESC [ 1000 l. Cuando se pulas o libera un botón, xtermenvía ESC [ M bxy. Los dos bits bajos de b codifican información del botón: 0=MB1 pulsado, 1=MB2 pulsado, 2=MB3 pulsado, 3=liberar. Los bits más altos codifican qué modificadores estaban pulsados cuando el botón se hubo presionado y se añaden juntos: 4=Mayúsculas, 8=Meta, 16=Control. De nuevo x e y son las coordenadas x e y del evento de ratón. La esquina superior izquierda es (1,1).

COMPARACIONES CON OTRAS TERMINALES

Muchos tipos diferentes de terminal se describen, como la consola de Linux, como `compatibles VT100'. Aquí se discuten las diferencias entre la consola de Linux y las otras dos más importantes, la VT102 de DEC y la xterm(1).

Manejo de caracteres de control

La vt102 también reconocía los siguientes caracteres de control:
NUL (0x00) no era tenido en cuenta;
ENQ (0x05) lanzaba un mensaje de reconocimiento;
DC1 (0x11, ^Q, XON) reanudaba la transmisión;
DC3 (0x13, ^S, XOFF) hacía que la vt100 no tuviera en cuenta (y parara la transmisión) ningún código excepto XOFF y XON.

El controlador de tty puede habilitar el procesamiento de DC1/DC3 al estilo de la VT100.

El programa xterm (en modo vt100) reconoce los caracteres de control BEL, BS, HT, LF, VT, FF, CR, SO, SI, ESC.

Secuencias de Escape

Secuncias de consola VT100 no implementadas en la consola de Linux:

ESC NSS2Simple cambio 2. (Selecciona el conjunto de caracteres
G2 sólo para el sgute. carácter.)
ESC OSS3Simple cambio 3. (Selecciona el conjunto de caracteres
G3 sólo para el sgute. carácter.)
ESC PDCSCadena de control de dispositivo (acabada por ESC \)
ESC XSOSComienzo de cadena.
ESC ^PMMensaje de privacidad (acabado por ESC \)
ESC \STTerminador de caadena
ESC * ...Designa el conjunto de caracteres G2
ESC + ...Designa el conjunto de caracteres G3

El programa xterm (en modo vt100) reconoce ESC c, ESC # 8, ESC >, ESC =, ESC D, ESC E, ESC H, ESC M, ESC N, ESC O, ESC P ... ESC , ESC Z (responde ESC [ ? 1 ; 2 c, `Yo soy una vt100 con opción de vídeo avanzado') y ESC ^ ... ESC  con los mismos significados que los arriba indicados. Acepta ESC (, ESC ), ESC *, ESC + seguidos por 0, A, B para el conjunto de caracteres especiales y líneas de dibujo de DEC, UK y US-ASCII, respectivamente. Acepta ESC ] para el establecimiento de ciertos recursos:

ESC ] 0 ; txt BELPone nombre de icono y título de ventana como txt.
ESC ] 1 ; txt BELPone txt como nombre de icono.
ESC ] 2 ; txt BELPone txt como título de ventana.
ESC ] 4 6 ; log BELCambia el nombre del fichero de registro a log
(normalmente deshabilitado por una opción de tiempo de
compilación)
ESC ] 5 0 ; fn BELPone fn como el tipo de letra.

Reconoce lo siguiente con un significado ligeramente modificado:

ESC 7 DECSCSalva el cursor
ESC 8 DECRCRestaura el cursor

También reconoce

ESC FCursor a esquina inferior izda. de la pantalla (si
permitido por el recurso hpLowerleftBugCompat)
ESC lBloqueo de memoria (por terminales HP).
Bloquea la memoria sobre el cursor.
ESC mDesbloqueo de memoria (por terminales HP).
ESC nLS2Invoca el conjunto de caracteres G2.
ESC oLS3Invoca el conjunto de caracteres G2.
ESC |LS3RInvoca el conjunto de caracteres G3 como GR.
No tiene efecto visible en xterm.
ESC }LS2RInvoca el conjunto de caracteres G2 como GR.
No tiene efecto visible en xterm.
ESC ~LS1RInvoca el conjunto de caracteres G1 como GR.
No tiene efecto visible en xterm.

No reconoce ESC % ...

Secuencias CSI

El programa xterm (en XFree86 3.1.2G) no reconoce los SGRs de modo invisible o parpadeo. Versiones originales X11R6 no reconocen los SGRs de establecimiento de colores. Todas las otras secuencias CSI de ECMA-48 reconocidas por Linux también lo son por xterm, y viceversa.

El programa xterm reconocerá todas las secuencias de Modo Privado de DEC listadas arriba, pero ninguna de las secuencias de modo privado de Linux. Para una discusión sobre las propias secuencias de modo privado de xterm, refiérase al documento Xterm Control Sequences por Edward Moy & Stephen Gildea, disponible con la distribución X-Window.

FALLOS

En 2.0.23, CSI no funciona, y NUL es tenido en cuenta dentro de secuencias de escape.