Las secuencias de escape ANSI son un estándar de señalización en banda para controlar la posició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 comenzando con un carácter de escape ASCII y un corchete , se insertan en el texto. El terminal interpreta estas secuencias como comandos, en lugar de texto para mostrar literalmente. Los códigos ANSI pueden cambiar el color del texto y mover el cursor para que el texto se pueda dibujar en cualquier parte de la pantalla.
Las secuencias ANSI se introdujeron en la década de 1970 para reemplazar las secuencias específicas de cada fabricante y se generalizaron en el mercado de equipos informáticos a principios de la década de 1980. Si bien los terminales de texto de hardware son cada vez más raros en el siglo XXI, la relevancia del estándar ANSI persiste porque la gran mayoría de los emuladores de terminales y consolas de comandos interpretan al menos una parte de dicho estándar.
ANSI son las siglas de " Instituto Nacional Estadounidense de Estándares ".
Historia
Casi todos los fabricantes de terminales de vídeo añadieron secuencias de escape específicas del proveedor para realizar operaciones como colocar el cursor en posiciones arbitrarias de la pantalla. Un ejemplo es el terminal VT52 , que permitía colocar el cursor en una ubicación x,y de la pantalla enviando el ESCcarácter, un Ycarácter y luego dos caracteres que representaban valores numéricos iguales a la ubicación x,y más 32 (empezando así por el carácter de espacio ASCII y evitando los caracteres de control). El Hazeltine 1500 tenía una función similar, que se activaba usando ~, DC1y luego las posiciones X e Y separadas por una coma. Si bien ambos terminales tenían una funcionalidad idéntica en este sentido, se debían usar secuencias de control diferentes para activarlas.
Dado que estas secuencias variaban según el terminal, fue necesario crear bibliotecas complejas como termcap ("capacidades del terminal") y utilidades como tput para que los programas pudieran usar la misma API y funcionar con cualquier terminal. Además, muchos de estos terminales requerían enviar números (como fila y columna) como valores binarios de los caracteres; para algunos lenguajes de programación y para sistemas que no utilizaban ASCII internamente, a menudo resultaba 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 transmitiera como números ASCII. El primer estándar de la serie fue ECMA-48 , adoptado en 1976. [ 1 ] Fue una continuación de una serie de estándares de codificación de caracteres, el primero de los cuales fue ECMA-6 de 1965, un estándar de 7 bits 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. [ 1 ] En 1994, ANSI retiró su estándar a favor del estándar internacional.

El primer terminal de vídeo popular que admitía estas secuencias fue el Digital VT100 , presentado en 1978. [ 2 ] Este modelo tuvo mucho éxito en el mercado, lo que dio lugar a una variedad de clones del VT100, entre los que se encontraba el Zenith Z-19, mucho más asequible, lanzado en 1979. [ 3 ] Otros incluyeron el Qume QVT-108, el Televideo TVI-970, el Wyse WY-99GT, así como modos opcionales "VT100", "VT103" o "ANSI" con distintos grados de compatibilidad en muchas otras marcas. La popularidad de estos llevó gradualmente a que cada vez más software (especialmente sistemas de tablones de anuncios y otros servicios en línea ) asumiera que las secuencias de escape funcionaban, lo que provocó que casi todos los nuevos terminales y programas emuladores las admitieran.
En 1981, la norma ANSI X3.64 fue adoptada para su uso en el gobierno de EE. UU. mediante la publicación FIPS 86. Posteriormente, el gobierno de EE. UU. dejó de duplicar estándares industriales, por lo que la publicación FIPS 86 fue retirada. [ 4 ]
ECMA-48 se ha actualizado varias veces y actualmente está en su quinta edición, de 1991. [ 5 ] También ha sido adoptada por ISO e IEC como norma ISO/IEC 6429. [ 6 ] Una versión ha sido adoptada como norma industrial japonesa , como JIS X 0211 .
Entre las normas relacionadas se incluyen la ITU T.61 , la norma Teletex , y la ISO/IEC 8613 , la norma Open Document Architecture (principalmente ISO/IEC 8613-6 o ITU T.416). Ambos sistemas comparten muchos códigos de escape con el sistema ANSI, con extensiones que no necesariamente tienen significado para las terminales informáticas. Ambos sistemas cayeron rápidamente en desuso, pero la norma ECMA-48 marca las extensiones utilizadas en ellos como reservadas.
Soporte de plataforma

