Código de escape ANSI - ANSI escape code

ANSI X3.64 (ISO 6429)
Htop.png
Saída do monitor do sistema htop , um aplicativo ncurses (que usa SGR e outras sequências de controle ANSI / ISO).
Padrão
Classificação Código de controle baseado em ISO / IEC 2022 e conjunto de sequência de controle
Outras codificações relacionadas Outros padrões de função de controle: ITU T.101 , JIS X 0207 , ISO 6630 , DIN 31626 , ETS 300 706

As sequências de escape ANSI são um padrão para sinalização em banda para controlar a localização do cursor, cor, estilo da fonte e outras opções em terminais de texto de vídeo e emuladores de terminal . Certas sequências de bytes , a maioria começando com um caractere de escape ASCII e um caractere de colchete , são incorporadas ao texto. O terminal interpreta essas sequências como comandos, em vez de texto para exibir literalmente.

As sequências ANSI foram introduzidas na década de 1970 para substituir as sequências específicas do fornecedor e se espalharam no mercado de equipamentos de informática no início dos anos 1980. Eles são usados ​​em aplicativos de desenvolvimento, científicos e comerciais baseados em texto, bem como em sistemas de BBS para oferecer funcionalidade padronizada.

Embora os terminais de texto de hardware tenham se tornado cada vez mais raros no século 21, a relevância do padrão ANSI persiste porque a grande maioria dos emuladores de terminal e consoles de comando interpretam pelo menos uma parte do padrão ANSI.

História

Quase todos os fabricantes de terminais de vídeo adicionaram sequências de escape específicas do fornecedor para realizar operações como colocar o cursor em posições arbitrárias na tela. Um exemplo é o terminal VT52 , que permite que o cursor seja colocado em um local x, y na tela, enviando o ESCcaractere, um Ycaractere e, em seguida, dois caracteres representando com valores numéricos iguais ao local x, y mais 32 (assim começando no caractere de espaço ASCII e evitando os caracteres de controle). O Hazeltine 1500 tinha um recurso semelhante, invocado usando e ~, em DC1seguida, as posições X e Y separadas por uma vírgula. Embora os dois terminais tenham funcionalidade idêntica a este respeito, diferentes sequências de controle tiveram que ser usadas para invocá-los.

Como essas sequências eram diferentes para terminais diferentes, bibliotecas elaboradas como termcap ("capacidades de terminal") e utilitários como tput tiveram que ser criadas para que os programas pudessem usar a mesma API para trabalhar com qualquer terminal. Além disso, muitos desses terminais exigiam o envio de números (como linha e coluna) como os valores binários dos caracteres; para algumas linguagens de programação e para sistemas que não usavam ASCII internamente, muitas vezes era difícil transformar um número no caractere correto.

O padrão ANSI tentou resolver esses problemas criando um conjunto de comandos que todos os terminais usariam e exigindo que todas as informações numéricas sejam transmitidas como números ASCII. O primeiro padrão da série foi o ECMA-48, adotado em 1976. Era uma continuação de uma série de padrões de codificação de caracteres, sendo o primeiro o ECMA-6 de 1965, um padrão de 7 bits do qual se originou o ISO 646 . O nome "seqüência de escape ANSI" data de 1979, quando o ANSI adotou o ANSI X3.64. O comitê ANSI X3L2 colaborou com o comitê ECMA TC 1 para produzir padrões quase idênticos. Esses dois padrões foram fundidos em um padrão internacional, ISO 6429. Em 1994, ANSI retirou seu padrão em favor do padrão internacional.

Terminal DEC VT100
O terminal de exibição de vídeo DEC VT100.

O primeiro terminal de vídeo popular a suportar essas sequências foi o Digital VT100 , lançado em 1978. Esse modelo fez muito sucesso no mercado, o que gerou uma variedade de clones VT100, entre os quais o mais antigo e popular foi o muito mais acessível Zenith Z -19 em 1979. Outros incluíram o Qume QVT-108, Televideo TVI-970, Wyse WY-99GT, bem como os modos "VT100" ou "VT103" ou "ANSI" opcionais com vários graus de compatibilidade em muitas outras marcas. A popularidade destes gradualmente levou a mais e mais softwares (especialmente sistemas de BBS e outros serviços online ) assumindo que as sequências de escape funcionaram, levando a quase todos os novos terminais e programas de emulação que os suportam.

Em 1981, o ANSI X3.64 foi adotado para uso no governo dos Estados Unidos pela publicação 86 do FIPS . Mais tarde, o governo dos Estados Unidos parou de duplicar os padrões da indústria, então o FIPS publicou. 86 foi retirado.

O ECMA-48 foi atualizado diversas vezes e atualmente está em sua 5ª edição, de 1991. Também é adotado pela ISO e IEC como padrão ISO / IEC 6429 . Uma versão é adotada como Padrão Industrial Japonês , como JIS X 0211 .

