Código de escape ANSI - ANSI escape code

ANSI X3.64 (ISO 6429)
Htop.png
Salida del sistema-monitor htop , una aplicación ncurses (que usa SGR y otras secuencias de control ANSI / ISO).
Estándar
Clasificación Código de control basado en ISO / IEC 2022 y conjunto de secuencia de control
Otras codificaciones relacionadas Otras normas de funciones de control: ITU T.101 , JIS X 0207 , ISO 6630 , DIN 31626 , ETS 300706

Las secuencias de escape ANSI son un estándar para la señalización en banda para controlar la ubicación del cursor, el color, el estilo de fuente y otras opciones en terminales de texto de vídeo y emuladores de terminal . Ciertas secuencias de bytes , la mayoría que comienzan con un carácter de escape ASCII y un carácter de corchete , están incrustadas en el texto. El terminal interpreta estas secuencias como comandos, en lugar de texto para mostrarlos textualmente.

Las secuencias ANSI se introdujeron en la década de 1970 para reemplazar las secuencias específicas del proveedor y se generalizaron en el mercado de equipos informáticos a principios de la década de 1980. Se utilizan en aplicaciones de desarrollo, científicas y comerciales basadas en texto, así como en sistemas de tablones de anuncios para ofrecer una funcionalidad estandarizada.

Aunque los terminales de texto de hardware se han vuelto cada vez más raros en el siglo XXI, la relevancia del estándar ANSI persiste porque una gran mayoría de emuladores de terminal y consolas de comando interpretan al menos una parte del estándar ANSI.

Historia

Casi todos los fabricantes de terminales de video agregaron secuencias de escape específicas del proveedor para realizar operaciones como colocar el cursor en posiciones arbitrarias en la pantalla. Un ejemplo es el terminal VT52 , que permitió colocar el cursor en una ubicación x, y en la pantalla enviando el ESCcarácter, un Ycarácter y luego dos caracteres que representan con valores numéricos iguales a la ubicación x, y más 32 (por lo tanto comenzando en el carácter de espacio ASCII y evitando los caracteres de control). El Hazeltine 1500 tenía una característica similar, invocada usando ~, DC1y luego las posiciones X e Y separadas con una coma. Si bien los dos terminales tenían una funcionalidad idéntica a este respecto, se tuvieron que utilizar diferentes secuencias de control para invocarlos.

Como estas secuencias eran diferentes para diferentes terminales, se tuvieron que crear bibliotecas elaboradas como termcap ("capacidades de terminal") y utilidades como tput para que los programas pudieran usar la misma API para trabajar con cualquier terminal. Además, muchos de estos terminales requerían el envío de números (como filas y columnas) como valores binarios de los caracteres; para algunos lenguajes de programación y para sistemas que no usaban ASCII internamente, a menudo era difícil convertir un número en el carácter correcto.

El estándar ANSI intentó abordar estos problemas creando un conjunto de comandos que todos los terminales usarían y requiriendo que toda la información numérica se transmita como números ASCII. El primer estándar de la serie fue ECMA-48, adoptado en 1976. Fue una continuación de una serie de estándares de codificación de caracteres, siendo el primero ECMA-6 de 1965, un estándar de 7 bits a partir del cual se origina ISO 646 . El nombre "secuencia de escape ANSI" data de 1979 cuando ANSI adoptó ANSI X3.64. El comité ANSI X3L2 colaboró ​​con el comité ECMA TC 1 para producir estándares casi idénticos. Estos dos estándares se fusionaron en un estándar internacional, ISO 6429. En 1994, ANSI retiró su estándar a favor del estándar internacional.

Terminal DEC VT100
El terminal de visualización de video DEC VT100.

El primer terminal de video popular que admitió estas secuencias fue el Digital VT100 , introducido en 1978. Este modelo tuvo mucho éxito en el mercado, lo que provocó una variedad de clones de VT100, entre los que se encuentran los primeros y más populares, el Zenith Z, mucho más asequible. -19 en 1979. Otros incluyeron el Qume QVT-108, Televideo TVI-970, Wyse WY-99GT así como los modos opcionales "VT100" o "VT103" o "ANSI" con diversos grados de compatibilidad en muchas otras marcas. La popularidad de estos llevó gradualmente a que cada vez más software (especialmente los sistemas de tablones de anuncios y otros servicios en línea ) asumieran que las secuencias de escape funcionaban, lo que llevó a que casi todos los nuevos terminales y programas emuladores los admitieran.

En 1981, la publicación 86 de FIPS adoptó ANSI X3.64 para su uso en el gobierno de EE.UU. 86 fue retirado.

ECMA-48 ha sido actualizado varias veces y actualmente se encuentra en su quinta edición, desde 1991. También es adoptado por ISO e IEC como estándar ISO / IEC 6429 . Se adopta una versión como estándar industrial japonés , como JIS X 0211 .

Los estándares relacionados incluyen ITU T.61 , el estándar Teletex , e ISO / IEC 8613 , el estándar de Arquitectura de Documento Abierto (principalmente ISO / IEC 8613-6 o ITU T.416). Los dos sistemas comparten muchos códigos de escape con el sistema ANSI, con extensiones que no son necesariamente significativas para los terminales de computadora. Ambos sistemas cayeron rápidamente en desuso, pero ECMA-48 marca las extensiones utilizadas en ellos como reservadas.

Soporte de plataforma

Sistemas similares a Unix

Aunque las bibliotecas de estilo termcap / terminfo se desarrollaron principalmente en y para Unix, a mediados de la década de 1980 los programas que se ejecutaban en sistemas operativos similares a Unix casi siempre podían asumir que estaban usando un terminal o emulador que admitiera secuencias ANSI; esto llevó a un uso generalizado de ANSI por programas que se ejecutan en esas plataformas. Por ejemplo, muchos juegos y scripts de shell, y utilidades como listados de directorios de colores, escriben directamente las secuencias ANSI y, por lo tanto, no se pueden usar en un terminal que no las interpreta. Muchos programas, incluidos editores de texto como vi y GNU Emacs , usan termcap o terminfo, o usan bibliotecas como curses que usan termcap o terminfo, y por lo tanto, en teoría, admiten terminales que no son ANSI, pero esto rara vez se prueba hoy en día que son Es poco probable que funcione con esos terminales.

