Ir para o conteúdo

Códigos de escape ANSI

Um código de escape ANSI é uma sequência curta de caracteres que um programa imprime para dizer ao terminal para fazer algo além de mostrar esses caracteres — fazer as próximas palavras vermelhas, mover o cursor duas linhas para cima, limpar a tela. O terminal engole a sequência e actua sobre ela, é por isso que um ficheiro de registo cheio deles parece ruído quando o abre num editor.

Todos os códigos abaixo começam com o byte de escape e, com uma excepção, um parêntese de abertura. A coluna de parâmetros dá a parte entre o parêntese e a letra final, que é o que monta no código; a primeira coluna mostra toda a sequência como a escreveria numa shell.

O suporte varia entre terminais, e esta página diz onde importa. As oito cores básicas e negrito funcionam em qualquer lugar; pisca, sublinhado duplo e true colour não.

Anatomia de uma sequência

6

Todos os códigos nesta página têm a mesma forma: o byte de escape, um parêntese de abertura, alguns parâmetros e uma letra que diz o que fazer com eles.

SequênciaParâmetroEfeito
\e0x1BO byte de escape que inicia cada sequênciaEscrito \e numa shell, \033 em C, \x1b na maioria das linguagens e \u001b em JSON e Java.
\e[CSIControl Sequence Introducer — abre um comando parametrizado
\e[<n>mmSelect Graphic Rendition: tudo sobre cor e estilo termina em m
\e[1;4;31m1;4;31Vários parâmetros de uma vez, separados por ponto e vírgulaNegrito, sublinhado e vermelho numa sequência — mais curto que três separadas e efeito idêntico.
\e[0m0Limpa todos os atributos volta ao padrão do terminalEmita isto no final da saída colorida. Um programa que sai sem isto deixa o prompt do utilizador colorido.
\e]8;;URL\e\\text\e]8;;\e\\OSC 8Uma hiperligação clicável, nos terminais que a suportamUma sequência OSC, não CSI, e terminada por ESC \ em vez de uma letra.

Atributos de texto

14

O suporte é desigual abaixo dos primeiros cinco. Pisca é ignorado quase em qualquer lugar, e alguns terminais apresentam esmaecido e itálico identicamente.

SequênciaParâmetroEfeito
\e[1m1Negrito ou brilhante
\e[2m2Esmaecido
\e[3m3Itálico
\e[4m4Sublinhado
\e[5m5PiscaAmplamente ignorado; a maioria dos terminais modernos apresentam-no como texto simples.
\e[7m7Inverso: troca primeiro plano e fundo
\e[8m8Oculto: o texto existe mas não é desenhado
\e[9m9Riscado
\e[21m21Sublinhado duploAlguns terminais lêem 21 como "negrito desligado".
\e[22m22Intensidade normal: cancela negrito e esmaecido
\e[23m23Cancela itálico
\e[24m24Cancela sublinhado
\e[27m27Cancela inverso
\e[29m29Cancela riscado

Cor do texto

17

As oito cores padrão e as suas contrapartes brilhantes. O que o leitor vê é a interpretação do tema do seu terminal — "vermelho" é uma ranhura numa paleta, não um valor hex.

SequênciaParâmetroEfeito
\e[30m30Texto preto
\e[31m31Texto vermelho
\e[32m32Texto verde
\e[33m33Texto amarelo
\e[34m34Texto azul
\e[35m35Texto magenta
\e[36m36Texto ciano
\e[37m37Texto branco
\e[39m39Volta à cor de texto padrão
\e[90m90Texto preto brilhante
\e[91m91Texto vermelho brilhante
\e[92m92Texto verde brilhante
\e[93m93Texto amarelo brilhante
\e[94m94Texto azul brilhante
\e[95m95Texto magenta brilhante
\e[96m96Texto ciano brilhante
\e[97m97Texto branco brilhante

Cor de fundo

17

A mesma paleta deslocada por dez. Um código de fundo define a célula atrás do texto e permanece em vigor até ser reposto.

SequênciaParâmetroEfeito
\e[40m40Fundo preto
\e[41m41Fundo vermelho
\e[42m42Fundo verde
\e[43m43Fundo amarelo
\e[44m44Fundo azul
\e[45m45Fundo magenta
\e[46m46Fundo ciano
\e[47m47Fundo branco
\e[49m49Volta ao fundo padrão
\e[100m100Fundo preto brilhante
\e[101m101Fundo vermelho brilhante
\e[102m102Fundo verde brilhante
\e[103m103Fundo amarelo brilhante
\e[104m104Fundo azul brilhante
\e[105m105Fundo magenta brilhante
\e[106m106Fundo ciano brilhante
\e[107m107Fundo branco brilhante

256 cores e true colour

4

Duas extensões do mesmo mecanismo SGR. Ambas são amplamente, mas não universalmente, suportadas; um terminal que não as compreende ignora geralmente a sequência em vez de a imprimir.

SequênciaParâmetroEfeito
\e[38;5;<n>m38;5;nTexto na cor da paleta n, 0–2550–15 são os dezasseis acima, 16–231 um cubo de cores 6×6×6, 232–255 uma rampa de escala de cinzentos.
\e[48;5;<n>m48;5;nFundo na cor da paleta n, 0–255
\e[38;2;<r>;<g>;<b>m38;2;r;g;bTexto numa cor exacta de 24-bit
\e[48;2;<r>;<g>;<b>m48;2;r;g;bFundo numa cor exacta de 24-bit

Movimento do cursor

11

Os movimentos não deslocam nem embrulham: um cursor já no topo da tela ignora um pedido para subir.

SequênciaParâmetroEfeito
\e[<n>AASuba n linhas
\e[<n>BBDesça n linhas
\e[<n>CCDireita n colunas
\e[<n>DDEsquerda n colunas
\e[<n>EEDesça n linhas, até ao início da linha
\e[<n>FFSuba n linhas, até ao início da linha
\e[<n>GGPara a coluna n da linha actual
\e[<row>;<col>HHPara uma linha e coluna absoluta, contando a partir de 1
\e[ssLembre a posição do cursor
\e[uuVolte para a posição lembrada
\e[6n6nPergunte ao terminal onde está o cursorO terminal responde na entrada padrão como \e[<linha>;<coluna>R — a única sequência aqui que produz uma resposta.

Apagamento

7

O apagamento escreve espaços com a cor de fundo actual; não move o cursor.

SequênciaParâmetroEfeito
\e[0J0JLimpar do cursor até ao fim da tela
\e[1J1JLimpar do início da tela até ao cursor
\e[2J2JLimpar toda a telaO cursor permanece onde estava, é por isso que isto é geralmente emparelhado com \e[H.
\e[3J3JLimpar também o buffer de scrollback
\e[0K0KLimpar do cursor até ao fim da linha
\e[1K1KLimpar do início da linha até ao cursor
\e[2K2KLimpar a linha inteira\r\e[2K é a forma habitual de redesenhar uma linha de progresso no lugar.

Modos de terminal

8

Modos privados, marcados pelo ponto de interrogação. Mudam o comportamento do terminal em vez da aparência de um pedaço de texto, e cada um deles tem de ser desligado antes de sair do programa.

SequênciaParâmetroEfeito
\e[?25l?25lOcultar o cursor
\e[?25h?25hMostrar o cursor
\e[?1049h?1049hMudar para a tela alternativaO que um programa de ecrã inteiro usa para que o scrollback da shell sobreviva por baixo.
\e[?1049l?1049lMudar de volta para a tela principal
\e[?7h?7hQuebrar linhas longas na borda direita
\e[?7l?7lDeixar linhas longas extravasar pela borda direita
\e[?2004h?2004hLigar a colagem com suporteTexto colado chega envolvido em \e[200~ e \e[201~, para a shell conseguir distinguir digitação de colagem.
\e[?2004l?2004lDesligar a colagem com suporte

FAQ

Porque é que a saída fica colorida depois do programa terminar?
Porque nada a repôs. Um código de cor permanece em vigor até ser substituído por outro, por isso um programa que sai no meio da cor deixa a shell com um prompt colorido. Imprima \e[0m antes de sair — também no caminho de erro, que é o que as pessoas esquecem.
Qual é a diferença entre \e, \033 e \x1b?
Nenhuma. Todos os três são o mesmo byte, 0x1B, escrito da forma que uma linguagem particular o escreve: \e em bash e zsh, \033 em C e em echo -e, \x1b em Python, Go, Rust e JavaScript, \u001b onde apenas um escape Unicode é permitido, tal como em JSON e Java.
Como remover estes códigos de um ficheiro de registo?
Cole-o na ferramenta de remoção de ANSI neste site. Remove sequências de cor, cursor e modo e pode também converter as cores para HTML ou Markdown em vez de as descartar, o que quer se o ponto do registo era o destaque.
Devo codificar cores ou usar uma biblioteca?
Para mais que algumas linhas, use uma biblioteca — verifica se a saída é um terminal. Códigos de cor escritos para um tubo ou ficheiro acabam no ficheiro, e é assim que os registos de construção adquirem o seu ruído.
Negrito é o mesmo que brilhante?
Historicamente sim, e em alguns terminais ainda. O código 1 foi definido como negrito, mas muitos terminais o implementaram passando para a metade brilhante da paleta, por isso negrito vermelho e vermelho brilhante podem parecer idênticos. O intervalo 90-97 existe para poder pedir brilhante sem pedir negrito.