Os padrões relacionados incluem ITU T.61 , o padrão Teletex e o ISO / IEC 8613 , o padrão Open Document Architecture (principalmente ISO / IEC 8613-6 ou ITU T.416). Os dois sistemas compartilham muitos códigos de escape com o sistema ANSI, com extensões que não são necessariamente significativas para terminais de computador. Ambos os sistemas caíram rapidamente em desuso, mas o ECMA-48 marca as extensões usadas neles como reservadas.

Suporte de plataforma

Sistemas tipo Unix

Embora as bibliotecas do estilo termcap / terminfo tenham sido desenvolvidas principalmente no e para o Unix, em meados da década de 1980 os programas executados em sistemas operacionais do tipo Unix quase sempre podiam assumir que estavam usando um terminal ou emulador que suportava sequências ANSI; isso levou ao uso generalizado de ANSI por programas executados nessas plataformas. Por exemplo, muitos jogos e scripts de shell e utilitários, como listas de diretórios de cores, gravam diretamente as sequências ANSI e, portanto, não podem ser usados ​​em um terminal que não as interprete. Muitos programas, incluindo editores de texto como vi e GNU Emacs , usam termcap ou terminfo, ou usam bibliotecas como curses que usam termcap ou terminfo e, portanto, em teoria suportam terminais não ANSI, mas isso é tão raramente testado hoje em dia que são improvável que funcione com esses terminais.

Emulador de terminal Xterm
O emulador de terminal Xterm.

Emuladores de terminal para comunicação com programas locais e também com máquinas remotas e o console do sistema de texto quase sempre oferecem suporte a códigos de escape ANSI. Isso inclui emuladores de terminal como xterm , rxvt , GNOME Terminal e Konsole em sistemas com sistemas de janela baseados em X11 ou Wayland e Terminal.app e emuladores de terminal de terceiros, como iTerm2 no macOS .

DOS, OS / 2 e Windows

MS-DOS 1.x não oferece suporte a ANSI ou qualquer outra seqüência de escape. Apenas alguns caracteres de controle ( BEL , CR , LF , BS ) foram interpretados pelo BIOS subjacente, tornando quase impossível fazer qualquer tipo de aplicativo de tela inteira. Quaisquer efeitos de exibição tinham que ser feitos com chamadas de BIOS, que eram notoriamente lentas, ou manipulando diretamente o hardware do PC IBM.

O DOS 2.0 introduziu a capacidade de adicionar um driver de dispositivo para as sequências de escape ANSI - o padrão de fato sendo ANSI.SYS , mas outros como ANSI.COM , NANSI.SYS e ANSIPLUS.EXE também são usados ​​(estes são consideravelmente mais rápidos porque ignorar o BIOS). A lentidão e o fato de não ter sido instalado por padrão faz com que o software raramente tire vantagem disso; em vez disso, os aplicativos continuaram a manipular diretamente o hardware para obter a exibição de texto necessária. ANSI.SYS e drivers semelhantes continuaram a funcionar no Windows 9x até o Windows ME e em sistemas derivados do NT para programas legados de 16 bits em execução no NTVDM .

Muitos clones do DOS foram capazes de interpretar as sequências e não exigem o carregamento de um driver ANSI separado. O PTS-DOS , bem como o DOS simultâneo , o DOS multiusuário e o REAL / 32 possuem suporte integrado (além de várias extensões). OS / 2 tinha um comando ANSI que habilitava as sequências.

O Console do Windows não oferece suporte a sequências de escape ANSI, nem a Microsoft fornece nenhum método para ativá-las. Algumas substituições ou acréscimos para a janela do console, como JP Software's TCC (anteriormente 4NT), Michael J. Mefford's ANSI.COM, Jason Hood's ANSICON e Maximus5 's ConEmu interpretaram sequências de escape ANSI impressas por programas. Um pacote Python interpretou internamente as sequências de escape ANSI no texto que está sendo impresso, convertendo-as em chamadas para manipular a cor e a posição do cursor, para facilitar a portabilidade do código Python usando ANSI para o Windows. O Cygwin executa uma tradução semelhante para todas as saídas gravadas no console usando os descritores de arquivo Cygwin, a filtragem é feita pelas funções de saída do cygwin1.dll , para permitir a portabilidade do código POSIX C para o Windows.