A principios de la década de 1980, gran cantidad de software utilizaba directamente estas secuencias para actualizar las pantallas. Esto incluía todo el software de VMS (que asumía terminales DEC), la mayoría del software diseñado para ser portable en ordenadores domésticos con CP/M y una cantidad considerable de software de Unix, ya que era más fácil de usar que las bibliotecas termcap.
Los emuladores de terminal para comunicarse con máquinas remotas casi siempre implementan códigos de escape ANSI. Esto incluye cualquier código escrito para comunicarse con sistemas de tablón de anuncios en ordenadores domésticos y personales. En Unix, los emuladores de terminal como xterm también pueden comunicarse con software que se ejecuta en la misma máquina, por lo que el software que se ejecuta en X11 bajo un emulador de terminal podría asumir la capacidad de escribir estas secuencias.
A medida que las computadoras se volvieron más potentes, incluso las pantallas integradas comenzaron a admitirlas, lo que permitió que el software fuera portable entre sistemas CP/M. Hubo intentos de extender las secuencias de escape para admitir impresoras [ 7 ] y como un formato de almacenamiento de documentos temprano similar a PDF, la Open Document Architecture .
El IBM PC, lanzado en 1981, no admitía estas ni ninguna otra secuencia de escape para actualizar la pantalla. Solo unos pocos caracteres de control ( BEL , CR , LF , BS ) eran interpretados por la BIOS subyacente. Cualquier efecto de visualización debía realizarse mediante llamadas a la BIOS, que eran notoriamente lentas, o manipulando directamente el hardware del IBM PC. Esto hacía que cualquier software interesante no fuera portable y conllevaba la necesidad de duplicar detalles del hardware de visualización en los clones de PC .
La versión 2.0 de DOS incluía un controlador de dispositivo opcional llamado ANSI.SYS . Su bajo rendimiento y el hecho de que no viniera instalado por defecto hacían que el software rara vez (o nunca) lo aprovechara.
La consola de Windows no admitía secuencias de escape ANSI, ni Microsoft proporcionó ningún método para habilitarlas. Algunos reemplazos, como TCC de JP Software (anteriormente 4NT), ANSI.COM de Michael J. Mefford, ANSICON de Jason Hood [ 8 ] y ConEmu de Maximus5, habilitaron secuencias de escape ANSI. Software como el paquete Python colorama [ 9 ] o Cygwin modificaban el texto en el proceso a medida que se enviaba a la consola, extrayendo las secuencias de escape ANSI y emulándolas con llamadas de Windows. En 2016, Microsoft lanzó la actualización de Windows 10 versión 1511 que implementó inesperadamente la compatibilidad con secuencias de escape ANSI, más de tres décadas después del debut de Windows. [ 10 ] Esto se hizo junto con el Subsistema de Windows para Linux , aparentemente para permitir que el software basado en terminales tipo Unix utilizara la consola de Windows. Windows PowerShell 5.1 lo habilitó de forma predeterminada, y PowerShell 6 hizo posible incrustar el carácter ESC necesario en una cadena con . [ 11 ] Windows Terminal , introducido en 2019, admite las secuencias de forma predeterminada. [ 12 ] Desde Windows 11 22H2 y Windows Terminal 1.15, Windows Terminal reemplaza a Windows Console como predeterminado. [ 13 ] [ 14 ]`e
Códigos de control C0
Casi todos los usuarios utilizan caracteres de un solo byte para ciertas funciones. Inicialmente definido como parte de ASCII, el conjunto de códigos de control C0 predeterminado ahora está definido en ISO 6429 (ECMA-48), lo que lo convierte en parte del mismo estándar que el conjunto C1 invocado por las secuencias de escape ANSI (aunque ISO 2022 permite usar el conjunto C0 de ISO 6429 sin el conjunto C1 de ISO 6429, y viceversa , siempre que 0x1B sea siempre ESC). Esto se utiliza para acortar la cantidad de datos transmitidos o para realizar algunas funciones que no están disponibles en 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). [ 15 ] : 13.1 Las secuencias de escape constan únicamente de bytes en el rango 0x20—0x7F (todos los caracteres ASCII que no son de control) y pueden analizarse sin mirar hacia adelante. El comportamiento cuando se encuentra un carácter de control, un byte con el bit más significativo activado o un byte que no forma parte de ninguna secuencia válida antes del final no está definido.
Secuencias de escape de Fe
Si le ESCsigue un byte en el rango 0x40 a 0x5F, la secuencia de escape es de tipo Fe. Su interpretación se delega al estándar de código de control C1 aplicable . [ 15 ] : 13.2.1 En consecuencia, todas las secuencias de escape correspondientes a los códigos de control C1 de ANSI X3.64 / ECMA-48 siguen este formato. [ 16 ] : 5.3.a
El estándar dice que, en entornos de 8 bits, las funciones de control correspondientes a Fesecuencias de escape de tipo (las del conjunto de códigos de control C1 ) pueden representarse como bytes individuales en el rango 0x80–0x9F. [ 16 ] : 5.3.b Esto es posible en codificaciones de caracteres que cumplen con las disposiciones para un código de 8 bits hechas en ISO 2022, como la serie ISO 8859. Sin embargo, en codificaciones de caracteres utilizadas en dispositivos modernos como UTF-8 o CP-1252 , esos códigos se utilizan a menudo para otros propósitos, por lo que normalmente solo se utiliza la secuencia de 2 bytes. En el caso de UTF-8, representar un código de control C1 a través del bloque Controles C1 y Suplemento Latin-1 da como resultado un código de dos bytes diferente (por ejemplo, 0xC2,0x8E para U+008E ), pero no se ahorra espacio de esta manera.
Comandos del Introductor de Secuencia de Control
Para los comandos del Introductor de Secuencia de Control, o CSI, el ESC [(escrito como \e[, \x1b[o \033[en varios lenguajes de programación) va seguido de cualquier número (incluido ninguno) de "bytes de parámetro" en el rango 0x30–0x3F (ASCII 0–9:;<=>?), luego de cualquier número de "bytes intermedios" en el rango 0x20–0x2F (espacio ASCII y !"#$%&'()*+,-./), y finalmente de un único "byte final" en el rango 0x40–0x7E (ASCII @A–Z[\]^_`a–z{|}~). [ 16 ] : 5.4
Todas las secuencias comunes simplemente usan los parámetros como una serie de números separados por punto y coma, como 1;2;3. [ 16 ] : 5.4.2 Los números faltantes se tratan como 0( 1;;3actúa como si el número del medio fuera 0, y ningún parámetro en absoluto ESC[mactúa como un 0código de reinicio). Algunas secuencias (como CUU) tratan 0como 1para que los parámetros faltantes sean útiles. [ 16 ] : F.4.2
Se declaró un subconjunto de configuraciones como "privadas" para que los fabricantes de terminales pudieran insertar sus propias secuencias sin entrar en conflicto con el estándar. Las secuencias que contienen los bytes de parámetros <=>?o los bytes finales 0x70–0x7E ( p–z{|}~) son privadas.
El comportamiento del terminal es indefinido cuando una secuencia CSI contiene algún carácter fuera del rango 0x20–0x7E. Estos caracteres no válidos son caracteres de control C0 (rango 0–0x1F), DEL (0x7F) o bytes con el bit más significativo activado. Las posibles respuestas son ignorar el byte, procesarlo inmediatamente y, además, continuar con la secuencia CSI, abortarla inmediatamente o ignorar el resto.
Seleccione los parámetros de representación gráfica.
La secuencia de control , denominada Selección de 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. [ 25 ] Cada atributo de visualización permanece activo hasta que una ocurrencia posterior de SGR lo restablece. [ 16 ] Si no se proporcionan códigos, se trata como (restablecido/normal).CSI n mCSI mCSI 0 m
Bandera
3 bits y 4 bits
La especificación original solo tenía 8 colores y simplemente les daba nombres. Los parámetros SGR 30–37 seleccionaban el color de primer plano, mientras que 40–47 seleccionaban el fondo. Bastantes terminales implementaban "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. Normalmente no se podían obtener como colores de fondo, aunque a veces el vídeo inverso (código SGR 7) lo permitía. Ejemplos: para obtener letras negras sobre fondo blanco use ESC[30;47m, para obtener rojo use ESC[31m, para obtener rojo brillante use ESC[1;31m. Para restablecer los colores a sus valores predeterminados, use ESC[39;49m(no compatible con algunos terminales), o restablezca todos los atributos con ESC[0m. Los terminales posteriores añadieron la capacidad de especificar directamente los colores "brillantes" con 90–97 y 100–107.
El siguiente gráfico muestra algunos ejemplos de cómo los estándares clásicos y los emuladores de terminales modernos traducen los códigos de color de 4 bits a códigos de color de 24 bits.
8 bits
A medida que las tablas de búsqueda de 256 colores se hicieron comunes en las tarjetas gráficas, se agregaron secuencias de escape para seleccionar de un conjunto predefinido de 256 colores: [ 36 ]
ESC[38;5; ⟨ n ⟩ m Seleccione el color de primer plano donde n es un número de la tabla siguiente ESC[48;5; ⟨ n ⟩ m Seleccionar color de fondo 0-7: colores estándar (como en ESC [30–37 m) 8-15: colores de alta intensidad (como en ESC [90–97 m) 16-231: Cubo de 6 × 6 × 6 (216 colores): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5) 232-255: escala de grises de oscuro a claro en 24 pasos
Los colores mostrados por estos valores varían según las implementaciones de terminal/emulador, ya que las especificaciones reconocidas ECMA-48 y T.416 de la UIT no definen una paleta de colores específica para esta tabla de búsqueda. Si bien es común usar la fórmula anterior para la paleta de colores, en particular el algoritmo y la selección de colores para los valores del cubo 16-231 difieren entre las implementaciones. La paleta de colores y el algoritmo utilizados por XTerm se especifican a continuación a modo de ejemplo. [ 16 ] [ 37 ]
La norma T.416 de la UIT sobre tecnología de la información: arquitectura de documentos abiertos (ODA) y formato de intercambio: arquitecturas de contenido de caracteres [ 37 ] utiliza ":" como caracteres separadores en su lugar:
ESC[38:5: ⟨ n ⟩ m Seleccione el color de primer plano donde n es un número de la tabla siguiente ESC[48:5: ⟨ n ⟩ m Seleccionar color de fondo
Para calcular los valores RGB de los colores de la tabla anterior, se puede utilizar el siguiente script de Python :
# Imprime una lista de los 256 valores de color rojo/verde/azul utilizados por xterm.## referencia:# https://github.com/ThomasDickey/ncurses-snapshots/blob/master/test/xterm-16color.dat# https://github.com/ThomasDickey/xterm-snapshots/blob/master/XTerm-col.ad# https://github.com/ThomasDickey/xterm-snapshots/blob/master/256colres.plprint ( "Los colores del 0 al 15 corresponden a la nomenclatura ANSI y aixterm" )para el código en el rango ( 0 , 16 ):Si el código es mayor que 8 :nivel = 255elif código == 7 :nivel = 229demás :nivel = 205r = 127 si código == 8 sino nivel si ( código & 1 ) != 0 sino 92 si código == 12 sino 0g = 127 si código == 8 sino nivel si ( código & 2 ) != 0 sino 92 si código == 12 sino 0b = 127 si código == 8 sino 238 si código == 4 sino nivel si ( código & 4 ) != 0 sino 0print ( f " { code : 3d } : { r : 02X } { g : 02X } { b : 02X } " )imprimir ( "los colores 16-231 forman un cubo de color de 6x6x6" )para rojo en rango ( 0 , 6 ):para verde en rango ( 0 , 6 ):para azul en rango ( 0 , 6 ):código = 16 + ( rojo * 36 ) + ( verde * 6 ) + azulr = rojo * 40 + 55 si rojo != 0 sino 0g = verde * 40 + 55 si verde != 0 si no 0b = azul * 40 + 55 si azul != 0 si no 0print ( f " { code : 3d } : { r : 02X } { g : 02X } { b : 02X } " )imprimir ( "los colores 232-255 son una rampa de escala de grises, omitiendo intencionalmente el blanco y el negro" )para gris en rango ( 0 , 24 ):nivel = gris * 10 + 8código = 232 + grisprint ( f " { code : 3d } : { level : 02X } { level : 02X } { level : 02X } " )También ha habido una codificación de 88 colores similar pero incompatible que utiliza la misma secuencia de escape, vista en rxvty xterm-88color. [ 38 ] 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 hicieron comunes, las aplicaciones comenzaron a admitir colores de 24 bits. Los emuladores de terminal que admiten la configuración de colores de primer plano y fondo de 24 bits con secuencias de escape incluyen Xterm, [ 17 ] Konsole de KDE , [ 39 ] [ 40 ] e iTerm, así como todos los terminales basados en libvte, [ 41 ] incluyendo GNOME Terminal . [ 42 ]
ESC[38;2; ⟨ r ⟩ ; ⟨ g ⟩ ; ⟨ b ⟩ m Seleccionar color de primer plano RGB ESC[48;2; ⟨ r ⟩ ; ⟨ g ⟩ ; ⟨ b ⟩ m Seleccionar color de fondo RGB
Esta sintaxis, implementada inicialmente en XTerm, se basa en la especificación ISO/IEC 8613-6, específicamente en que SGR 38 / SGR 48 seguido del parámetro "2" puede especificar un "color directo" en el espacio RGB. [ 43 ] . Como primera implementación ampliamente utilizada, esta especificación de valores RGB con separadores de punto y coma es ampliamente compatible con emuladores de terminal que incluyen soporte para color de 24 bits.
Al igual que con los códigos de color de 8 bits , existe una especificación muy similar de color de 24 bits en la arquitectura de documentos abiertos (ODA) T.416 de la UIT y en el formato de intercambio: arquitecturas de contenido de caracteres, [ 37 ] que fue adoptada como ISO/IEC 8613-6 pero terminó siendo un fracaso comercial. La versión ODA es más elaborada y, por lo tanto, incompatible con la versión anterior separada por punto y coma:
- Los dos puntos se utilizan como separadores, en lugar del punto y coma.
- Los parámetros que aparecen después del '2' (r, g y b) son opcionales y pueden dejarse en blanco.
- Existe un "ID de espacio de color" principal. [ 17 ] La definición del ID de espacio de color no está incluida en esa especificación, por lo que puede estar en blanco para representar el valor predeterminado no especificado. Para las especificaciones de color CMYK, mintty interpreta el parámetro ID de espacio de color como la especificación del valor máximo del cual se obtienen los valores de canal (por ejemplo, 100 o 255). [ 32 ]
- Además del valor '2' después del 48 para especificar un formato Rojo-Verde-Azul (y el '5' anterior para un color indexado de 0 a 255), existen alternativas de '0' para definido por la implementación y '1' para transparente, ninguna de las cuales tiene parámetros adicionales; '3' especifica colores usando un esquema Cian-Magenta-Amarillo, y '4' para uno Cian-Magenta-Amarillo-Negro, este último usando la posición marcada como "no utilizada" para el componente Negro. [ 37 ]
ESC[38:2: ⟨ ID de espacio de color ⟩ : ⟨ r ⟩ : ⟨ g ⟩ : ⟨ b ⟩ : ⟨ no utilizado ⟩ : ⟨ tolerancia CS ⟩ : ⟨ Espacio de color ⟩ m Seleccionar color de primer plano RGB ESC[48:2: ⟨ ID de espacio de color ⟩ : ⟨ r ⟩ : ⟨ g ⟩ : ⟨ b ⟩ : ⟨ no utilizado ⟩ : ⟨ tolerancia CS ⟩ : ⟨ Espacio de color ⟩ m Seleccionar color de fondo RGB
donde Color-Spaceindica el espacio de color asociado con la tolerancia dada: 0para CIELUV o 1para CIELAB.
La especificación RGB basada en punto y coma es la más ampliamente compatible, pero tanto esta como la variante RGB de ITU T.416 son compatibles con muchos emuladores de terminal. [ 44 ] [ 45 ]
Variables de entorno Unix relacionadas con la compatibilidad de colores
En lugar de utilizar la compatibilidad con colores de termcap y terminfo introducida en SVr3.2 (1987), [ 46 ] la biblioteca S-Lang (versión 0.99-32, junio de 1996) utilizó una variable de entorno independiente $COLORTERMpara indicar si un emulador de terminal podía usar colores, y posteriormente añadió valores para indicar si admitía color de 24 bits. [ 47 ] [ 48 ] Este sistema, aunque mal documentado, se generalizó lo suficiente como para que Fedora y RHEL consideraran usarlo como un mecanismo de detección más simple y universal en comparación con la consulta de las bibliotecas ahora actualizadas. [ 49 ]
Algunos emuladores de terminal (urxvt, Konsole) $COLORFGBGinforman sobre el esquema de color de la terminal (principalmente fondo claro o oscuro). Este comportamiento se originó en S-Lang [ 48 ] y lo utiliza vim. Gnome-terminal se niega a añadir este comportamiento, ya que no hay consenso sobre la sintaxis del valor, este no se puede modificar al cambiar la paleta en tiempo de ejecución y ya existen secuencias OSC 4/10/11 de xterm más "adecuadas". [ 50 ]
Se ha vuelto habitual utilizar la NO_COLORvariable de entorno para deshabilitar los colores incondicionalmente. [ 51 ]
Secuencias de comandos del sistema operativo
La mayoría de las secuencias de comandos del sistema operativo fueron definidas por Xterm, pero muchas también son compatibles con otros emuladores de terminal. Por razones históricas, Xterm puede finalizar el comando con BEL(0x07) además del estándar ST(0x9C o 0x1B 0x5C). [ 17 ] Por ejemplo, Xterm permite que el nombre del icono y el título de la ventana se establezcan mediante ESC ]0;this is the title BEL.
Una extensión que no pertenece a xterm es el hipervínculo, ESC ]8;;link STdesde 2017, utilizado por VTE, [ 52 ] iTerm2, [ 52 ] y mintty, [ 53 ] entre otros. [ 54 ]
La consola de Linux utiliza ESC ] P n rr gg bbpara cambiar la paleta, lo que, si está codificado de forma fija en una aplicación, puede bloquear otras terminales. [ 55 ] Sin embargo, STLinux ignorará la adición y formará una secuencia adecuada e ignorada para otras terminales.
Secuencias de escape Fs
Si le ESCsigue un byte en el rango 0x60—0x7E , la secuencia de escape es de tipo . Este tipo se utiliza para funciones de control registradas individualmente con el registro ISO-IR . [ 56 ] Una tabla de estos se encuentra en ISO/IEC 2022 .Fs
Secuencias de escape Fp
Si le ESCsigue un byte en el rango 0x30—0x3F , la secuencia de escape es de tipo , que está reservada para hasta dieciséis funciones de control de uso privado. [ 15 ] : 6.5.3Fp
Secuencias de escape nF
Si le ESCsigue un byte en el rango 0x20—0x2F , la secuencia de escape es de tipo . Dicho byte va seguido de cualquier número de bytes adicionales en este rango, y luego de un byte en el rango 0x30-0x7E . Estas secuencias de escape se subcategorizan además según los dos bits menos significativos del primer byte, por ejemplo, "tipo " para secuencias donde el primer byte es 0x22 ; y según si el byte final está en el rango 0x30—0x3F, lo que indica uso privado (por ejemplo, "tipo ") o no (por ejemplo, "tipo "). [ 15 ] : 13.2.1nF2F2Fp2Ft
La mayoría de las nFtsecuencias sirven para cambiar el conjunto de caracteres actual y se enumeran en ISO/IEC 2022. Algunas otras:
Si el primer byte es '#', las secuencias públicas están reservadas para funciones de control individuales adicionales registradas en ISO-IR. [ 15 ] : 6.5.2 Actualmente no hay secuencias de este tipo registradas. [ 56 ] Las secuencias de tipo 3Fp(que incluyen las que comienzan con '#') están disponibles para funciones de control de uso privado. [ 15 ] : 6.5.3
Ejemplos
CSI 2 J— Esto borra la pantalla y, en algunos dispositivos, coloca 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 apagado, por lo que quizás desee habilitar Negrita con la secuencia CSI 1 mque lo haría verde brillante, o combinado como . Algunas implementaciones usan el estado Negrita para hacer que el carácter sea Brillante.CSI 32 ; 1 m
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. (Solo para MS-DOS ANSI.SYS) Esto se usaba a veces 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 de valor de cadena. Siguiendo la letra del estándar, se consideraría que la secuencia termina en la letra D.
CSI s— Esto guarda la posición del cursor. Al usar la secuencia, CSI use restaurará a la posición original. Por ejemplo, si 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, como 20(y) y 3(x), usando la secuencia o . Si usa la secuencia CSI u, la posición del cursor volverá a 7(y) y 10(x). Algunos terminales requieren la secuencia DEC / en su lugar, que es más compatible.CSI 20 ; 3 HCSI 20 ; 3 fESC 7ESC 8
En la programación de scripts de shell
Los códigos de escape ANSI se utilizan a menudo en terminales UNIX y similares para resaltar la sintaxis . Por ejemplo, en terminales compatibles, el siguiente comando ` list` resalta con colores los nombres de archivos y directorios según su tipo.
ls --color
Los usuarios pueden emplear códigos de escape en sus scripts incluyéndolos como parte de la salida estándar o el error estándar . Por ejemplo, el siguiente comando GNU sed mejora la salida del comando make mostrando las líneas que contienen palabras que comienzan con "WARN" en vídeo inverso y las que comienzan con "ERR" en amarillo brillante sobre un fondo rojo oscuro ( se ignora la distinción entre mayúsculas y minúsculas ). Las representaciones de los códigos se resaltan. [ 61 ]
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 de Bash hace parpadear la terminal (enviando alternativamente códigos de modo de vídeo inverso y normal) hasta que el usuario pulsa una tecla. [ 62 ] Se puede utilizar para alertar a un programador cuando finaliza un comando largo, como con . [ 63 ]make ; flasher
flasher(){whiletrue;doprintf'\e[?5h' '\e[?5l';sleep0.1;printf;read-s-n1-t1&&break;done;}
El siguiente comando reiniciará la consola, de forma 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 (que no sean Linux).
printf '\033c'Cª
El siguiente programa crea una tabla de números del 0 al 109, cada uno de los cuales se muestra en el formato especificado por la secuencia de escape Seleccionar representación gráfica, utilizando ese número como código de representación gráfica.

#include <stdio.h>int principal ( void ){entero fila , columna , n ;para ( fila = 0 ; fila < 11 ; fila ++ ) {para ( col = 0 ; col < 10 ; col ++ ) {n = 10 * fila + columna ;si ( n > 109 ) salir ;printf ( " \033 [%dm %3d \033 [m" , n , n );}printf ( " \n " );}devolver 0 ;}Secuencias de entrada terminal
Al pulsar teclas especiales del teclado, así como al generar numerosas secuencias CSI, DCS u OSC de xterm, se suele producir una secuencia CSI, DCS u OSC que se envía desde el terminal al ordenador como si el usuario la hubiera tecleado.
Al introducir datos en una terminal, las pulsaciones de teclas fuera del área alfanumérica principal pueden enviarse al host como secuencias ANSI. Para las teclas que tienen una función de salida equivalente, como las teclas de cursor, estas suelen reflejar las secuencias de salida. Sin embargo, para la mayoría de las pulsaciones de teclas no existe una secuencia de salida equivalente.
Existen varios esquemas de codificación y, lamentablemente, la mayoría de los terminales combinan secuencias de diferentes esquemas, por lo que el software anfitrión debe ser capaz de procesar secuencias de entrada independientemente del esquema. Para complicar aún más las cosas, los propios terminales VT cuentan con dos esquemas de entrada: modo normal y modo de aplicación , que pueden ser alternados por la aplicación.
(sección preliminar)
<char> -> char <esc> -> esc <esc> <esc> -> Alt-esc <esc> <char> -> Pulsación de la tecla Alt o secuencia de código de tecla <esc> '[' -> Alt-[ <esc> '[' (<modificador>) <carácter> -> secuencia de código de tecla, <modificador> es un decimal número y por defecto es 1 (xterm) <esc> '[' (<keycode>) (';'<modifier>) '~' -> secuencia de teclas, <keycode> y <modifier> son números decimales y por defecto son 1 (vt) Si el carácter de terminación es '~', el primer número debe estar presente y corresponde a un código de tecla; el segundo número es un modificador opcional. Si el carácter de terminación es una letra, esta letra corresponde al código de tecla y el número opcional es el modificador.
El valor del modificador por defecto es 1, y después de restar 1 es un mapa de bits de las teclas modificadoras que se están presionando: Meta+ Ctrl+ Alt+⇧ Shift . Así que, por ejemplo, <esc>[4;2~es + , es la tecla de función , es + .⇧ ShiftEnd<esc>[20~F9<esc>[5CCtrl→
En otras palabras, el modificador es la suma de los siguientes números:
Secuencias vt: <esc>[1~ - Inicio <esc>[16~ - <esc>[31~ - F17 <esc>[2~ - Insertar <esc>[17~ - F6 <esc>[32~ - F18 <esc>[3~ - Eliminar <esc>[18~ - F7 <esc>[33~ - F19 <esc>[4~ - Fin <esc>[19~ - F8 <esc>[34~ - F20 <esc>[5~ - AvPág <esc>[20~ - F9 <esc>[35~ - <esc>[6~ - AvPág <esc>[21~ - F10 <esc>[7~ - Inicio <esc>[22~ - <esc>[8~ - Fin <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~ - Secuencias xterm: <esc>[A - Arriba <esc>[K - <esc>[U - <esc>[B - Abajo <esc>[L - <esc>[V - <esc>[C - Derecha <esc>[M - <esc>[W - <esc>[D - Izquierda <esc>[N - <esc>[X - <esc>[E - <esc>[O - <esc>[Y - <esc>[F - Fin <esc>OP - F1 <esc>[Z - <esc>[G - Teclado 5 <esc>OQ - F2 <esc>[H - Inicio <esc>O - F3 <esc>[Yo - <esc>OS - F4 <esc>[J - <esc>[T -
<esc>[Ason <esc>[Diguales a las secuencias de salida ANSI. <modifier>Normalmente se omite si no se presionan teclas modificadoras, pero la mayoría de las implementaciones siempre emiten <modifier>para – . (sección preliminar)F1F4
Xterm cuenta con una página de documentación completa sobre los diversos esquemas de secuencias de entrada de teclas de función y ratón de los terminales VT de DEC y otros terminales que emula. [ 17 ] Thomas Dickey ha añadido mucho soporte con el tiempo; [ 64 ] también mantiene una lista de teclas predeterminadas utilizadas por otros emuladores de terminales para su comparación. [ 65 ]
- En la consola de Linux, ciertas teclas de función generan secuencias de la forma . La secuencia CSI debería terminar en .
CSI [ char[ - Las versiones antiguas de Terminator se generan cuando se presiona – con modificadores. El comportamiento defectuoso se copió de GNOME Terminal .
SS3 1; modifierscharF1F4 - xterm responde si se le pide la posición del cursor y si se presiona la tecla con modificadores, que entran en conflicto en el caso de . Esto se puede evitar usando el modificador privado ? como , que se reflejará en la respuesta como .
CSI row ; column RCSI 1 ; modifiers RF3row == 1CSI ? 6 nCSI ? row ; column R - Muchos terminales anteponen
ESCun carácter a cualquier otro que se escriba con la tecla Alt presionada. Esto genera ambigüedad para las letras mayúsculas y los símbolos@[\]^_, que formarían códigos C1. - Konsole se genera cuando se presionan las teclas – con modificadores.
SS3 modifierscharF1F4 - Algunos terminales, incluidos iTerm2 y kitty , admiten la notificación de claves adicionales a través de un modo CSI u mejorado. [ 66 ] [ 67 ]
Véase también
Notas
- ↑ Tenga en cuenta que algunas letras n y m aparecen en cursiva; se trata de marcadores de posición para parámetros numéricos, no de caracteres literales.
- ↑ Visto en la ventana del shell de DOS (no en pantalla completa) ejecutándose en Windows 3.x hasta cmd.exe en Windows 8.1
- ↑ El acceso directo predeterminado de PowerShell , .lnk , sin cambios durante más de una década, reasigna el amarillo y el magenta para darle a PowerShell colores de primer plano/fondo distintivos en comparación con el Símbolo del sistema. [ 33 ] PowerShell 7 no se ve afectado.
- ↑ Consola de depuración, tema "Dark+"
- ↑ Tema Campbell, utilizado a partir de la versión 1709 de Windows 10.
- ↑ Para terminales virtuales, desde /etc/vtrgb.
Referencias
- 1 2 "Estándar ECMA-48: Funciones de control para dispositivos de E/S de imágenes de caracteres" (PDF) (Segunda edición). Ecma International . Agosto de 1979. Breve historia.
- ↑ Williams, Paul (2006). "Terminales de vídeo digitales" . VT100.net . Consultado el 17 de agosto de 2011 .
- ↑ Heathkit Company (1979). "Catálogo Heathkit 1979" . Heathkit Company. Archivado del original el 13 de enero de 2012. Recuperado el 4 de noviembre de 2011 .
- ↑ "Lista de FIPS retiradas por número" (PDF) . Instituto Nacional de Estándares y Tecnología . 15 de diciembre de 2016. Consultado el 2 de enero de 2022 .
- ↑ "ECMA-48 — Funciones de control para conjuntos de caracteres codificados" . ECMA International .
- ↑ ISO/IEC 6429:1992 — Tecnología de la información — Funciones de control para conjuntos de caracteres codificados . ISO .
- ↑ "Dispositivo de impresora" . Wiki de documentación de AmigaOS . Definiciones de comandos de impresora . Consultado el 10 de julio de 2013 .
- ↑ Hood, Jason (2005). "Procesar secuencias de escape ANSI para programas de consola de Windows" . Página principal de Jason Hood . Consultado el 9 de mayo de 2013 .
- ↑ "colorama · PyPI" . Índice de paquetes de Python . Consultado el 27 de febrero de 2022 .
- ↑ bitcrazed. "Secuencias de terminal virtual de consola - Consola de Windows" . docs.microsoft.com . Consultado el 30 de mayo de 2018 .
- ↑ "Ayuda de PowerShell: Acerca de los caracteres especiales" . 12 de enero de 2023.
- ↑ "Hoja de ruta del ecosistema de consola y terminal de Windows" . Microsoft. 2018. Consultado el 13 de marzo de 2021.
Esto incluye retirar la interfaz de usuario clásica del host de la consola de su posición predeterminada en favor de Windows Terminal, ConPTY y secuencias de terminal virtual.
- ↑ "Windows Terminal ahora es la opción predeterminada en Windows 11" . 18 de octubre de 2022.
- ↑ "Símbolo del sistema y Windows PowerShell para Windows 11" .
- 1 2 3 4 5 6 7 8 9 "Estándar ECMA-35: Estructura del código de caracteres y técnicas de extensión" (PDF) (Sexta ed.). Ecma International . 1994.
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 "Estándar ECMA-48: Funciones de control para conjuntos de caracteres codificados" (PDF) (Quinta ed.). Ecma International . Junio de 1991.
- 1 2 3 4 5 6 7 8 9 10 11 12 13 Moy, Edward; Gildea, Stephen; Dickey, Thomas (2019). "Secuencias de control XTerm (ctlseqs)" . Isla invisible .
- ↑ Frank da Cruz; Christine Gianone (1997). Uso de C-Kermit . Digital Press. pág. 278. ISBN 978-1-55558-164-0.
- ↑ "SCOSC—Guardar la posición actual del cursor" . Información del programador del terminal de vídeo VT510 . DIC .
- ↑ "DECSLRM: Establecer márgenes izquierdo y derecho" . Información del programador del terminal de vídeo VT510 . DEC .
- ↑ "SCORC: Restaurar la posición del cursor guardada" . Información del programador del terminal de vídeo VT510 . DIC .
- ↑ Moy, Edward; Gildea, Stephen; Dickey, Thomas. "Secuencias de control de XTerm" . Funciones que utilizan CSI, ordenadas por el/los carácter(es) final(es) . Consultado el 4 de febrero de 2022 .
- ↑ Conrad Irwin (abril de 2013). "modo de pegado entre corchetes " . cirw.in.
- ↑ Moy, Edward; Gildea, Stephen; Dickey, Thomas. "Secuencias de control de XTerm" . Modo de pegado entre corchetes . Consultado el 4 de febrero de 2022 .
- ↑ "console_codes(4) - Página del manual de Linux" . man7.org . Consultado el 23 de marzo de 2018 .
- 1 2 "screen(HW)" . Manual de SCO OpenServer versión 5.0.7 . 11 de febrero de 2003.
- ↑ "Bug 791596 – Reflexiones sobre el desmayo (SGR 2)" . bugzilla.gnome.org .
- 1 2 3 "Subrayados rizados y de colores (#6382) · Problemas · George Nachman / iterm2" . GitLab . 11 de diciembre de 2017.
- 1 2 3 "Extensiones al protocolo xterm" . Documentación de kitty . Consultado el 1 de julio de 2020 .
- ↑ "387811 - Subrayados rizados y de colores" . Rastreador de errores de KDE . 27 de agosto de 2022.
- ↑ "console_codes(4)" . Manual del programador de Linux . 5.10. Proyecto de páginas man de Linux .
- 1 2 3 "mintty/mintty: Atributos de texto y representación" . GitHub .
- ↑ "El acceso directo predeterminado en Windows reasigna los colores ANSI 35,36 · Problema n.° 4266 · PowerShell/PowerShell" . GitHub . Consultado el 21 de diciembre de 2022 .
- ↑ Cambiado de 0,0,205 en julio de 2004 "Parche n.º 192 – 12/7/2004 – XFree86 4.4.99.9" .
- ↑ Cambiado de 0,0,255 en julio de 2004 "Parche n.º 192 – 12/7/2004 – XFree86 4.4.99.9" .
- ↑ Dickey, Thomas E. "Preguntas frecuentes de XTerm: ¿Puedo establecer un color por su número?" . Consultado el 28 de marzo de 2025 .
- 1 2 3 4 "T.416 Tecnología de la información - Arquitectura de documentos abiertos (ODA) y formato de intercambio: arquitecturas de contenido de caracteres" .
- ↑ Dickey, Thomas E. "Preguntas frecuentes sobre Ncurses: ¿Por qué no equiparar "xterm" con "xterm-256color"?" . Consultado el 28 de marzo de 2025 .
- ↑ "color-spaces.pl (una copia de 256colors2.pl de xterm con fecha 1999-07-11)" . KDE. 6 de diciembre de 2006.
- ↑ "README.másColores" . KDE. 22 de abril de 2010.
- ↑ "Informe de errores y parches de libvte: Compatibilidad con 16 millones de colores" . GNOME Bugzilla. 4 de abril de 2014. Consultado el 5 de junio de 2016 .
- ↑ "¿Cómo habilitar la compatibilidad con color verdadero de 24 bits en la terminal de Gnome?" .
- ↑ "Preguntas frecuentes sobre cursos: ¿Por qué solo 16 (o 256) colores?" .
- ↑ Kochkov, Anton (21 de agosto de 2015). " [ slang-users ] Re: Compatibilidad con secuencias de escape de color verdadero (color de 24 bits)" . slang-users (Lista de correo) . Consultado el 15 de noviembre de 2025 .
- ↑ Martin Kealey (ed.). "termstandard/colors" . GitHub . Consultado el 16 de noviembre de 2025 .
- ↑ "Historial". curs_color(3X) - manipula los colores de la terminal con curses .
- ↑ "Midnight Commander: lib/tty/color-slang.c" . Fossies . Archivado del original el 13 de febrero de 2022. Consultado el 13 de febrero de 2022 .
- 1 2 Dickey, Thomas E. (2017). "NCURSES — comentarios sobre S-Lang" . invisible-island.net .
- ↑ "Características/Terminales de 256 colores - Wiki del proyecto Fedora" . Proyecto Fedora . Archivado del original el 4 de octubre de 2012.
- ↑ "Error 733423: configure la variable de entorno COLORFGBG para la detección automática de color" . bugzilla.gnome.org .
- ↑ "NO_COLOR" . no-color.org .
- 1 2 Koblinger, Egmont. "Hipervínculos (también conocidos como anclas tipo HTML) en emuladores de terminal" . GitHub Gists .
- ↑ "mintty/mintty: Secuencias de control" . GitHub .
- ↑ Koblinger, Egmont. "Adopción de OSC 8 en emuladores de terminal" . GitHub .
- ↑ "console_codes — Secuencias de escape y control de la consola de Linux" . Manual del programador de Linux .
- 1 2 ISO-IR: Registro internacional ISO/IEC de conjuntos de caracteres codificados para ser utilizados con secuencias de escape (PDF) . ITSCJ/ IPSJ . Archivado del original (PDF) el 12 de mayo de 2023. Recuperado el 12 de mayo de 2023 .
- 1 2 Digital . "DECSC—Guardar cursor" . Información del programador del terminal de vídeo VT510 .
- 1 2 Secuencias de escape ANSI - VT100 / VT52 , archivadas del original el 27 de febrero de 2009 , recuperadas el 21 de agosto de 2020.
- ↑ Digital . "DECSWL: Línea de ancho y altura simples" . Información del programador del terminal de vídeo VT510 .
- ↑ Digital . "DECDWL: Línea de doble ancho y altura simple" . Información del programador del terminal de vídeo VT510 .
- ↑ "Capítulo 9. Consejos del sistema" . debian.org .
- ↑ "VT100.net: Guía del usuario digital del VT100" . Consultado el 19 de enero de 2015 .
- ↑ "bash – Cómo recibir una notificación cuando mis comandos hayan terminado – Ask Different" . Consultado el 19 de enero de 2015 .
- ↑ Dickey, Thomas. "Preguntas frecuentes sobre XTerm: Comparación de versiones mediante el recuento de controles" . Invisible Island . Consultado el 25 de enero de 2020 .
- ↑ Dickey, Thomas (2016). "Tabla de teclas de función para XTerm y otros emuladores de terminal" . Invisible Island . Consultado el 25 de enero de 2020 .
- ↑ "CSI u - Documentación" . iTerm2 - Reemplazo de terminal para macOS . Consultado el 15 de agosto de 2023 .
- ↑ "Gestión integral del teclado en terminales" . kitty . Consultado el 6 de abril de 2026 .
Enlaces externos
- Norma ECMA-48, Funciones de control para conjuntos de caracteres codificados ( 5.ª edición, junio de 1991 ), Asociación Europea de Fabricantes de Ordenadores, Ginebra, 1991 (también publicada por ISO e IEC como norma ISO/IEC 6429).
- vt100.net Documentos DEC
- "ANSI.SYS -- secuencias de escape de emulación de terminal ANSI" . Archivado del original el 6 de febrero de 2006. Consultado el 22 de febrero de 2007 .
- Xterm / Secuencias de escape
- AIXterm / Secuencias de escape
- Una colección de secuencias de escape para terminales que cumplen vagamente con ECMA-48 y estándares similares.
- "Secuencias de escape ANSI" . Archivado del original el 25 de mayo de 2011.
- Recomendación T.416 (03/93) de la UIT-T: Tecnología de la información – Arquitectura de documentos abiertos (ODA) y formato de intercambio: Arquitecturas de contenido de caracteres.
- Estándares informáticos
- Estándares Ecma
- Normas del Instituto Nacional Estadounidense de Estándares
- Normas ISO
- Interfaz de usuario de texto