Emulador de terminal Xterm
El emulador de terminal Xterm.

Los emuladores de terminal para comunicarse con programas locales, así como con máquinas remotas y la consola del sistema de texto , casi siempre admiten códigos de escape ANSI. Esto incluye emuladores de terminal como xterm , rxvt , GNOME Terminal y Konsole en sistemas con sistemas de ventanas basados en X11 o Wayland , y Terminal.app y emuladores de terminal de terceros como iTerm2 en macOS .

DOS, OS / 2 y Windows

MS-DOS 1.x no admitía ANSI ni ninguna otra secuencia de escape. El BIOS subyacente solo interpretó unos pocos caracteres de control ( BEL , CR , LF , BS ), lo que hace que sea casi imposible realizar cualquier tipo de aplicación de pantalla completa. Cualquier efecto de visualización tenía que hacerse con llamadas al BIOS, que eran notoriamente lentas, o manipulando directamente el hardware de la PC IBM.

DOS 2.0 introdujo la capacidad de agregar un controlador de dispositivo para las secuencias de escape ANSI; el estándar de facto es ANSI.SYS , pero también se utilizan otros como ANSI.COM , NANSI.SYS y ANSIPLUS.EXE (estos son considerablemente más rápidos ya que omitir el BIOS). La lentitud y el hecho de que no se instaló por defecto hizo que el software rara vez lo aproveche; en cambio, las aplicaciones continuaron manipulando directamente el hardware para obtener la visualización de texto necesaria. ANSI.SYS y controladores similares continuaron funcionando en Windows 9x hasta Windows ME y en sistemas derivados de NT para programas heredados de 16 bits que se ejecutan bajo NTVDM .

Muchos clones de DOS pudieron interpretar las secuencias y no requieren que se cargue un controlador ANSI por separado. PTS-DOS , así como DOS concurrentes , DOS multiusuario y REAL / 32 tienen soporte integrado (más una serie de extensiones). OS / 2 tenía un comando ANSI que habilitaba las secuencias.

La consola de Windows no admitía secuencias de escape ANSI, ni Microsoft proporcionó ningún método para habilitarlas. Algunas sustituciones o adiciones para la ventana de la consola como de JP Software TCC (anteriormente 4NT), Michael J. Mefford de ANSI.COM, de Jason Capucha ANSICON y de Maximus5 ConEmu interpretados secuencias de escape ANSI impresos por programas. Un paquete de Python interpretó internamente las secuencias de escape ANSI en el texto que se estaba imprimiendo, traduciéndolas a llamadas para manipular el color y la posición del cursor, para facilitar la portabilidad del código Python usando ANSI a Windows. Cygwin realiza una traducción similar a toda la salida escrita en la consola usando descriptores de archivo Cygwin, el filtrado se realiza mediante las funciones de salida de cygwin1.dll , para permitir la portabilidad del código POSIX C a Windows.