Em 2016, a Microsoft lançou a atualização do Windows 10 versão 1511 que implementou inesperadamente o suporte para sequências de escape ANSI, mais de duas décadas após o lançamento do Windows NT. Isso foi feito junto com o subsistema do Windows para Linux , permitindo que software baseado em terminal semelhante ao Unix usasse as sequências no console do Windows. Infelizmente, o padrão é desativado, mas o Windows PowerShell 5.1 o habilitou. O PowerShell 6 tornou possível incorporar o caractere ESC necessário em uma string com `e. O Windows Terminal , lançado em 2019, suporta as sequências por padrão, e a Microsoft pretende substituir o Windows Console pelo Windows Terminal.

Atari ST

O Atari ST usava o sistema de comando adaptado do VT52 com algumas expansões para suporte a cores, em vez de suportar códigos de escape ANSI.

AmigaOS

O AmigaOS não apenas interpreta sequências de código ANSI para saída de texto na tela, o driver da impressora AmigaOS também as interpreta (com extensões proprietárias do AmigaOS) e as traduz nos códigos necessários para a impressora específica que está realmente conectada.

Sequências de controle de estilo de janela Amiga CLI (shell)
Efeito
ESC [ nu Define o comprimento máximo das linhas na janela para n.
ESC [ nt Define o número máximo de linhas na janela para n.
ESC [ nx Inicia o texto n pixels a partir da borda esquerda da janela.
ESC [ ny Inicia o texto n pixels a partir da borda superior da janela.

VMS / OpenVMS

O VMS foi projetado para ser gerenciado interativamente usando terminais de vídeo baseados em texto da Digital, como o já mencionado VT100 ; mais tarde, com emuladores de terminal gráfico, como o Terminal VWS, DECTerm e xterm.

Descrição

Personagens de controle

Embora não seja tecnicamente parte do padrão, quase todos os usuários assumem algumas funções de alguns caracteres de byte único. Isso é usado para reduzir a quantidade de dados transmitidos ou para executar algumas funções que não estão disponíveis nas sequências de escape:

Personagens de controle populares (não uma lista exaustiva)
^ C0 Abbr Nome Efeito
^ G 7 BEL Sino Faz um ruído audível.
^ H 8 BS Backspace Move o cursor para a esquerda (mas pode "quebrar para trás" se o cursor estiver no início da linha).
^ I 9 HT Aba Move o cursor para a direita para o próximo múltiplo de 8.
^ J 0x0A LF Alimentação de linha Vai para a próxima linha, rola a exibição para cima se estiver na parte inferior da tela. Normalmente não se move horizontalmente, embora os programas não devam depender disso.
^ L 0x0C FF Feed de formulário Mova uma impressora para o início da próxima página. Normalmente não se move horizontalmente, embora os programas não devam depender disso. O efeito nos terminais de vídeo varia.
^ M 0x0D CR Retorno de carruagem Move o cursor para a coluna zero.
^ [ 0x1B ESC Fuga Inicia todas as sequências de escape

As sequências de escape variam em comprimento. O formato geral para uma sequência de escape compatível com ANSI é definido por ANSI X3.41 (equivalente a ECMA-35 ou ISO / IEC 2022). As sequências de escape consistem apenas em bytes no intervalo 0x20—0x7F (todos os caracteres ASCII não de controle) e podem ser analisadas sem olhar para frente. O comportamento quando um caractere de controle, um byte com o bit alto definido ou um byte que não faz parte de nenhuma sequência válida, é encontrado antes do final, é indefinido.

Sequências de Fe Escape

Se ESCfor seguido por um byte na faixa de 0x40 a 0x5F, é desse tipo. Delegado ao padrão de código de controle C1 aplicável . Consequentemente, todas as sequências de escape correspondentes aos códigos de controle C1 de ANSI X3.64 / ECMA-48 seguem este formato.

O padrão diz que, em ambientes de 8 bits, as funções de controle correspondentes às Fesequências de escape do tipo (aquelas do conjunto de códigos de controle C1 ) podem ser representadas como bytes únicos no intervalo 0x80–0x9F. No entanto, em dispositivos modernos, esses códigos são frequentemente usados ​​para outros fins, como partes de UTF-8 ou para caracteres CP-1252 , portanto, apenas a sequência de 2 bytes é normalmente usada. No caso de UTF-8, um código de controle C1 pode ser codificado como dois bytes (por exemplo, 0xC2,0x8E para U + 008E ), mas nenhum espaço é salvo dessa forma.

Algumas sequências de escape ANSI do tipo Fe (elemento do conjunto C1) (não é uma lista exaustiva)
C1 Abbr Nome Efeito
ESC N 0x8E SS2 Turno Único Dois Selecione um único caractere de um dos conjuntos de caracteres alternativos . SS2 seleciona o conjunto de caracteres G2 e SS3 seleciona o conjunto de caracteres G3. Em um ambiente de 7 bits, isso é seguido por um ou mais bytes GL (0x20–0x7F) especificando um caractere desse conjunto. Em um ambiente de 8 bits, eles podem ser bytes GR (0xA0–0xFF).
ESC O 0x8F SS3 Turno Único Três
ESC P 0x90 DCS String de controle do dispositivo Terminado por ST. Os usos desta sequência pelo Xterm incluem a definição de chaves definidas pelo usuário e a solicitação ou configuração de dados Termcap / Terminfo.
ESC [ 0x9B CSI Introdutor de sequência de controle Inicia a maioria das sequências úteis, terminadas por um byte no intervalo de 0x40 a 0x7E.
ESC \ 0x9C ST String Terminator Termina strings em outros controles.
ESC ] 0x9D OSC Comando do sistema operacional Inicia uma string de controle para o sistema operacional usar, encerrada por ST.
ESC X 0x98 SOS Início da corda Obtém um argumento de uma string de texto, terminada por ST. Os usos para essas sequências de controle de string são definidos pela aplicação ou disciplina de privacidade. Essas funções raramente são implementadas e os argumentos são ignorados pelo xterm. Alguns clientes Kermit permitem que o servidor execute comandos Kermit automaticamente no cliente, incorporando-os em sequências APC; este é um risco potencial de segurança se o servidor não for confiável.
ESC ^ 0x9E PM Mensagem de privacidade
ESC _ 0x9F APC Comando do programa aplicativo

Sequências CSI (introdutor de sequência de controle)

Para comandos do introdutor de sequência de controle ou CSI, o ESC [é seguido por qualquer número (incluindo nenhum) de "bytes de parâmetro" no intervalo 0x30–0x3F (ASCII 0–9:;<=>?) e, em seguida, por qualquer número de "bytes intermediários" no intervalo 0x20–0x2F (Espaço ASCII e !"#$%&'()*+,-./), finalmente por um único "byte final" no intervalo 0x40–0x7E (ASCII @A–Z[\]^_`a–z{|}~).

