Saltar al contenido

Códigos de escape ANSI

Un código de escape ANSI es una secuencia de caracteres que un programa imprime para indicar a la terminal que haga algo más que mostrar esos caracteres: que coloree las próximas palabras de rojo, que mueva el cursor dos líneas hacia arriba, que limpie la pantalla. La terminal consume la secuencia y la ejecuta; por eso un archivo de log lleno de ellos parece ruido cuando lo abres en un editor.

Cada código comienza con el byte de escape y, con una excepción, con un paréntesis de apertura. La columna de parámetros muestra la parte entre el paréntesis y la letra final, que es lo que ensamblas en el código; la primera columna muestra la secuencia completa tal como la escribirías en un shell.

El soporte varía según la terminal, y esta página lo indica donde importa. Los ocho colores básicos y la negrita funcionan en todas partes; el parpadeo, el doble subrayado y true color no.

Anatomía de una secuencia

6

Cada código en esta página tiene la misma forma: byte de escape, paréntesis de apertura, parámetros y una letra que dice qué hacer con ellos.

SecuenciaParámetroEfecto
\e0x1BEl byte de escape que inicia cada secuenciaSe escribe \e en un shell, \033 en C, \x1b en la mayoría de lenguajes y \u001b en JSON y Java.
\e[CSIIntroductor de secuencia de control — abre un comando parametrizado
\e[<n>mmSelección de representación gráfica: todo color y estilo termina en m
\e[1;4;31m1;4;31Varios parámetros a la vez, separados por punto y comaNegrita, subrayado y rojo en una secuencia — más corto que tres separadas e idéntico en efecto.
\e[0m0Restablece cada atributo a los valores predeterminados de la terminalEmite esto al final de la salida coloreada. Un programa que termina sin hacerlo deja el prompt del usuario coloreado.
\e]8;;URL\e\\text\e]8;;\e\\OSC 8Un hipervínculo cliqueable, en terminales que lo soportanUna secuencia OSC en lugar de CSI, y terminada por ESC \ en lugar de una letra.

Atributos de texto

14

El soporte es desigual por debajo de los primeros cinco. El parpadeo se ignora casi en todas partes, y algunas terminales representan dim e italic idénticamente.

SecuenciaParámetroEfecto
\e[1m1Negrita o brillo
\e[2m2Atenuado
\e[3m3Cursiva
\e[4m4Subrayado
\e[5m5ParpadeoAmpliamente ignorado; la mayoría de terminales modernas lo representan como texto simple.
\e[7m7Inverso: intercambia primer plano y fondo
\e[8m8Oculto: el texto existe pero no se dibuja
\e[9m9Tachado
\e[21m21Doble subrayadoAlgunas terminales leen 21 como "desactivar negrita".
\e[22m22Intensidad normal: cancela negrita y atenuado
\e[23m23Cancela cursiva
\e[24m24Cancela subrayado
\e[27m27Cancela inverso
\e[29m29Cancela tachado

Color del texto

17

Los ocho colores estándar y sus contrapartes brillantes. Lo que el lector realmente ve es la interpretación de su tema de terminal — "rojo" es una posición en una paleta, no un valor hexadecimal.

SecuenciaParámetroEfecto
\e[30m30Texto negro
\e[31m31Texto rojo
\e[32m32Texto verde
\e[33m33Texto amarillo
\e[34m34Texto azul
\e[35m35Texto magenta
\e[36m36Texto cian
\e[37m37Texto blanco
\e[39m39Volviendo al color de texto predeterminado
\e[90m90Texto negro brillante
\e[91m91Texto rojo brillante
\e[92m92Texto verde brillante
\e[93m93Texto amarillo brillante
\e[94m94Texto azul brillante
\e[95m95Texto magenta brillante
\e[96m96Texto cian brillante
\e[97m97Texto blanco brillante

Color de fondo

17

La misma paleta desplazada diez posiciones. Un código de fondo establece la celda detrás del texto y permanece activo hasta que se restablece.

SecuenciaParámetroEfecto
\e[40m40Fondo negro
\e[41m41Fondo rojo
\e[42m42Fondo verde
\e[43m43Fondo amarillo
\e[44m44Fondo azul
\e[45m45Fondo magenta
\e[46m46Fondo cian
\e[47m47Fondo blanco
\e[49m49Volviendo al fondo predeterminado
\e[100m100Fondo negro brillante
\e[101m101Fondo rojo brillante
\e[102m102Fondo verde brillante
\e[103m103Fondo amarillo brillante
\e[104m104Fondo azul brillante
\e[105m105Fondo magenta brillante
\e[106m106Fondo cian brillante
\e[107m107Fondo blanco brillante

256 colores y true color

4

Dos extensiones del mismo mecanismo SGR. Ambas son ampliamente pero no universalmente soportadas; una terminal que no las entiende generalmente ignora la secuencia en lugar de imprimirla.

SecuenciaParámetroEfecto
\e[38;5;<n>m38;5;nTexto en color de paleta n, 0–2550–15 son los dieciséis anteriores, 16–231 un cubo de color 6×6×6, 232–255 una rampa en escala de grises.
\e[48;5;<n>m48;5;nFondo en color de paleta n, 0–255
\e[38;2;<r>;<g>;<b>m38;2;r;g;bTexto en un color exacto de 24 bits
\e[48;2;<r>;<g>;<b>m48;2;r;g;bFondo en un color exacto de 24 bits

Movimiento del cursor

11

Los movimientos no desplazan ni envuelven: un cursor ya en la parte superior de la pantalla ignora una solicitud de ir hacia arriba.

SecuenciaParámetroEfecto
\e[<n>AAArriba n filas
\e[<n>BBAbajo n filas
\e[<n>CCDerecha n columnas
\e[<n>DDIzquierda n columnas
\e[<n>EEAbajo n filas, al inicio de la línea
\e[<n>FFArriba n filas, al inicio de la línea
\e[<n>GGA la columna n de la fila actual
\e[<row>;<col>HHA una fila y columna absoluta, contando desde 1
\e[ssRecuerda la posición del cursor
\e[uuVuelve a la posición recordada
\e[6n6nPregunta a la terminal dónde está el cursorLa terminal responde en entrada estándar como \e[<fila>;<col>R — la única secuencia aquí que produce una respuesta.

Borrado

7

El borrado escribe espacios con el color de fondo actual; no mueve el cursor.

SecuenciaParámetroEfecto
\e[0J0JBorra desde el cursor hasta el final de la pantalla
\e[1J1JBorra desde el inicio de la pantalla hasta el cursor
\e[2J2JBorra toda la pantallaEl cursor permanece donde estaba, por eso esto generalmente se empareja con \e[H.
\e[3J3JBorra también el buffer de retroceso
\e[0K0KBorra desde el cursor hasta el final de la línea
\e[1K1KBorra desde el inicio de la línea hasta el cursor
\e[2K2KBorra toda la línea\r\e[2K es la forma habitual de redibujar una línea de progreso en su lugar.

Modos de terminal

8

Modos privados, marcados con un signo de pregunta. Cambian cómo se comporta la terminal en lugar de cómo se ve un texto, y cada uno debe reiniciarse antes de que el programa termine.

SecuenciaParámetroEfecto
\e[?25l?25lOculta el cursor
\e[?25h?25hMuestra el cursor
\e[?1049h?1049hCambia a la pantalla alternativaLo que usa un programa de pantalla completa para que el historial del shell sobreviva debajo.
\e[?1049l?1049lCambia de nuevo a la pantalla principal
\e[?7h?7hEnvuelve líneas largas en el borde derecho
\e[?7l?7lDeja que las líneas largas se desborden por el borde derecho
\e[?2004h?2004hActiva el pegado con paréntesisEl texto pegado llega envuelto en \e[200~ y \e[201~, para que un shell distinga escribir de pegar.
\e[?2004l?2004lDesactiva el pegado con paréntesis

Preguntas frecuentes

¿Por qué mi salida se queda coloreada después de que termina el programa?
Porque nada la reinició. Un código de color permanece activo hasta que otro lo reemplaza, así que un programa que termina a mitad del color deja el prompt coloreado. Imprime \e[0m antes de salir — incluso en la ruta de error, que es donde la gente olvida.
¿Cuál es la diferencia entre \e, \033 y \x1b?
Ninguna. Los tres son el mismo byte, 0x1B, escrito según cómo lo deletrea cada lenguaje: \e en bash y zsh, \033 en C y en echo -e, \x1b en Python, Go, Rust y JavaScript, \u001b donde solo se permite un escape Unicode, como en JSON y Java.
¿Cómo elimino estos códigos de un archivo de log?
Pégalo en la herramienta de eliminación de ANSI en este sitio. Elimina secuencias de color, cursor y modo, y también puede convertir los colores a HTML o Markdown en lugar de descartarlos, que es lo que quieres si el punto del log era el resaltado.
¿Debería codificar los colores o usar una librería?
Para algo más que unas pocas líneas, usa una librería — verifica si la salida es una terminal en primer lugar. Los códigos de color escritos a un pipe o a un archivo terminan en el archivo, y así es como los logs de compilación adquieren su ruido.
¿Es la negrita lo mismo que el brillo?
Históricamente sí, y en algunas terminales todavía. El código 1 se definió como negrita, pero muchas terminales lo implementaron cambiando a la mitad brillante de la paleta, así que negrita roja y roja brillante pueden verse idénticamente. El rango 90–97 existe para que puedas pedir brillo sin pedir negrita.