En 2016, Microsoft lanzó la actualización de Windows 10 versión 1511 que inesperadamente implementó soporte para secuencias de escape ANSI, más de dos décadas después del debut de Windows NT. Esto se hizo junto con el Subsistema de Windows para Linux , lo que permitió que un software basado en terminal similar a Unix usara las secuencias en la Consola de Windows. Desafortunadamente, esto está desactivado de forma predeterminada, pero Windows PowerShell 5.1 lo habilitó. PowerShell 6 hizo posible incrustar el carácter ESC necesario en una cadena con `e. Windows Terminal , introducido en 2019, admite las secuencias de forma predeterminada, y Microsoft tiene la intención de reemplazar la Consola de Windows con Windows Terminal.

Atari ST

El Atari ST usó el sistema de comando adaptado del VT52 con algunas expansiones para soporte de color, en lugar de admitir códigos de escape ANSI.

AmigaOS

AmigaOS no solo interpreta las secuencias de código ANSI para la salida de texto a la pantalla, el controlador de impresora AmigaOS también las interpreta (con extensiones propietarias de AmigaOS) y las traduce a los códigos requeridos para la impresora particular que está realmente conectada.

Secuencias de control de estilo de ventana de Amiga CLI (shell)
Efecto
ESC [ nu Establece la longitud máxima de las líneas en la ventana en n.
ESC [ nt Establece el número máximo de líneas en la ventana en n.
ESC [ nx Inicia texto n píxeles desde el borde izquierdo de la ventana.
ESC [ ny Inicia texto a n píxeles desde el borde superior de la ventana.

VMS / OpenVMS

VMS fue diseñado para ser administrado de forma interactiva utilizando terminales de video basados ​​en texto de Digital, como el VT100 mencionado anteriormente ; más tarde con emuladores de terminales gráficos como VWS Terminal, DECTerm y xterm.

Descripción

Personajes de control

Aunque técnicamente no es parte del estándar, casi todos los usuarios asumen algunas funciones de algunos caracteres de un solo byte. Esto se usa para acortar la cantidad de datos transmitidos o para realizar algunas funciones que no están disponibles en las secuencias de escape:

Personajes de control populares (no es una lista exhaustiva)
^ C0 Abbr Nombre Efecto
^ G 7 BEL campana Hace un ruido audible.
^ H 8 BS Retroceso Mueve el cursor hacia la izquierda (pero puede "retroceder" si el cursor está al principio de la línea).
^ Yo 9 HT Pestaña Mueve el cursor hacia la derecha al siguiente múltiplo de 8.
^ J 0x0A LF Linea de alimentación Pasa a la línea siguiente, desplaza la pantalla hacia arriba si está en la parte inferior de la pantalla. Por lo general, no se mueve horizontalmente, aunque los programas no deben basarse en esto.
^ L 0x0C FF Alimentación de formulario Mueva una impresora a la parte superior de la página siguiente. Por lo general, no se mueve horizontalmente, aunque los programas no deben basarse en esto. El efecto sobre los terminales de video varía.
^ M 0x0D CR Retorno de carro Mueve el cursor a la columna cero.
^ [ 0x1B ESC Escapar Inicia todas las secuencias de escape

Las secuencias de escape varían en longitud. El formato general para una secuencia de escape compatible con ANSI está definido por ANSI X3.41 (equivalente a ECMA-35 o ISO / IEC 2022). Las secuencias de escape constan solo de bytes en el rango 0x20—0x7F (todos los caracteres ASCII que no son de control) y se pueden analizar sin mirar hacia adelante. El comportamiento cuando se encuentra un carácter de control, un byte con el bit alto establecido o un byte que no es parte de ninguna secuencia válida, se encuentra antes del final no está definido.

Secuencias de Fe Escape

Si ESCva seguido de un byte en el rango de 0x40 a 0x5F, es de este tipo. Delegado al estándar de código de control C1 aplicable . En consecuencia, todas las secuencias de escape correspondientes a los códigos de control C1 de ANSI X3.64 / ECMA-48 siguen este formato.

El estándar dice que, en entornos de 8 bits, las funciones de control correspondientes a las Fesecuencias de escape de tipo (las del conjunto de códigos de control C1 ) se pueden representar como bytes individuales en el rango 0x80–0x9F. Sin embargo, en los dispositivos modernos, esos códigos se utilizan a menudo para otros fines, como partes de UTF-8 o para caracteres CP-1252 , por lo que normalmente solo se utiliza la secuencia de 2 bytes. En el caso de UTF-8, un código de control C1 se puede codificar como dos bytes (por ejemplo, 0xC2,0x8E para U + 008E ), pero no se guarda espacio de esta manera.

Algunas secuencias de escape ANSI de tipo Fe (elemento de conjunto C1) (no es una lista exhaustiva)
C1 Abbr Nombre Efecto
ESC N 0x8E SS2 Turno único dos Seleccione un solo carácter de uno de los juegos de caracteres alternativos . SS2 selecciona el juego de caracteres G2 y SS3 selecciona el juego de caracteres G3. En un entorno de 7 bits, esto va seguido de uno o más bytes GL (0x20–0x7F) que especifican un carácter de ese conjunto. En un entorno de 8 bits, estos pueden ser bytes GR (0xA0–0xFF).
ESC O 0x8F SS3 Turno único tres
ESC P 0x90 DCS Cadena de control de dispositivo Terminado por ST. Los usos de Xterm de esta secuencia incluyen la definición de claves definidas por el usuario y la solicitud o configuración de datos de Termcap / Terminfo.
ESC [ 0x9B CSI Introductor de secuencia de control Inicia la mayoría de las secuencias útiles, terminadas por un byte en el rango de 0x40 a 0x7E.
ESC \ 0x9C S T Terminador de cuerdas Termina cadenas en otros controles.
ESC ] 0x9D OSC Comando del sistema operativo Inicia una cadena de control para que la utilice el sistema operativo, terminada por ST.
ESC X 0x98 llamada de socorro Inicio de cadena Toma un argumento de una cadena de texto, terminado por ST. Los usos de estas secuencias de control de cadenas están definidos por la aplicación o la disciplina de privacidad. Estas funciones rara vez se implementan y xterm ignora los argumentos. Algunos clientes de Kermit permiten que el servidor ejecute automáticamente comandos de Kermit en el cliente incrustándolos en secuencias APC; este es un riesgo potencial para la seguridad si el servidor no es de confianza.
ESC ^ 0x9E PM Mensaje de privacidad
ESC _ 0x9F APC Comando del programa de aplicación

Secuencias CSI (Control Sequence Introducer)

Para los comandos Control Sequence Introducer, o CSI, el ESC [es seguido por cualquier número (incluido ninguno) de "bytes de parámetro" en el rango 0x30–0x3F (ASCII 0–9:;<=>?), luego por cualquier número de "bytes intermedios" en el rango 0x20–0x2F (Espacio ASCII y !"#$%&'()*+,-./), luego finalmente por un solo "byte final" en el rango 0x40–0x7E (ASCII @A–Z[\]^_`a–z{|}~).