Todas as sequências comuns usam apenas os parâmetros como uma série de números separados por ponto e vírgula, como 1;2;3. Os números ausentes são tratados como 0( 1;;3age como o número do meio 0, e nenhum parâmetro em ESC[matua como um 0código de reinicialização). Algumas sequências (como CUU) tratam 0como 1para tornar úteis os parâmetros ausentes.

Um subconjunto de arranjos foi declarado "privado" para que os fabricantes de terminais pudessem inserir suas próprias sequências sem entrar em conflito com o padrão. As sequências contendo os bytes do parâmetro <=>?ou os bytes finais 0x70–0x7E ( p–z{|}~) são privadas.

O comportamento do terminal é indefinido no caso em que uma sequência CSI contém qualquer caractere fora do intervalo 0x20–0x7E. Esses caracteres ilegais são caracteres de controle C0 (o intervalo 0–0x1F), DEL (0x7F) ou bytes com o bit alto definido. As respostas possíveis são ignorar o byte, processá-lo imediatamente e, além disso, continuar com a sequência CSI, abortá-la imediatamente ou ignorar o resto.

Algumas sequências de controle ANSI (não uma lista exaustiva)
Abbr Nome Efeito
CSI n A CUU Cursor para cima Move o cursor n1 células (padrão ) na direção fornecida. Se o cursor já estiver na borda da tela, isso não terá efeito.
CSI n B RUMINAÇÃO Cursor para baixo
CSI n C CUF Cursor para frente
CSI n D FILHOTE Cursor Voltar
CSI n E CNL Próxima linha do cursor Move o cursor para o início da linha n (padrão 1) linhas para baixo. (não ANSI.SYS )
CSI n F CPL Linha Anterior do Cursor Move o cursor para o início da linha n (padrão 1) linhas para cima. (não ANSI.SYS )
CSI n G CHA Cursor horizontal absoluto Move o cursor para a coluna n (padrão 1). (não ANSI.SYS )
CSI  n  ; m  H XÍCARA Posição do Cursor Move o cursor para a linha n , coluna m . Os valores são baseados em 1 e o padrão para 1(canto superior esquerdo) se omitido. Uma sequência como CSI ;5Hé sinônimo de CSI 1;5H, bem como CSI 17;Hé o mesmo que CSI 17HeCSI 17;1H
CSI n J ED Apagar na tela Limpa parte da tela. Se n for 0(ou ausente), limpe do cursor até o final da tela. Se n for 1, limpe do cursor até o início da tela. Se n for 2, limpa a tela inteira (e move o cursor para o canto superior esquerdo no DOS ANSI.SYS ). Se n for 3, limpa a tela inteira e exclui todas as linhas salvas no buffer de rolagem (este recurso foi adicionado para xterm e é suportado por outros aplicativos de terminal).
CSI n K EL Apagar na linha Apaga parte da linha. Se n for 0(ou ausente), limpe do cursor até o final da linha. Se n for 1, limpe do cursor até o início da linha. Se n for 2, limpe a linha inteira. A posição do cursor não muda.
CSI n S SU Scroll Up Rola a página inteira para cima em n1 linhas (padrão ). Novas linhas são adicionadas na parte inferior. (não ANSI.SYS )
CSI n T SD Rolar para baixo Role a página inteira para baixo em n (padrão 1) linhas. Novas linhas são adicionadas no topo. (não ANSI.SYS )
CSI n  ; m f HVP Posição vertical horizontal O mesmo que CUP, mas conta como uma função efetora de formato (como CR ou LF ) em vez de uma função de editor (como CUD ou CNL). Isso pode levar a um manuseio diferente em certos modos de terminal.
CSI n m SGR Selecione Renderização Gráfica Define as cores e o estilo dos caracteres que seguem este código
CSI 5i AUX Port On Habilite a porta serial auxiliar geralmente para impressora serial local
CSI 4i Porta AUX desligada Desative a porta serial auxiliar geralmente para impressora serial local

CSI 6n DSR Relatório de status do dispositivo Informa a posição do cursor (CPR) por transmissão ESC[n;mR, onde n é a linha e m é a coluna.)
Algumas sequências privadas populares
Abbr Nome Efeito
CSI s SCP, SCOSC Salvar posição atual do cursor Salva a posição / estado do cursor no modo console SCO. No modo de tela dividida vertical, em vez disso, é usado para definir (como ) ou redefinir as margens esquerda e direita. CSI n ; n s
CSI você RCP, SCORC Restaurar posição salva do cursor Restaura a posição / estado do cursor no modo do console SCO.
CSI? 25 h DECTCEM Mostra o cursor, a partir do VT220 .
CSI? 25 l DECTCEM Esconde o cursor.
CSI? 1049 h Habilitar buffer de tela alternativo, do xterm
CSI? 1049 l Desativar buffer de tela alternativo, do xterm
CSI? 2004 h Ative o modo de colagem entre parênteses. O texto colado no terminal será circundado por ESC [200~e ESC [201~, e os caracteres nele não devem ser tratados como comandos (por exemplo, no Vim). De xterm
CSI? 2004 l Desative o modo de colagem com colchetes.

Parâmetros SGR (Selecionar Renderização Gráfica)

Selecione Graphic Rendition (SGR) para definir os atributos de exibição. Vários atributos podem ser definidos na mesma sequência, separados por ponto e vírgula. Cada atributo de exibição permanece em vigor até que uma ocorrência seguinte de SGR o redefina. Se nenhum código for fornecido, CSI mé tratado como CSI 0 m(redefinir / normal).

Nome Observação
0 Reiniciar ou normal Todos os atributos desativados
1 Negrito ou intensidade aumentada Tal como acontece com desmaios, a mudança de cor é uma invenção do PC (SCO / CGA ).
2 Esmaecido, intensidade diminuída ou escurecido Pode ser implementado como uma fonte leve, como negrito.
3 itálico Não é amplamente suportado. Às vezes tratado como inverso ou intermitente.
4 Sublinhado Existem extensões de estilo para Kitty, VTE, mintty e iTerm2.
5 Piscar devagar Menos de 150 por minuto
6 Piscar rápido MS-DOS ANSI.SYS, 150+ por minuto; não amplamente suportado
7 Vídeo reverso ou invertido Troque as cores do primeiro plano e do plano de fundo; emulação inconsistente
8 Ocultar ou esconder Não é amplamente suportado.
9 Cruzado , ou greve Caracteres legíveis, mas marcados como para exclusão.
10 Fonte primária (padrão)
11-19 Fonte alternativa Selecione fonte alternativa n - 10
20 Fraktur (gótico) Raramente suportado
21 Sublinhado duas vezes; ou: sem negrito Double-sublinhado por ECMA-48, mas em vez desativa intensidade negrito em vários terminais, incluindo o kernel do Linux 's consola antes da versão 4.17.
22 Intensidade normal Nem ousado nem fraco; a cor muda onde a intensidade é implementada como tal.
23 Nem itálico, nem letra preta
24 Não sublinhado Nem simples nem duplamente sublinhado
25 Sem piscar
26 Espaçamento proporcional ITU T.61 e T.416, não conhecido por ser usado em terminais
27 Não revertido
28 Revelar Não oculto
29 Não riscado
30–37 Definir cor de primeiro plano
38 Definir cor de primeiro plano Os próximos argumentos são 5;nou2;r;g;b
39 Cor de primeiro plano padrão Implementação definida (de acordo com o padrão)
40-47 Definir cor de fundo
48 Definir cor de fundo Os próximos argumentos são 5;nou2;r;g;b
49 Cor de fundo padrão Implementação definida (de acordo com o padrão)
50 Desativar espaçamento proporcional T.61 e T.416
51 Emoldurado Implementado como " seletor de variação de emoji " em mintty.
52 Cercado
53 Sobreposto
54 Nem emoldurado nem circundado
55 Sem overlinear
58 Definir cor de sublinhado Não está no padrão; implementado em Kitty, VTE, mintty e iTerm2. Os próximos argumentos são 5;nou2;r;g;b .
59 Cor de sublinhado padrão Não está no padrão; implementado em Kitty, VTE, mintty e iTerm2.
60 Sublinhado de ideograma ou linha do lado direito Raramente suportado
61 Ideograma com sublinhado duplo ou linha dupla no lado direito
62 Ideograma sobre linha ou linha do lado esquerdo
63 Ideograma sobre linha dupla ou linha dupla no lado esquerdo
64 Marcação de estresse de ideograma
65 Sem atributos de ideograma Redefina os efeitos de todos 60-64
73 Sobrescrito Implementado apenas em mintty
74 Subscrito
75 Nem sobrescrito nem subscrito
90-97 Definir a cor brilhante do primeiro plano Não está no padrão; originalmente implementado por aixterm
100-107 Definir a cor de fundo brilhante

Cores

3 bits e 4 bits

A especificação original tinha apenas 8 cores e apenas deu nomes a elas. Os parâmetros SGR 30–37 selecionaram a cor do primeiro plano, enquanto 40–47 selecionaram o fundo. Vários terminais implementaram "negrito" (código SGR 1) como uma cor mais brilhante ao invés de uma fonte diferente, fornecendo assim 8 cores de primeiro plano adicionais. Normalmente você não pode obtê-las como cores de fundo, embora às vezes o vídeo inverso (código SGR 7) permita isso. Exemplos: para obter letras pretas sobre fundo branco use ESC[30;47m, para obter vermelho use ESC[31m, para obter vermelho brilhante use ESC[1;31m. Para redefinir as cores para seus padrões, use ESC[39;49m(não suportado em alguns terminais) ou redefina todos os atributos com ESC[0m. Terminais posteriores adicionaram a capacidade de especificar diretamente as cores "brilhantes" com 90–97 e 100–107.

Quando o hardware começou a usar conversores digital-analógico (DACs) de 8 bits, vários softwares atribuíram números de cores de 24 bits a esses nomes. O gráfico abaixo mostra os valores padrão enviados ao DAC para alguns hardwares e softwares comuns; na maioria dos casos, eles são configuráveis.

FG BG Nome VGA
Console do Windows XP
Windows
PowerShell
Código Visual Studio
Console do Windows 10
Terminal.app PuTTY mIRC xterm Ubuntu Terminal Eclipse
30 40 Preto 0, 0, 0 12, 12, 12 0, 0, 0 1, 1, 1 0, 0, 0
31 41 vermelho 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 Amarelo 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 Ciano 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 Branco 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 Preto Brilhante (Cinza) 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 Vermelho brilhante 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 claro 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 Amarelo brilhante 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 claro 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 Brilhante 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 Ciano Brilhante 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 Branco brilhante 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

À medida que as tabelas de consulta de 256 cores se tornaram comuns em placas gráficas, sequências de escape foram adicionadas para selecionar a partir de um conjunto predefinido de 256 cores:

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

A tecnologia da informação T.416 da ITU - Open Document Architecture (ODA) e formato de intercâmbio: As arquiteturas de conteúdo de caracteres usam ':' como caracteres separadores:

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 cores - primeiro plano: ESC [38; 5; #m plano de fundo: ESC [48; 5; #m
Cores padrão Cores de alta intensidade
 0   1   2   3   4   5   6   7   8   9  10 11 12 13 14 15
216 cores
16 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 65 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
Cores em tons de cinza
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255

Também houve uma codificação de 88 cores semelhante, mas incompatível, usando a mesma sequência de escape, vista em rxvte xterm-88color. Não se sabe muito sobre o esquema além dos códigos de cores. Ele usa um cubo de cores 4 × 4 × 4.

24 bits

À medida que as placas gráficas "true color" com 16 a 24 bits de cor se tornaram comuns, os aplicativos começaram a oferecer suporte a cores de 24 bits. Emuladores de terminal que suportam a configuração de cores de primeiro plano e fundo de 24 bits com sequências de escape incluem Xterm, Konsole do KDE e iTerm, bem como todos os terminais baseados em libvte, incluindo Terminal GNOME .

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

A tecnologia da informação T.416 da ITU - Open Document Architecture (ODA) e formato de intercâmbio: arquiteturas de conteúdo de caracteres que foram adotadas como ISO / IEC International Standard 8613-6 oferece uma versão alternativa que parece ser menos suportada. Os parâmetros após '2', ou seja, até mesmo r, g, b são opcionais. Observe que esta não é apenas a sequência acima com ponto-e-vírgula substituído por dois-pontos, há um "ID de espaço de cor" inicial (este fato não foi percebido por muitos emuladores de terminal, esta omissão parece ter vindo do KDE Konsole). A definição do ID do espaço de cores não está incluída nesse documento, portanto, pode estar em branco para representar o padrão não especificado. Bem como o valor '2' para especificar um formato Vermelho-Verde-Azul (e o '5' acima para uma cor indexada de 0-255), existem alternativas de '0' para a implementação definida e '1' para transparente - nenhum do que tem quaisquer parâmetros adicionais; '3' especifica cores usando um esquema Ciano-Magenta-Amarelo e '4' para um Ciano-Magenta-Amarelo-Preto, o último usando a posição marcada como "não utilizada" para o componente Preto:

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

Sequências OSC (Comando do Sistema Operacional)

Em sua maioria, eles foram definidos pelo Xterm. Por razões históricas, xterm pode encerrar o comando com BELtambém ST.

O Xterm permite que o título da janela seja definido por ESC ]0;this is the window title BEL.

Uma extensão não xterm é o hiperlink, ESC ]8;;link STde 2017, usado por VTE, iTerm2 e mintty.

O console do Linux usa ESC ] P n rr gg bbpara alterar a paleta, que, se embutida em um aplicativo, pode travar outros terminais. No entanto, o acréscimo STserá ignorado pelo Linux e formará uma sequência adequada e ignorável para outros terminais.

Sequências Fs Escape

Se o ESCfor seguido por um byte no intervalo 0x60—0x7E , é desse tipo. Usado para funções de controle registradas individualmente no registro ISO-IR e, conseqüentemente, disponível mesmo em contextos onde um conjunto de códigos de controle C1 diferente é usado. Especificamente, eles correspondem a funções de controle únicas aprovadas pela ISO / IEC JTC 1 / SC 2 e padronizadas pela ISO ou um organismo reconhecido pela ISO. Alguns deles são especificados em ECMA-35 (ISO 2022 / ANSI X3.41), outros em ECMA-48 (ISO 6429 / ANSI X3.64). ECMA-48 refere-se a isso como "funções de controle independentes".

Algumas sequências de escape ANSI do tipo Fs (função independente) reconhecidas por terminais
Abbr Nome Efeito
ESC c RIS Redefinir para o estado inicial Dispara uma reinicialização completa do terminal ao seu estado original. Isso pode incluir (se aplicável): redefinir a renderização do gráfico, limpar paradas de tabulação, redefinir para a fonte padrão e muito mais.

Sequências Fp Escape

Se ESCfor seguido por um byte no intervalo 0x30—0x3F, ele é desse tipo. Separado para funções de controle de uso privado.

Algumas sequências de escape do tipo Fp (uso privado) reconhecidas pelo VT100 , seus sucessores e / ou emuladores de terminal, como xterm
Abbr Nome Efeito
ESC 7 DECSC DEC Salvar Cursor Salva a posição do cursor, o estado de mudança de codificação e os atributos de formatação.
ESC 8 DECRC DEC Restore Cursor Restaura a posição do cursor, o estado de mudança de codificação e os atributos de formatação do DECSC anterior, se houver, caso contrário, redefine todos para seus padrões.

Sequências de escape nF

Se ESCfor seguido por um byte no intervalo 0x20—0x2F , é desse tipo. Seguido por qualquer número de bytes adicionais neste intervalo e, em seguida, um byte no intervalo 0x30-0x7E . Eles são posteriormente subcategorizados pelos quatro bits mais baixos do primeiro byte, por exemplo, "tipo 2F" para sequências em que o primeiro byte é 0x22 ; e se o byte final está no intervalo de uso privado 0x30–0x3F (por exemplo, "tipo 2Fp") ou não (por exemplo, "tipo 2Ft"). Eles são usados ​​principalmente para mecanismos de comutação de código ANSI / ISO, como aqueles usados ​​pela ISO-2022-JP , exceto para 3Fsequências de tipo (aquelas em que o primeiro byte intermediário é 0x23), que são usadas para funções de controle individuais. As 3Ftsequências de tipo são reservadas para funções de controle individuais adicionais registradas pelo ISO-IR, enquanto as 3Fpsequências de tipo estão disponíveis para funções de controle de uso privado.

Algumas sequências de escape ANSI do tipo 0Ft (anúncio) reconhecidas por terminais (não uma lista exaustiva)
Abbr Nome Efeito
ESC SP F Definido em ECMA-35 (ANSI X3.41 / ISO 2022). Faz com que as teclas de função enviem letras ESC + em vez de códigos C1.
ESC SP G Definido em ECMA-35. Faz com que as teclas de função enviem códigos C1.
Algumas sequências de escape do tipo 3Fp (uso privado) reconhecidas pelo VT100 , seus sucessores e / ou emuladores de terminal, como xterm
Abbr Nome Efeito
ESC # 3 DECDHL Letras de Altura Dupla DEC, Metade Superior Faz com que a linha atual use caracteres com o dobro da altura. Este código é para a metade superior.
ESC # 4 DECDHL Letras DEC de Altura Dupla, Metade Inferior Faz com que a linha atual use caracteres com o dobro da altura. Este código é para a metade inferior.
ESC # 5 DECSWL Linha de largura única DEC Faz com que a linha atual use caracteres de largura única, de acordo com o comportamento padrão.
ESC # 6 DECDWL Linha de largura dupla DEC Faz com que a linha atual use caracteres de largura dupla, descartando quaisquer caracteres na segunda metade da linha.

Exemplos

CSI 2 J - Isso limpa a tela e, em alguns dispositivos, posiciona o cursor na posição y, x 1,1 (canto superior esquerdo).

CSI 32 m- Isso torna o texto verde. O verde pode ser um verde escuro e opaco, portanto, você pode ativar o Negrito com a sequência CSI 1 mque o tornaria verde brilhante ou combinado como CSI 32 ; 1 m. Algumas implementações usam o estado Bold para tornar o personagem Bright.

CSI 0 ; 6 8 ; "DIR" ; 13 p- Isso reatribui a tecla F10 para enviar ao buffer do teclado a string "DIR" e ENTER, que na linha de comando do DOS exibiria o conteúdo do diretório atual. (Somente MS-DOS ANSI.SYS) Isso às vezes era usado para bombas ANSI . Este é um código de uso privado (conforme indicado pela letra p), usando uma extensão não padrão para incluir um parâmetro com valor de string. Seguir a letra da norma consideraria que a sequência terminaria na letra D.

CSI s- Isso salva a posição do cursor. Usar a sequência CSI uirá restaurá-lo à posição. Digamos que a posição atual do cursor seja 7 (y) e 10 (x). A sequência CSI ssalvará esses dois números. Agora você pode mover para uma posição diferente do cursor, como 20 (y) e 3 (x), usando a sequência CSI 20 ; 3 Hou CSI 20 ; 3 f. Agora, se você usar a sequência CSI u, a posição do cursor retornará a 7 (y) e 10 (x). Alguns terminais requerem as sequências DEC ESC 7/, ESC 8que são mais amplamente suportadas.

Em script de shell

Códigos de escape ANSI são frequentemente utilizados em UNIX e UNIX-like terminais para fornecer destaque de sintaxe . Por exemplo, em terminais compatíveis, o comando de lista a seguir codifica os nomes dos arquivos e diretórios por tipo.

ls --color

Os usuários podem empregar códigos de escape em seus scripts, incluindo-os como parte da saída padrão ou erro padrão . Por exemplo, o seguinte comando GNU sed embeleza a saída do comando make exibindo linhas contendo palavras começando com "WARN" em vídeo reverso e palavras começando com "ERR" em amarelo brilhante em um fundo vermelho escuro ( letras maiúsculas são ignoradas). As representações dos códigos são destacadas.

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

A seguinte função Bash pisca o terminal (enviando alternadamente códigos de modo de vídeo normal e reverso) até que o usuário pressione uma tecla.

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

Isso pode ser usado para alertar um programador quando um comando longo termina, como com make ; flasher.

printf \\033c

Isso redefinirá o console, semelhante ao comando resetnos sistemas Linux modernos; no entanto, deve funcionar mesmo em sistemas Linux mais antigos e em outras variantes UNIX (não Linux).

Em C

Saída do programa de exemplo no Terminal Gnome
#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;
}

Sequências de entrada terminal

Pressionar teclas especiais no teclado, bem como emitir muitas sequências xterm CSI, DCS ou OSC, geralmente produz uma sequência CSI, DCS ou OSC, enviada do terminal para o computador como se o usuário a tivesse digitado.

Ao digitar a entrada em um terminal, os pressionamentos de tecla fora da área normal do teclado alfanumérico principal podem ser enviados ao host como sequências ANSI. Para as teclas que têm uma função de saída equivalente, como as teclas do cursor, elas geralmente refletem as sequências de saída. No entanto, para a maioria dos pressionamentos de tecla, não há uma sequência de saída equivalente a ser usada.

Existem vários esquemas de codificação e, infelizmente, a maioria dos terminais mistura sequências de diferentes esquemas, de modo que o software host deve ser capaz de lidar com sequências de entrada usando qualquer esquema. Para complicar a questão, os próprios terminais VT têm dois esquemas de entrada, modo normal e modo de aplicação, que podem ser alternados pela aplicação.

(seção de rascunho)

<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

Se o caractere de terminação for '~', o primeiro número deve estar presente e é um número do código-chave, o segundo número é um valor modificador opcional. Se o caractere final for uma letra, a letra será o valor do código-chave e o número opcional será o valor do modificador.

O valor do modificador é padronizado para 1 e, após subtrair 1, é um bitmap de teclas modificadoras sendo pressionadas: Meta-Ctrl-Alt-Shift. Assim, por exemplo, <esc> [4; 2 ~ é Shift-End, <esc> [20 ~ é a tecla de função 9, <esc> [5C é 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 são iguais às sequências de saída ANSI. O <num> normalmente é omitido se nenhuma tecla modificadora for pressionada, mas a maioria das implementações sempre emite o <num> para F1-F4. (seção de rascunho)

O Xterm tem uma página de documentação abrangente sobre as várias teclas de função e esquemas de sequência de entrada de mouse dos terminais VT do DEC e vários outros terminais que ele emula. Thomas Dickey adicionou muito suporte a ele ao longo do tempo; ele também mantém uma lista de chaves padrão usadas por outros emuladores de terminal para comparação.

  • No console do Linux, certas teclas de função geram sequências do formulário . A sequência CSI deve terminar no .CSI [ char[
  • Versões antigas do Terminator são geradas quando F1 – F4 são pressionados com modificadores. O comportamento defeituoso foi copiado do Terminal GNOME .SS3 1; modifiers char
  • O xterm responde se for solicitado a posição do cursor e se a tecla F3 for pressionada com modificadores, que colidem no caso da linha == 1. Isso pode ser evitado usando o ? modificador privado como , que será refletido na resposta como .CSI row ; column RCSI 1 ; modifiers RCSI ? 6 nCSI ? row ; column R
  • muitos terminais precedem ESCqualquer caractere digitado com a tecla alt pressionada. Isso cria ambigüidade para letras maiúsculas e símbolos @[\]^_, que formariam códigos C1.
  • O Konsole é gerado quando F1 – F4 são pressionados com modificadores.SS3 modifiers char

Veja também

Notas

Referências

links externos