Todas las secuencias comunes solo usan los parámetros como una serie de números separados por punto y coma, como 1;2;3. Los números que faltan se tratan como 0( 1;;3actúa como el número del medio 0, y ningún parámetro en absoluto ESC[mactúa como un 0código de reinicio). Algunas secuencias (como CUU) se tratan 0como 1para que los parámetros faltantes sean útiles.

Un subconjunto de arreglos se declaró "privado" para que los fabricantes de terminales pudieran insertar sus propias secuencias sin entrar en conflicto con la norma. Las secuencias que contienen los bytes de parámetro <=>?o los bytes finales 0x70–0x7E ( p–z{|}~) son privadas.

El comportamiento del terminal no está definido en el caso de que una secuencia CSI contenga cualquier carácter fuera del rango 0x20–0x7E. Estos caracteres ilegales son caracteres de control C0 (el rango 0–0x1F), DEL (0x7F) o bytes con el bit alto establecido. Las posibles respuestas son ignorar el byte, procesarlo inmediatamente y, además, continuar con la secuencia CSI, abortarla inmediatamente o ignorar el resto.

Algunas secuencias de control ANSI (no es una lista exhaustiva)
Abbr Nombre Efecto
CSI n A CUU Cursor hacia arriba Mueve el cursor n (predeterminado 1) celdas en la dirección indicada. Si el cursor ya está en el borde de la pantalla, esto no tiene ningún efecto.
CSI n B RUMIA Cursor hacia abajo
CSI n C CUF Cursor adelante
CSI n D CACHORRO Cursor atrás
CSI n E CNL Cursor Siguiente línea Mueve el cursor al principio de la línea n (predeterminado 1) líneas hacia abajo. (no ANSI.SYS )
CSI n F CPL Línea anterior del cursor Mueve el cursor al principio de la línea n (predeterminado 1) líneas hacia arriba. (no ANSI.SYS )
CSI n G CHA Cursor Horizontal Absoluto Mueve el cursor a la columna n (predeterminado 1). (no ANSI.SYS )
CSI  n  ; m  H TAZA Posición del cursor Mueve el cursor a la fila n , columna m . Los valores se basan en 1 y, de forma predeterminada, son 1(esquina superior izquierda) si se omiten. Una secuencia como CSI ;5Hes sinónimo de CSI 1;5Hasí como CSI 17;Hes igual que CSI 17HyCSI 17;1H
CSI n J ED Borrar en pantalla Borra parte de la pantalla. Si n es 0(o falta), borre desde el cursor hasta el final de la pantalla. Si n es 1, borre desde el cursor hasta el comienzo de la pantalla. Si n es 2, borra toda la pantalla (y mueve el cursor hacia la parte superior izquierda en DOS ANSI.SYS ). Si n es 3, borre toda la pantalla y elimine todas las líneas guardadas en el búfer de retroceso (esta función se agregó para xterm y es compatible con otras aplicaciones de terminal).
CSI n K EL Borrar en línea Borra parte de la línea. Si n es 0(o falta), borre desde el cursor hasta el final de la línea. Si n es 1, borre desde el cursor hasta el comienzo de la línea. Si n es 2, borre toda la línea. La posición del cursor no cambia.
CSI n S SU Desplazarse hacia arriba Desplazarse por toda la página hacia arriba n (predeterminado 1) líneas. Se agregan nuevas líneas en la parte inferior. (no ANSI.SYS )
CSI n T Dakota del Sur Desplazarse hacia abajo Desplazarse por toda la página hacia abajo n (predeterminado 1) líneas. Se agregan nuevas líneas en la parte superior. (no ANSI.SYS )
CSI n  ; m f HVP Posición vertical horizontal Igual que CUP, pero cuenta como una función de efecto de formato (como CR o LF ) en lugar de una función de editor (como CUD o CNL). Esto puede dar lugar a un manejo diferente en ciertos modos de terminal.
CSI n m SGR Seleccione la reproducción de gráficos Establece los colores y el estilo de los personajes que siguen este código.
CSI 5i Puerto AUX activado Habilite el puerto serial auxiliar generalmente para la impresora serial local
CSI 4i Puerto AUX desactivado Deshabilite el puerto serial auxiliar generalmente para la impresora serial local

CSI 6n DSR Informe de estado del dispositivo Informa la posición del cursor (CPR) transmitiendo ESC[n;mR, donde n es la fila y m es la columna.)
Algunas secuencias privadas populares
Abbr Nombre Efecto
CSI s SCP, SCOSC Guardar la posición actual del cursor Guarda la posición / estado del cursor en el modo de consola SCO. En el modo de pantalla dividida vertical, en su lugar se utiliza para establecer (como ) o restablecer los márgenes izquierdo y derecho. CSI n ; n s
CSI u RCP, SCORC Restaurar la posición guardada del cursor Restaura la posición / estado del cursor en el modo de consola SCO.
CSI? 25 h DECTCEM Muestra el cursor, del VT220 .
CSI? 25 litros DECTCEM Oculta el cursor.
CSI? 1049 horas Habilitar búfer de pantalla alternativo, desde xterm
CSI? 1049 litros Deshabilitar el búfer de pantalla alternativo, desde xterm
CSI? 2004 h Active el modo de pegado entre corchetes. El texto pegado en la terminal estará rodeado por ESC [200~y ESC [201~, y los caracteres en él no deben tratarse como comandos (por ejemplo, en Vim). Desde xterm
CSI? 2004 l Desactive el modo de pegado entre corchetes.

Parámetros SGR (Select Graphic Rendition)

Seleccionar representación gráfica (SGR) establece los atributos de visualización. Se pueden establecer varios atributos en la misma secuencia, separados por punto y coma. Cada atributo de visualización permanece en efecto hasta que una siguiente ocurrencia de SGR lo restablezca. Si no se dan códigos, CSI mse trata como CSI 0 m(restablecer / normal).

Nombre Nota
0 Restablecer o normal Todos los atributos desactivados
1 Intensidad audaz o aumentada Al igual que con el tenue, el cambio de color es una invención de PC (SCO / CGA ).
2 Débil, disminución de la intensidad o atenuación Puede implementarse como una fuente de peso ligero como negrita.
3 Itálico No cuenta con un amplio apoyo. A veces tratada como inversa o parpadeante.
4 Subrayar Existen extensiones de estilo para Kitty, VTE, mintty e iTerm2.
5 Parpadeo lento Menos de 150 por minuto
6 Parpadeo rápido MS-DOS ANSI.SYS, más de 150 por minuto; no es ampliamente apoyado
7 Vídeo inverso o invertido Intercambiar colores de primer plano y de fondo; emulación inconsistente
8 Ocultar o esconder No cuenta con un amplio apoyo.
9 Tachado , o huelga Caracteres legibles pero marcados como para borrar.
10 Fuente principal (predeterminada)
11-19 Fuente alternativa Seleccionar fuente alternativa n - 10
20 Fraktur (gótico) Rara vez apoyado
21 Doblemente subrayado; o: no en negrita Doble subrayado por ECMA-48, pero en lugar desactiva la intensidad negrita en varias terminales, incluso en el núcleo de Linux 's consola antes de la versión 4.17.
22 Intensidad normal Ni audaz ni débil; el color cambia donde la intensidad se implementa como tal.
23 Ni cursiva ni letra negra
24 No subrayado Ni simple ni doblemente subrayado
25 Sin parpadear
26 Espaciamiento proporcional ITU T.61 y T.416, no se sabe que se utilicen en terminales
27 No revertido
28 Revelar No oculto
29 No tachado
30–37 Establecer color de primer plano
38 Establecer color de primer plano Los siguientes argumentos son 5;no2;r;g;b
39 Color de primer plano predeterminado Implementación definida (según estándar)
40–47 Establecer color de fondo
48 Establecer color de fondo Los siguientes argumentos son 5;no2;r;g;b
49 Color de fondo predeterminado Implementación definida (según estándar)
50 Deshabilitar el espaciado proporcional T.61 y T.416
51 Enmarcado Implementado como " selector de variación de emoji " en mintty.
52 Rodeado
53 Subrayado
54 Ni enmarcado ni rodeado
55 No subrayado
58 Establecer color de subrayado No en estándar; implementado en Kitty, VTE, mintty e iTerm2. Los siguientes argumentos son 5;no2;r;g;b .
59 Color de subrayado predeterminado No en estándar; implementado en Kitty, VTE, mintty e iTerm2.
60 Subrayado de ideograma o línea lateral derecha Rara vez apoyado
61 Ideograma doble subrayado o doble línea en el lado derecho
62 Ideograma sobre línea o línea lateral izquierda
63 Ideograma doble sobrelínea o doble línea en el lado izquierdo
64 Marcado de estrés ideograma
sesenta y cinco Sin atributos de ideograma Restablecer los efectos de todos 60-64
73 Sobrescrito Implementado solo en mintty
74 Subíndice
75 Ni superíndice ni subíndice
90–97 Establecer color de primer plano brillante No en estándar; implementado originalmente por aixterm
100-107 Establecer color de fondo brillante

Colores

3 bits y 4 bits

La especificación original solo tenía 8 colores y solo les dio nombres. Los parámetros SGR 30–37 seleccionaron el color de primer plano, mientras que 40–47 seleccionaron el fondo. Un buen número de terminales implementaron "negrita" (código SGR 1) como un color más brillante en lugar de una fuente diferente, proporcionando así 8 colores de primer plano adicionales. Por lo general, no puede obtener estos como colores de fondo, aunque a veces el video inverso (código SGR 7) lo permite. Ejemplos: para obtener letras negras sobre fondo blanco, use ESC[30;47m, para obtener el uso de rojo ESC[31m, para obtener el uso de rojo brillante ESC[1;31m. Para restablecer los colores a sus valores predeterminados, utilice ESC[39;49m(no compatible con algunos terminales) o restablezca todos los atributos con ESC[0m. Los terminales posteriores agregaron la capacidad de especificar directamente los colores "brillantes" con 90–97 y 100–107.

Cuando el hardware comenzó a utilizar convertidores de digital a analógico (DAC) de 8 bits, varias piezas de software asignaron números de color de 24 bits a estos nombres. La siguiente tabla muestra los valores predeterminados enviados al DAC para algunos hardware y software comunes; en la mayoría de los casos son configurables.

FG BG Nombre VGA
Consola de Windows XP
Windows
PowerShell
Código de Visual Studio
Consola de Windows 10
Terminal.app Masilla mIRC xterm Ubuntu Terminal Eclipse
30 40 Negro 0, 0, 0 12, 12, 12 0, 0, 0 1, 1, 1 0, 0, 0
31 41 rojo 170, 0, 0 128, 0, 0 205, 49, 49 197, 15, 31 194, 54, 33 187, 0, 0 127, 0, 0 205, 0, 0 222, 56, 43 205, 0, 0
32 42 Verde 0, 170, 0 0, 128, 0 13, 188, 121 19, 161, 14 37, 188, 36 0, 187, 0 0, 147, 0 0, 205, 0 57, 181, 74 0, 205, 0
33 43 Amarillo 170, 85, 0 128, 128, 0 238, 237, 240 229, 229, 16 193, 156, 0 173, 173, 39 187, 187, 0 252, 127, 0 205, 205, 0 255, 199, 6 205, 205, 0
34 44 Azul 0, 0, 170 0, 0, 128 36, 114, 200 0, 55, 218 73, 46, 225 0, 0, 187 0, 0, 127 0, 0, 238 0, 111, 184 0, 0, 238
35 45 Magenta 170, 0, 170 128, 0, 128 1, 36, 86 188, 63, 188 136, 23, 152 211, 56, 211 187, 0, 187 156, 0, 156 205, 0, 205 118, 38, 113 205, 0, 205
36 46 Cian 0, 170, 170 0, 128, 128 17, 168, 205 58, 150, 221 51, 187, 200 0, 187, 187 0, 147, 147 0, 205, 205 44, 181, 233 205, 0, 205
37 47 blanco 170, 170, 170 192, 192, 192 229, 229, 229 204, 204, 204 203, 204, 205 187, 187, 187 210, 210, 210 229, 229, 229 204, 204, 204 229, 229, 229
90 100 Negro brillante (gris) 85, 85, 85 128, 128, 128 102, 102, 102 118, 118, 118 129, 131, 131 85, 85, 85 127, 127, 127 127, 127, 127 128, 128, 128 0, 0, 0
91 101 Rojo brillante 255, 85, 85 255, 0, 0 241, 76, 76 231, 72, 86 252, 57, 31 255, 85, 85 255, 0, 0 255, 0, 0 255, 0, 0 255, 0, 0
92 102 Verde brillante 85, 255, 85 0, 255, 0 35, 209, 139 22, 198, 12 49, 231, 34 85, 255, 85 0, 252, 0 0, 255, 0 0, 255, 0 0, 255, 0
93 103 Amarillo brillante 255, 255, 85 255, 255, 0 245, 245, 67 249, 241, 165 234, 236, 35 255, 255, 85 255, 255, 0 255, 255, 0 255, 255, 0 255, 255, 0
94 104 Azul brillante 85, 85, 255 0, 0, 255 59, 142, 234 59, 120, 255 88, 51, 255 85, 85, 255 0, 0, 252 92, 92, 255 0, 0, 255 92, 92, 255
95 105 Magenta brillante 255, 85, 255 255, 0, 255 214, 112, 214 180, 0, 158 249, 53, 248 255, 85, 255 255, 0, 255 255, 0, 255 255, 0, 255 255, 0, 255
96 106 Cian brillante 85, 255, 255 0, 255, 255 41, 184, 219 97, 214, 214 20, 240, 240 85, 255, 255 0, 255, 255 0, 255, 255 0, 255, 255 0, 255, 255
97 107 Blanco brillante 255, 255, 255 255, 255, 255 229, 229, 229 242, 242, 242 233, 235, 235 255, 255, 255 255, 255, 255 255, 255, 255 255, 255, 255 255, 255, 255
8 bits

A medida que las tablas de búsqueda de 256 colores se volvieron comunes en las tarjetas gráficas, se agregaron secuencias de escape para seleccionar de un conjunto predefinido de 256 colores:

ESC[38;5;⟨n⟩m Select foreground color
ESC[48;5;⟨n⟩m Select background color
  0-  7:  standard colors (as in ESC [ 30–37 m)
  8- 15:  high intensity colors (as in ESC [ 90–97 m)
 16-231:  6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
232-255:  grayscale from black to white in 24 steps

La UIT 's Tecnología de la información T.416 - Arquitectura de documento abierta (ODA) y formato de intercambio: Arquitecturas de contenido de usos del carácter ':' como caracteres separadores en su lugar:

ESC[38;5;⟨n⟩m Select foreground color      where n is a number from the table below
ESC[48;5;⟨n⟩m Select background color
Modo de 256 colores - primer plano: ESC [38; 5; #m fondo: ESC [48; 5; #m
Colores estándar Colores de alta intensidad
 0   1   2   3   4   5   6   7   8   9  10 11 12 13 14 15
216 colores
dieciséis 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
52 53 54 55 56 57 58 59 60 61 62 63 64 sesenta y cinco 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
Colores en escala de grises
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255

También ha habido una codificación de 88 colores similar pero incompatible usando la misma secuencia de escape, vista en rxvty xterm-88color. No se sabe mucho sobre el esquema además de los códigos de color. Utiliza un cubo de color de 4 × 4 × 4.

24 bits

A medida que las tarjetas gráficas de "color verdadero" con 16 a 24 bits de color se volvieron comunes, las aplicaciones comenzaron a admitir colores de 24 bits. Los emuladores de terminal que admiten la configuración de colores de fondo y primer plano de 24 bits con secuencias de escape incluyen Xterm, Konsole de KDE e iTerm, así como todos los terminales basados ​​en libvte, incluido el Terminal GNOME .

ESC[ 38;2;⟨r⟩;⟨g⟩;⟨b⟩ m Select RGB foreground color
ESC[ 48;2;⟨r⟩;⟨g⟩;⟨b⟩ m Select RGB background color

La UIT 's Tecnología de la información T.416 - Arquitectura de documento abierta (ODA) y formato de intercambio: Arquitecturas de contenido de caracteres que fue adoptada como norma ISO / IEC 8613-6 Norma Internacional proporciona una versión alternativa que parece estar menos compatible. Los parámetros después del '2', es decir, incluso r, g, b son opcionales. Tenga en cuenta que esta no es solo la secuencia anterior con punto y coma reemplazado por dos puntos, hay un "ID de espacio de color" inicial (este hecho fue pasado por alto por muchos emuladores de terminal, esta omisión parece provenir de KDE Konsole). La definición del ID del espacio de color no se incluye en ese documento, por lo que puede estar en blanco para representar el valor predeterminado no especificado. Además del valor '2' para especificar un formato rojo-verde-azul (y el '5' anterior para un color indexado de 0-255), hay alternativas de '0' para la implementación definida y '1' para transparente, ninguna de lo que tiene otros parámetros; '3' especifica colores usando un esquema Cyan-Magenta-Yellow, y '4' para uno Cyan-Magenta-Yellow-Black, este último usa la posición marcada como "no usado" para el componente Negro:

ESC[ 38:2:⟨Color-Space-ID⟩:⟨r⟩:⟨g⟩:⟨b⟩:⟨unused⟩:⟨CS tolerance⟩:⟨Color-Space associated with tolerance: 0 for "CIELUV"; 1 for "CIELAB"⟩ m Select RGB foreground color
ESC[ 48:2:⟨Color-Space-ID⟩:⟨r⟩:⟨g⟩:⟨b⟩:⟨unused⟩:⟨CS tolerance⟩:⟨Color-Space associated with tolerance: 0 for "CIELUV"; 1 for "CIELAB"⟩ m Select RGB background color

Secuencias de OSC (comando del sistema operativo)

En su mayoría, estos fueron definidos por Xterm. Por razones históricas, xterm puede finalizar el comando con BELasí como ST.

Xterm permite establecer el título de la ventana ESC ]0;this is the window title BEL.

Una extensión no xterm es el hipervínculo, ESC ]8;;link STde 2017, utilizado por VTE, iTerm2 y mintty.

La consola de Linux usa ESC ] P n rr gg bbpara cambiar la paleta, que, si está codificada en una aplicación, puede colgar otros terminales. Sin embargo, la adición STserá ignorada por Linux y formará una secuencia adecuada e ignorable para otros terminales.

Secuencias de escape de Fs

Si ESCva seguido de un byte en el rango 0x60—0x7E , es de este tipo. Se utiliza para funciones de control registradas individualmente en el registro ISO-IR y, en consecuencia, disponible incluso en contextos donde se utiliza un conjunto de códigos de control C1 diferente. Específicamente, corresponden a funciones de control único aprobadas por ISO / IEC JTC 1 / SC 2 y estandarizadas por ISO o un organismo reconocido por ISO. Algunos de estos se especifican en ECMA-35 (ISO 2022 / ANSI X3.41), otros en ECMA-48 (ISO 6429 / ANSI X3.64). ECMA-48 se refiere a estos como "funciones de control independientes".

Algunas secuencias de escape ANSI de tipo F (función independiente) reconocidas por terminales
Abbr Nombre Efecto
ESC c RIS Restablecer al estado inicial Activa un reinicio completo del terminal a su estado original. Esto puede incluir (si corresponde): restablecer la reproducción gráfica, borrar las paradas de tabulación, restablecer la fuente predeterminada y más.

Secuencias de fp Escape

Si ESCva seguido de un byte en el rango 0x30—0x3F , es de este tipo. Separado para funciones de control de uso privado.

Algunas secuencias de escape de tipo Fp (uso privado) reconocidas por el VT100 , sus sucesores y / o emuladores de terminal como xterm
Abbr Nombre Efecto
ESC 7 DECSC DEC Guardar cursor Guarda la posición del cursor, el estado de cambio de codificación y los atributos de formato.
ESC 8 DECRC Cursor de restauración DEC Restaura la posición del cursor, el estado de cambio de codificación y los atributos de formato del DECSC anterior si los hubiera; de lo contrario, restablece todos estos a sus valores predeterminados.

nF Secuencias de escape

Si ESCva seguido de un byte en el rango 0x20—0x2F , es de este tipo. Seguido de cualquier número de bytes adicionales en este rango, y luego un byte en el rango 0x30-0x7E . Además, se subcategorizan por los cuatro bits más bajos del primer byte, por ejemplo, "tipo 2F" para secuencias en las que el primer byte es 0x22 ; y si el byte final está en el rango de uso privado 0x30—0x3F (por ejemplo, "tipo 2Fp") o no (por ejemplo, "tipo 2Ft"). Se utilizan principalmente para mecanismos de conmutación de códigos ANSI / ISO como los utilizados por ISO-2022-JP , excepto para las 3Fsecuencias de tipo (aquellas en las que está el primer byte intermedio 0x23), que se utilizan para funciones de control individuales. Las 3Ftsecuencias de tipos están reservadas para funciones de control individuales registradas ISO-IR adicionales, mientras que las 3Fpsecuencias de tipos están disponibles para funciones de control de uso privado.

Algunas secuencias de escape ANSI de tipo 0Ft (anuncio) reconocidas por terminales (no es una lista exhaustiva)
Abbr Nombre Efecto
ESC SP F Definido en ECMA-35 (ANSI X3.41 / ISO 2022). Hace que las teclas de función envíen ESC + letra en lugar de códigos C1.
ESC SP G Definido en ECMA-35. Hace que las teclas de función envíen códigos C1.
Algunas secuencias de escape de tipo 3Fp (uso privado) reconocidas por el VT100 , sus sucesores y / o emuladores de terminal como xterm
Abbr Nombre Efecto
ESC # 3 DECDHL DEC Letras de doble altura, mitad superior Hace que la línea actual use caracteres dos veces más altos. Este código es para la mitad superior.
ESC # 4 DECDHL DEC Letras de doble altura, mitad inferior Hace que la línea actual use caracteres dos veces más altos. Este código es para la mitad inferior.
ESC # 5 DECSWL DEC Línea de ancho único Hace que la línea actual utilice caracteres de un solo ancho, según el comportamiento predeterminado.
ESC # 6 DECDWL Línea DEC de doble ancho Hace que la línea actual utilice caracteres de doble ancho, descartando cualquier carácter en la segunda mitad de la línea.

Ejemplos de

CSI 2 J - Esto borra la pantalla y, en algunos dispositivos, ubica el cursor en la posición y, x 1,1 (esquina superior izquierda).

CSI 32 m- Esto hace que el texto sea verde. El verde puede ser un verde oscuro y opaco, por lo que es posible que desee habilitar Bold con la secuencia CSI 1 mque lo haría verde brillante, o combinado como CSI 32 ; 1 m. Algunas implementaciones usan el estado Negrita para hacer que el personaje sea Brillante.

CSI 0 ; 6 8 ; "DIR" ; 13 p- Esto reasigna la tecla F10 para enviar al búfer del teclado la cadena "DIR" y ENTER, que en la línea de comandos de DOS mostraría el contenido del directorio actual. (Sólo MS-DOS ANSI.SYS) A veces se utilizaba para bombas ANSI . Este es un código de uso privado (como lo indica la letra p), que usa una extensión no estándar para incluir un parámetro con valores de cadena. Siguiendo la letra de la norma se consideraría que la secuencia termina en la letra D.

CSI s- Esto guarda la posición del cursor. El uso de la secuencia CSI ulo restaurará a la posición. Digamos que la posición actual del cursor es 7 (y) y 10 (x). La secuencia CSI sguardará esos dos números. Ahora puede moverse a una posición diferente del cursor, como 20 (y) y 3 (x), usando la secuencia CSI 20 ; 3 Ho CSI 20 ; 3 f. Ahora, si usa la secuencia CSI u, la posición del cursor volverá a 7 (y) y 10 (x). Algunos terminales requieren las secuencias DEC ESC 7/ en su ESC 8lugar, que son más compatibles.

En secuencias de comandos de shell

Los códigos de escape ANSI se utilizan a menudo en UNIX y terminales similares a UNIX para proporcionar resaltado de sintaxis . Por ejemplo, en terminales compatibles, el siguiente comando enumera los códigos de color de los nombres de archivos y directorios por tipo.

ls --color

Los usuarios pueden emplear códigos de escape en sus scripts incluyéndolos como parte de una salida estándar o un error estándar . Por ejemplo, el siguiente comando sed de GNU embellece la salida del comando make mostrando líneas que contienen palabras que comienzan con "WARN" en video inverso y palabras que comienzan con "ERR" en amarillo brillante sobre un fondo rojo oscuro ( se ignoran las mayúsculas y minúsculas ). Las representaciones de los códigos están resaltadas.

make 2>&1 | sed -e 's/.*\bWARN.*/\x1b[7m&\x1b[0m/i' -e 's/.*\bERR.*/\x1b[93;41m&\x1b[0m/i'

La siguiente función Bash hace que el terminal parpadee (enviando alternativamente códigos de modo de video inverso y normal) hasta que el usuario presiona una tecla.

flasher () { while true; do printf \\e[?5h; sleep 0.1; printf \\e[?5l; read -s -n1 -t1 && break; done; }

Esto se puede usar para alertar a un programador cuando termina un comando largo, como con make ; flasher.

printf \\033c

Esto reiniciará la consola, similar al comando reseten los sistemas Linux modernos; sin embargo, debería funcionar incluso en sistemas Linux más antiguos y en otras variantes de UNIX (no Linux).

C ª

Salida del programa de ejemplo en Gnome Terminal
#include <stdio.h>

int main(void)
{
  int i, j, n;
  
  for (i = 0; i < 11; i++) {
    for (j = 0; j < 10; j++) {
      n = 10*i + j;
      if (n > 108) break;
      printf("\033[%dm %3d\033[m", n, n);
    }
    printf("\n");
  }
  return 0;
}

Secuencias de entrada de terminales

Presionar teclas especiales en el teclado, así como generar muchas secuencias xterm CSI, DCS u OSC, a menudo produce una secuencia CSI, DCS u OSC, enviada desde el terminal a la computadora como si el usuario la hubiera escrito.

Al escribir una entrada en un terminal, las pulsaciones de teclas fuera del área del teclado alfanumérico principal normal se pueden enviar al host como secuencias ANSI. Para las teclas que tienen una función de salida equivalente, como las teclas del cursor, estas suelen reflejar las secuencias de salida. Sin embargo, para la mayoría de las pulsaciones de teclas no hay una secuencia de salida equivalente para usar.

Hay varios esquemas de codificación y, desafortunadamente, la mayoría de los terminales mezclan secuencias de diferentes esquemas, por lo que el software anfitrión debe poder manejar secuencias de entrada usando cualquier esquema. Para complicar el asunto, los propios terminales VT tienen dos esquemas de entrada, modo normal y modo de aplicación que pueden ser conmutados por la aplicación.

(borrador de la sección)

<char>                                -> char
<esc> <nochar>                        -> esc
<esc> <esc>                           -> esc
<esc> <char>                          -> Alt-keypress or keycode sequence
<esc> '[' <nochar>                    -> Alt-[
<esc> '[' (<num>) (';'<num>) '~'      -> keycode sequence, <num> defaults to 1

Si el carácter de terminación es '~', el primer número debe estar presente y es un número de código clave, el segundo número es un valor modificador opcional. Si el carácter final es una letra, la letra es el valor del código clave y el número opcional es el valor del modificador.

El valor predeterminado del modificador es 1, y después de restar 1 hay un mapa de bits de las teclas modificadoras que se presionan: Meta-Ctrl-Alt-Shift. Entonces, por ejemplo, <esc> [4; 2 ~ es Shift-End, <esc> [20 ~ es la tecla de función 9, <esc> [5C es Ctrl-Right.

vt sequences:
<esc>[1~    - Home        <esc>[16~   -             <esc>[31~   - F17
<esc>[2~    - Insert      <esc>[17~   - F6          <esc>[32~   - F18
<esc>[3~    - Delete      <esc>[18~   - F7          <esc>[33~   - F19
<esc>[4~    - End         <esc>[19~   - F8          <esc>[34~   - F20
<esc>[5~    - PgUp        <esc>[20~   - F9          <esc>[35~   - 
<esc>[6~    - PgDn        <esc>[21~   - F10         
<esc>[7~    - Home        <esc>[22~   -             
<esc>[8~    - End         <esc>[23~   - F11         
<esc>[9~    -             <esc>[24~   - F12         
<esc>[10~   - F0          <esc>[25~   - F13         
<esc>[11~   - F1          <esc>[26~   - F14         
<esc>[12~   - F2          <esc>[27~   -             
<esc>[13~   - F3          <esc>[28~   - F15         
<esc>[14~   - F4          <esc>[29~   - F16         
<esc>[15~   - F5          <esc>[30~   -

xterm sequences:
<esc>[A     - Up          <esc>[K     -             <esc>[U     -
<esc>[B     - Down        <esc>[L     -             <esc>[V     -
<esc>[C     - Right       <esc>[M     -             <esc>[W     -
<esc>[D     - Left        <esc>[N     -             <esc>[X     -
<esc>[E     -             <esc>[O     -             <esc>[Y     -
<esc>[F     - End         <esc>[1P    - F1          <esc>[Z     -
<esc>[G     - Keypad 5    <esc>[1Q    - F2       
<esc>[H     - Home        <esc>[1R    - F3       
<esc>[I     -             <esc>[1S    - F4       
<esc>[J     -             <esc>[T     - 

<esc> [A a <esc> [D son las mismas que las secuencias de salida ANSI. El <num> normalmente se omite si no se presionan teclas modificadoras, pero la mayoría de las implementaciones siempre emiten el <num> para F1-F4. (borrador de la sección)

Xterm tiene una página de documentación completa sobre los diversos esquemas de secuencia de entrada de teclas de función y mouse de los terminales VT de DEC y varios otros terminales que emula. Thomas Dickey le ha agregado mucho apoyo a lo largo del tiempo; También mantiene una lista de claves predeterminadas utilizadas por otros emuladores de terminal para comparar.

  • En la consola de Linux, ciertas teclas de función generan secuencias del formulario . La secuencia CSI debe terminar en .CSI [ char[
  • Las versiones antiguas de Terminator se generan cuando se presionan F1 – F4 con modificadores. El comportamiento defectuoso se copió de GNOME Terminal .SS3 1; modifiers char
  • xterm responde si se le pregunta por la posición del cursor y si se presiona la tecla F3 con modificadores, que colisionan en el caso de la fila == 1. Esto se puede evitar usando ? modificador privado como , que se reflejará en la respuesta como .CSI row ; column RCSI 1 ; modifiers RCSI ? 6 nCSI ? row ; column R
  • muchas terminales anteponen ESCcualquier carácter que se escriba con la tecla alt presionada. Esto crea ambigüedad para letras mayúsculas y símbolos @[\]^_, que formarían códigos C1.
  • Konsole genera cuando se presionan F1 – F4 con modificadores.SS3 modifiers char

Ver también

Notas

Referencias

enlaces externos