Partilhar via


Sequências de terminais virtuais de console

As sequências de terminais virtuais são sequências de caracteres de controle que podem controlar o movimento do cursor, a cor do console e outras operações quando gravadas no fluxo de saída. Sequências também podem ser recebidas no fluxo de entrada em resposta a uma sequência de informações de consulta de fluxo de saída ou como uma codificação de entrada do usuário quando o modo apropriado é definido.

Você pode usar as funções GetConsoleMode e SetConsoleMode para configurar esse comportamento. Um exemplo da maneira sugerida para habilitar comportamentos de terminal virtual está incluído no final deste documento.

O comportamento das sequências a seguir é baseado no VT100 e nas tecnologias derivadas do emulador de terminal, mais especificamente no emulador de terminal xterm. Mais informações sobre sequências terminais podem ser encontradas em http://vt100.net e em http://invisible-island.net/xterm/ctlseqs/ctlseqs.html.

Sequências de saída

As seguintes sequências de terminal são intercetadas pelo host do console quando gravadas no fluxo de saída, se o sinalizador de ENABLE_VIRTUAL_TERMINAL_PROCESSING estiver definido no identificador do buffer de tela usando a função SetConsoleMode . Observe que o sinalizador DISABLE_NEWLINE_AUTO_RETURN também pode ser útil para emular o posicionamento do cursor e o comportamento de rolagem de outros emuladores de terminal em relação aos caracteres gravados na coluna final em qualquer linha.

Posicionamento simples do cursor

Em todas as descrições a seguir, ESC é sempre o valor hexadecimal 0x1B. Não devem ser incluídos espaços nas sequências terminais. As sequências de terminais individuais podem ser divididas, em qualquer posição de caractere ou byte, em várias chamadas sequenciais para WriteFile ou WriteConsole , mas é uma prática recomendada incluir toda a sequência em uma chamada. Para um exemplo de como essas sequências são usadas na prática, veja o exemplo no final deste tópico.

A tabela a seguir descreve sequências de escape simples com um único comando de ação diretamente após o caractere ESC. Estas sequências não têm parâmetros e entram em vigor imediatamente.

Todos os comandos nesta tabela são geralmente equivalentes a chamar a API do console SetConsoleCursorPosition para colocar o cursor.

O movimento do cursor será limitado pela janela de visualização atual no buffer. A rolagem (se disponível) não ocorrerá.

Sequência Taquigrafia Comportamento
CES M RI Índice reverso – Executa a operação inversa de \n, move o cursor para cima uma linha, mantém a posição horizontal, rola o buffer se necessário*
CES 7 DECSC Salvar a posição do cursor na memória**
CES 8 DECSR Restaurar a posição do cursor a partir da memória**

Observação

* Se houver margens de rolagem definidas, o RI dentro das margens rolará apenas o conteúdo das margens e deixará o visor inalterado. (Consulte Margens de rolagem)

**Não haverá nenhum valor salvo na memória até o primeiro uso do comando salvar. A única maneira de acessar o valor salvo é com o comando restore.

Posicionamento do cursor

As tabelas a seguir abrangem sequências do tipo Control Sequence Introducer (CSI). Todas as sequências CSI começam com ESC (0x1B) seguido por [ (colchete esquerdo, 0x5B) e podem conter parâmetros de comprimento variável para especificar mais informações para cada operação. Isto será representado pela abreviatura <n>. Cada tabela abaixo é agrupada por funcionalidade com notas abaixo de cada tabela explicando como o grupo funciona.

Para todos os parâmetros, aplicam-se as seguintes regras, salvo indicação em contrário:

  • <n> representa a distância a mover e é um parâmetro opcional
  • Se <n> for omitido ou igual a 0, será tratado como um 1
  • <n> não pode ser maior que 32.767 (valor curto máximo)
  • <n> não pode ser negativo

Todos os comandos nesta seção são geralmente equivalentes a chamar a API do console SetConsoleCursorPosition .

O movimento do cursor será limitado pela janela de visualização atual no buffer. A rolagem (se disponível) não ocorrerá.

Sequência Código Descrição Comportamento
CES [ <n> A CUU Cursor para cima Cursor para cima por <n>
CES [ <n> B CUD Cursor para baixo Cursor para baixo por <n>
CES [ <n> C CUF Cursor para a frente Cursor para a frente (Direita) por <n>
CES [ <n> D FILHOTE Cursor para trás Cursor para trás (esquerda) por <n>
CES [ <n> E CNL Cursor Próxima Linha Cursor para baixo <n> linhas a partir da posição atual
CES [ <n> F CPL Cursor Linha Anterior Cursor para cima <n> linhas a partir da posição atual
CES [ <n> G CHA Cursor Horizontal Absoluto O cursor move-se para a <enésima>posição horizontal na linha atual
CES [ <n> d APV Posição Absoluta da Linha Vertical O cursor move-se para a enésima <>posição vertical na coluna atual
CES [ <y> ; <x> A COPA Posição do cursor *O cursor move-se para <x>; <coordenada y> dentro do visor, onde <x> é a coluna da <linha y>
CES [ <y> ; <x> f HVP Posição Vertical Horizontal *O cursor move-se para <x>; <coordenada y> dentro do visor, onde <x> é a coluna da <linha y>
CES [ s ANSISYSSC Salvar cursor – emulação Ansi.sys **Sem parâmetros, executa uma operação de salvar cursor como DECSC
CES [ u ANSISYSRC Restaurar Cursor – emulação Ansi.sys **Sem parâmetros, executa uma operação de restauração do cursor como DECRC

Observação

*<Os parâmetros x> e <y> têm as mesmas limitações que <n> acima. Se <x> e <y> forem omitidos, eles serão definidos como 1;1.

**ANSI.sys documentação histórica pode ser encontrada em https://msdn.microsoft.com/library/cc722862.aspx e é implementada por conveniência/compatibilidade.

Visibilidade do cursor

Os comandos a seguir controlam a visibilidade do cursor e seu estado de piscar. As sequências DECTCEM são geralmente equivalentes a chamar a API do console SetConsoleCursorInfo para alternar a visibilidade do cursor.

Sequência Código Descrição Comportamento
CES [ ? 12 h ATT160 Cursor de texto ativar piscar Iniciar o cursor piscando
CES [ ? 12 litros ATT160 Cursor de texto Desativar piscar Parar de piscar o cursor
CES [ ? 25 h DECTCEM Cursor de texto ativar modo de exibição Mostrar o cursor
CES [ ? 25 litros DECTCEM Modo de ativação do cursor de texto Ocultar Ocultar o cursor

Sugestão

As sequências de ativação terminam em um caractere H minúsculo (h) e as sequências de desativação terminam em um caractere L minúsculo (l).

Forma do cursor

Os comandos a seguir controlam e permitem a personalização da forma do cursor.

Sequência Código Descrição Comportamento
CES [ 0 SP q DECSCUSR Forma do usuário Forma de cursor padrão configurada pelo usuário
CES [ 1 SP q DECSCUSR Bloco piscando Forma do cursor do bloco intermitente
CES [ 2 SP q DECSCUSR Bloqueio estável Forma constante do cursor do bloco
CES [ 3 SP q DECSCUSR Sublinhado intermitente Forma do cursor de sublinhado intermitente
CES [ 4 SP q DECSCUSR Sublinhado constante Forma constante do cursor sublinhado
CES [ 5 SP q DECSCUSR Barra intermitente Forma do cursor da barra intermitente
CES [ 6 SP q DECSCUSR Barra estável Forma constante do cursor da barra

Observação

SP é um caractere de espaço literal (0x20) na posição intermediária, e é seguido por q (0x71) na posição final.

Posicionamento do Viewport

Todos os comandos nesta seção são geralmente equivalentes a chamar a API do console ScrollConsoleScreenBuffer para mover o conteúdo do buffer do console.

Atenção Os nomes dos comandos são enganosos. Scroll refere-se à direção em que o texto se move durante a operação, não à direção da janela de visualização que parece se mover.

Sequência Código Descrição Comportamento
CES [ <n> S SU Deslocar para cima Role o texto para cima por <n>. Também conhecido como pan down, novas linhas são preenchidas na parte inferior da tela
CES [ <n> T SD Rolar para baixo Role para baixo por <n>. Também conhecido como pan up, novas linhas são preenchidas a partir da parte superior da tela

O texto é movido começando com a linha em que o cursor está. Se o cursor estiver na linha do meio do visor, a rolagem para cima moverá a metade inferior do visor e inserirá linhas em branco na parte inferior. Rolar para baixo moveria a metade superior das linhas do visor e inseriria novas linhas na parte superior.

Também é importante notar que a rolagem para cima e para baixo também são afetadas pelas margens de rolagem. Rolar para cima e para baixo não afetará nenhuma linha fora das margens de rolagem.

O valor padrão para <n> é 1 e o valor pode ser opcionalmente omitido.

Modificação de texto

Todos os comandos nesta seção são geralmente equivalentes a chamar as APIs do console FillConsoleOutputCharacter, FillConsoleOutputAttribute e ScrollConsoleScreenBuffer para modificar o conteúdo do buffer de texto.

Sequência Código Descrição Comportamento
CES [ <n> @ CIH Inserir caractere Insira <n> espaços na posição atual do cursor, deslocando todo o texto existente para a direita. O texto que sai da tela para a direita é removido.
CES [ <n> P DCH Excluir caractere Exclua <n> caracteres na posição atual do cursor, deslocando os caracteres de espaço da borda direita da tela.
CES [ <n> X ECH Apagar personagem Apague <n> caracteres da posição atual do cursor substituindo-os por um caractere de espaço.
CES [ <n> L IL Inserir linha Insere <n> linhas no buffer na posição do cursor. A linha em que o cursor está e as linhas abaixo dela serão deslocadas para baixo.
CES [ <n> M DL Excluir linha Exclui <n> linhas do buffer, começando com a linha em que o cursor está.

Observação

Para IL e DL, apenas as linhas nas margens de rolagem (consulte Margens de rolagem) são afetadas. Se nenhuma margem for definida, as bordas de margem padrão serão o visor atual. Se as linhas forem deslocadas abaixo das margens, elas são descartadas. Quando as linhas são excluídas, as linhas em branco são inseridas na parte inferior das margens, as linhas de fora da janela de visualização nunca são afetadas.

Para cada uma das sequências, o valor padrão para <n> se for omitido é 0.

Para os seguintes comandos, o parâmetro <n> tem 3 valores válidos:

  • 0 apaga da posição atual do cursor (inclusive) para o final da linha/ecrã
  • 1 apaga desde o início da linha/ecrã até à posição atual do cursor
  • 2 apaga toda a linha/ecrã
Sequência Código Descrição Comportamento
CES [ <n> J ED Apagar no ecrã Substitua todo o texto na janela de visualização/tela atual especificada por <n> por caracteres de espaço
CES [ <n> K EL Apagar na linha Substitua todo o texto na linha pelo cursor especificado por <n por caracteres> de espaço

Formatação de texto

Todos os comandos nesta seção são geralmente equivalentes a chamar APIs do console SetConsoleTextAttribute para ajustar a formatação de todas as gravações futuras no buffer de texto de saída do console.

Este comando é especial na medida em que a <posição n> abaixo pode aceitar entre 0 e 16 parâmetros separados por ponto-e-vírgula.

Quando nenhum parâmetro é especificado, ele é tratado da mesma forma que um único parâmetro 0.

Sequência Código Descrição Comportamento
CES [ <n> m SGR Definir representação gráfica Defina o formato da tela e do texto conforme especificado por <n>

A tabela de valores a seguir pode ser usada em <n> para representar diferentes modos de formatação.

Os modos de formatação são aplicados da esquerda para a direita. A aplicação de opções de formatação concorrentes resultará na precedência da opção mais à direita.

Para opções que especificam cores, as cores serão usadas conforme definido na tabela de cores do console, que pode ser modificada usando a API SetConsoleScreenBufferInfoEx . Se a tabela for modificada para que a posição "azul" na tabela exiba um tom RGB de vermelho, todas as chamadas para Azul de Primeiro Plano exibirão essa cor vermelha até que seja alterada de outra forma.

Valor Descrição Comportamento
0 Predefinido Retorna todos os atributos ao estado padrão antes da modificação
1 Negrito/Brilhante Aplica sinalizador de brilho/intensidade à cor de primeiro plano
22 Sem negrito/brilho Remove o sinalizador de brilho/intensidade da cor de primeiro plano
4 Sublinhado Adiciona sublinhado
24 Sem sublinhado Remove sublinhado
7 Negativo Troca cores de primeiro plano e plano de fundo
27 Positivo (Não negativo) Retorna o primeiro plano/plano de fundo ao normal
30 Primeiro plano preto Aplica preto não negrito/brilhante ao primeiro plano
31 Vermelho em primeiro plano Aplica vermelho não negrito/brilhante a primeiro plano
32 Verde em primeiro plano Aplica verde não negrito/brilhante a primeiro plano
33 Primeiro plano amarelo Aplica amarelo não negrito/brilhante ao primeiro plano
34 Azul em primeiro plano Aplica azul não negrito/brilhante a primeiro plano
35 Magenta em primeiro plano Aplica magenta não negrito/brilhante a primeiro plano
36 Ciano em primeiro plano Aplica ciano não negrito/brilhante ao primeiro plano
37 Branco em primeiro plano Aplica branco não negrito/brilhante em primeiro plano
38 Primeiro plano estendido Aplica o valor de cor estendido ao primeiro plano (veja os detalhes abaixo)
39 Padrão de primeiro plano Aplica-se apenas a parte de primeiro plano dos padrões (ver 0)
40 Fundo Preto Aplica preto não negrito/brilhante ao plano de fundo
41 Fundo Vermelho Aplica vermelho não negrito/brilhante ao plano de fundo
42 Fundo Verde Aplica verde não negrito/brilhante ao plano de fundo
43 Fundo amarelo Aplica amarelo não negrito/brilhante ao plano de fundo
44 Fundo Azul Aplica azul não negrito/brilhante ao plano de fundo
45 Antecedentes Magenta Aplica magenta sem negrito/brilho ao plano de fundo
46 Fundo ciano Aplica ciano não negrito/brilhante ao plano de fundo
47 Fundo Branco Aplica branco não negrito/brilhante ao fundo
48 Fundo estendido Aplica valor de cor estendido ao plano de fundo (veja os detalhes abaixo)
49 Padrão de plano de fundo Aplica apenas a parte em segundo plano dos padrões (consulte 0)
90 Preto brilhante em primeiro plano Aplica negrito/preto brilhante em primeiro plano
91 Vermelho brilhante em primeiro plano Aplica negrito/vermelho brilhante em primeiro plano
92 Verde brilhante em primeiro plano Aplica negrito/verde brilhante em primeiro plano
93 Amarelo brilhante em primeiro plano Aplica negrito/amarelo brilhante em primeiro plano
94 Azul brilhante em primeiro plano Aplica negrito/azul brilhante ao primeiro plano
95 Primeiro plano brilhante Magenta Aplica magenta negrito/brilhante em primeiro plano
96 Ciano brilhante em primeiro plano Aplica ciano negrito/brilhante em primeiro plano
97 Branco brilhante em primeiro plano Aplica negrito/branco brilhante em primeiro plano
100 Fundo brilhante preto Aplica negrito/preto brilhante ao fundo
101 Fundo brilhante vermelho Aplica negrito/vermelho brilhante ao fundo
102 Fundo brilhante verde Aplica negrito/verde brilhante ao fundo
103 Fundo brilhante amarelo Aplica negrito/amarelo brilhante ao fundo
104 Fundo brilhante azul Aplica negrito/azul brilhante ao fundo
105 Fundo brilhante Magenta Aplica magenta negrito/brilhante ao fundo
106 Fundo brilhante ciano Aplica ciano negrito/brilhante ao fundo
107 Fundo brilhante branco Aplica negrito/branco brilhante ao fundo

Cores estendidas

Alguns emuladores de terminal virtual suportam uma paleta de cores maior do que as 16 cores fornecidas pelo Console do Windows. Para essas cores estendidas, o Console do Windows escolherá a cor apropriada mais próxima da tabela de 16 cores existente para exibição. Ao contrário dos valores SGR típicos acima, os valores estendidos consumirão parâmetros adicionais após o indicador inicial, de acordo com a tabela abaixo.

Subseqüência SGR Descrição
38 ; 2 ; <r> ; <g> ; <O> Defina a cor do primeiro plano para o valor RGB especificado nos <parâmetros r>, <g>, <b> *
48 ; 2 ; <r> ; <g> ; <O> Defina a cor de fundo para o valor RGB especificado nos <parâmetros r>, <g>, <b> *
38 ; 5 ; <s> Definir cor de primeiro plano como <índice s na tabela de> 88 ou 256 cores*
48 ; 5 ; <s> Definir a cor de fundo como <índice s na tabela de> 88 ou 256 cores*

*As paletas de cores 88 e 256 mantidas internamente para comparação são baseadas no emulador de terminal xterm. As tabelas de comparação/arredondamento não podem ser modificadas neste momento.

Cores da tela

O comando a seguir permite que o aplicativo defina os valores da paleta de cores da tela para qualquer valor RGB.

Os valores RGB devem ser valores hexadecimais entre 0 e ff, e separados pelo caractere de barra (por exemplo, rgb:1/24/86).

Observe que essa sequência é uma sequência OSC "Comando do sistema operacional", e não uma CSI como muitas das outras sequências listadas, e como tal começar com "\x1b]", não "\x1b[". Como sequências OSC, elas são terminadas com um String Terminator representado como <ST> e transmitido com ESC \ (0x1B 0x5C). BEL (0x7) pode ser usado em vez disso como terminador, mas a forma mais longa é preferível.

Sequência Descrição Comportamento
CES ] 4 ; <i> ; rgb : <r> / <g> / <b><ST> Modificar cores de tela Define o índice <da paleta de cores da tela i> para os valores RGB especificados em <r>, <g>, <b>

Alterações de modo

Estas são sequências que controlam os modos de entrada. Existem dois conjuntos diferentes de modos de entrada, o Modo de Teclas de Cursor e o Modo de Teclas de Teclado. O Modo de Teclas de Cursor controla as sequências que são emitidas pelas teclas de seta, bem como Home e End, enquanto o Modo de Teclas de Teclado controla as sequências emitidas pelas teclas no numpad principalmente, bem como as teclas de função.

Cada um desses modos são configurações booleanas simples – o Modo de Teclas do Cursor é Normal (padrão) ou Aplicativo, e o Modo de Teclas do Teclado é Numérico (padrão) ou Aplicativo.

Consulte as secções Teclas do cursor e Teclas de função Numpad & para obter as sequências emitidas nestes modos.

Sequência Código Descrição Comportamento
CES = DECKPAM Ativar o Modo de Aplicação do Teclado As teclas do teclado emitirão suas sequências do Modo de Aplicação.
CES > DECKPNM Ativar o modo numérico do teclado As teclas do teclado emitirão as sequências do Modo Numérico.
CES [ ? 1 h DECCKM Ativar o Modo de Aplicação de Teclas de Cursor As teclas do teclado emitirão suas sequências do Modo de Aplicação.
CES [ ? 1 l DECCKM Desativar o Modo de Aplicação de Teclas de Cursor (use o Modo Normal) As teclas do teclado emitirão as sequências do Modo Numérico.

Estado da consulta

Todos os comandos nesta seção são geralmente equivalentes a chamar APIs do console Get* para recuperar informações de status sobre o estado atual do buffer do console.

Observação

Essas consultas emitirão suas respostas no fluxo de entrada do console imediatamente após serem reconhecidas no fluxo de saída enquanto ENABLE_VIRTUAL_TERMINAL_PROCESSING estiver definida. O sinalizador ENABLE_VIRTUAL_TERMINAL_INPUT não se aplica aos comandos de consulta, pois supõe-se que um aplicativo que faz a consulta sempre desejará receber a resposta.

Sequência Código Descrição Comportamento
CES [ 6 n DECXCPR Posição do cursor do relatório Emita a posição do cursor como: ESC [ <r> ; <c> R Onde <r> = linha do cursor e <c> = coluna do cursor
CES [ 0 c DA Atributos do dispositivo Denuncie a identidade do terminal. Emitirá "\x1b[?1; 0c", indicando "VT101 sem opções".

Separadores

Enquanto o console do Windows tradicionalmente espera que as guias tenham exclusivamente oito caracteres de largura, os aplicativos *nix que utilizam certas sequências podem manipular onde as paradas de tabulação estão dentro das janelas do console para otimizar o movimento do cursor pelo aplicativo.

As sequências a seguir permitem que um aplicativo defina os locais de parada de tabulação na janela do console, remova-os e navegue entre eles.

Sequência Código Descrição Comportamento
CES H HTS Conjunto de abas horizontal Define uma parada de tabulação na coluna atual em que o cursor está.
CES [ <n> I CHT Guia Cursor Horizontal (Avançar) Avançar o cursor para a próxima coluna (na mesma linha) com uma parada de tabulação. Se não houver mais paradas de tabulação, vá para a última coluna da linha. Se o cursor estiver na última coluna, vá para a primeira coluna da linha seguinte.
CES [ <n> Z TCC Guia Cursor para trás Mova o cursor para a coluna anterior (na mesma linha) com uma parada de tabulação. Se não houver mais paradas de tabulação, move o cursor para a primeira coluna. Se o cursor estiver na primeira coluna, não mova o cursor.
CES [ 0 g TBC Tab Clear (coluna atual) Limpa a parada de tabulação na coluna atual, se houver. Caso contrário, não faz nada.
CES [ 3 g TBC Tab Limpar (todas as colunas) Limpa todas as paradas de tabulação definidas no momento.
  • Para CHT e CBT, <n> é um parâmetro opcional que (padrão=1) indica quantas vezes o cursor deve avançar na direção especificada.
  • Se não houver paradas de tabulação definidas via HTS, CHT e CBT tratarão a primeira e a última colunas da janela como as duas únicas paradas de tabulação.
  • Usar HTS para definir uma parada de tabulação também fará com que o console navegue até a próxima parada de tabulação na saída de um caractere TAB (0x09, '\t'), da mesma maneira que CHT.

Designar conjunto de caracteres

As sequências a seguir permitem que um programa altere o mapeamento do conjunto de caracteres ativo. Isso permite que um programa emita caracteres ASCII de 7 bits, mas os exiba como outros glifos na própria tela do terminal. Atualmente, os dois únicos conjuntos de caracteres suportados são ASCII (padrão) e o DEC Special Graphics Character set. Consulte http://vt100.net/docs/vt220-rm/table2-4.html para obter uma lista de todos os caracteres representados pelo DEC Special Graphics Character set.

Sequência Descrição Comportamento
CES ( 0 Designar conjunto de caracteres – Desenho de linha DEC Ativa o modo de desenho de linha DEC
CES ( B Designar conjunto de caracteres – ASCII dos EUA Habilita o modo ASCII (padrão)

Notavelmente, o modo de desenho de linha DEC é usado para desenhar bordas em aplicativos de console. A tabela a seguir mostra o que o caractere ASCII mapeia para qual caractere de desenho de linha.

Hex ASCII Desenho de linha DEC
0x6a j
0x6b k
0x6c l
0x6d m
0x6e n
0x71 q
0x74 t
0x75 u
0x76 v
0x77 w
0x78 x

Margens de rolagem

As sequências a seguir permitem que um programa configure a "região de rolagem" da tela que é afetada pelas operações de rolagem. Este é um subconjunto das linhas que são ajustadas quando a tela rolaria, por exemplo, em um '\n' ou RI. Essas margens também afetam as linhas modificadas por Inserir linha (IL) e Excluir linha (DL), Rolar para cima (SU) e Rolar para baixo (SD).

As margens de rolagem podem ser especialmente úteis para ter uma parte da tela que não rola quando o resto da tela é preenchido, como ter uma barra de título na parte superior ou uma barra de status na parte inferior do seu aplicativo.

Para DECSTBM, há dois parâmetros opcionais, <t> e <b>, que são usados para especificar as linhas que representam as linhas superiores e inferiores da região de rolagem, inclusive. Se os parâmetros forem omitidos, <t> assume como padrão 1 e <b> como padrão a altura atual da janela de visualização.

As margens de rolagem são por buffer, tão importante, o Buffer Alternativo e o Buffer Principal mantêm configurações de margens de rolagem separadas (portanto, um aplicativo de tela cheia no buffer alternativo não envenenará as margens do buffer principal).

Sequência Código Descrição Comportamento
CES [ <t> ; <b> r DECSTBM Definir região de rolagem Define as margens de rolagem VT do visor.

Título da janela

Os comandos a seguir permitem que o aplicativo defina o título da janela do console para o parâmetro string> fornecido<. A cadeia de caracteres deve ter menos de 255 caracteres para ser aceita. Isso equivale a chamar SetConsoleTitle com a cadeia de caracteres fornecida.

Observe que essas sequências são sequências OSC "Comando do sistema operacional", e não um CSI como muitas das outras sequências listadas, e como tal começa com "\x1b]", não "\x1b[". Como sequências OSC, elas são terminadas com um String Terminator representado como <ST> e transmitido com ESC \ (0x1B 0x5C). BEL (0x7) pode ser usado em vez disso como terminador, mas a forma mais longa é preferível.

Sequência Descrição Comportamento
CES ] 0 ; <string><ST> Definir título da janela Define o título da janela do console como <string>.
CES ] 2 ; <string><ST> Definir título da janela Define o título da janela do console como <string>.

O caractere final aqui é o caractere "Bell", '\x07'

Buffer de tela alternativo

*Os aplicativos estilo Nix geralmente utilizam um buffer de tela alternativo, para que possam modificar todo o conteúdo do buffer, sem afetar o aplicativo que os iniciou. O buffer alternativo é exatamente as dimensões da janela, sem qualquer região de scrollback.

Para obter um exemplo desse comportamento, considere quando o vim é iniciado a partir do bash. O Vim usa a totalidade da tela para editar o arquivo e, em seguida, retornar ao bash deixa o buffer original inalterado.

Sequência Descrição Comportamento
CES [ ? 1 0 4 9 h Usar buffer de tela alternativo Alterna para um novo buffer de tela alternativo.
CES [ ? 1 0 4 9 l Usar buffer de tela principal Alterna para o buffer principal.

Largura da janela

As sequências a seguir podem ser usadas para controlar a largura da janela do console. Eles são aproximadamente equivalentes à chamada da API do console SetConsoleScreenBufferInfoEx para definir a largura da janela.

Sequência Código Descrição Comportamento
CES [ ? 3 horas DECCOLM Definir o número de colunas como 132 Define a largura do console para 132 colunas de largura.
CES [ ? 3 litros DECCOLM Definir o número de colunas como 80 Define a largura do console para 80 colunas de largura.

Reposição suave

A sequência a seguir pode ser usada para redefinir determinadas propriedades para seus valores padrão. As propriedades a seguir são redefinidas para os seguintes valores padrão (também listadas são as sequências que controlam essas propriedades):

  • Visibilidade do cursor: visível (DECTEM)
  • Teclado numérico: Modo numérico (DECNKM)
  • Modo de teclas do cursor: Modo normal (DECCKM)
  • Margens superior e inferior: superior=1, inferior=altura do console (DECSTBM)
  • Conjunto de caracteres: US ASCII
  • Representação gráfica: Default/Off (SGR)
  • Guardar estado do cursor: Posição inicial (0,0) (DECSC)
Sequência Código Descrição Comportamento
CES [ ! p DECSTR Reposição suave Redefina determinadas configurações do terminal para seus padrões.

Sequências de entrada

As seguintes sequências de terminal são emitidas pelo host do console no fluxo de entrada se o sinalizador ENABLE_VIRTUAL_TERMINAL_INPUT estiver definido no identificador do buffer de entrada usando o sinalizador SetConsoleMode.

Existem dois modos internos que controlam quais sequências são emitidas para as teclas de entrada dadas, o Modo de Teclas de Cursor e o Modo de Teclas de Teclado. Elas são descritas na seção Alterações de modo.

Teclas do cursor

Key Modo Normal Modo de Aplicação
Seta para Cima CES [ A CES O A
Seta para Baixo CES [ B ESC O B
Seta para a Direita CES [ C ESC O C
Seta para a Esquerda CES [ D ESC O D
Base CES [ H ESC O H
Fim CES [ F ESC O F

Além disso, se Ctrl for pressionado com qualquer uma dessas teclas, as seguintes sequências serão emitidas, independentemente do modo de teclas do cursor:

Key Qualquer Modo
Ctrl + Seta para cima CES [ 1 ; 5 A
Ctrl + Seta para baixo CES [ 1 ; 5 B
Ctrl + Seta para a direita CES [ 1 ; 5 C
Ctrl + Seta para a esquerda CES [ 1 ; 5 D

Numpad & Teclas de Função

Key Sequência
Tecla de Retrocesso 0x7f (DEL)
Pausa 0x1a (SUB)
Fuja 0x1b (CES)
Inserir CES [ 2 ~
Suprimir CES [ 3 ~
Avançar página CES [ 5 ~
Descer Página CES [ 6 ~
F1 ESC O P
F2 ESC O Q
F3 ESC O R
F4 ESC O S
F5 CES [ 1 5 ~
F6 CES [ 1 7 ~
F7 CES [ 1 8 ~
F8 CES [ 1 9 ~
F9 CES [ 2 0 ~
F10 CES [ 2 1 ~
F11 CES [ 2 3 ~
F12 CES [ 2 4 ~

Modificadores

Alt é tratado prefixando a sequência com um escape: ESC <c onde><c> é o caractere passado pelo sistema operacional. Alt+Ctrl é tratado da mesma forma, exceto que o sistema operacional terá pré-deslocado a <tecla c> para o caractere de controle apropriado que será retransmitido para o aplicativo.

Ctrl geralmente é passado exatamente como recebido do sistema. Normalmente, trata-se de um único caractere deslocado para baixo no espaço reservado do caractere de controle (0x0-0x1f). Por exemplo, Ctrl+@ (0x40) torna-se NUL (0x00), Ctrl+[ (0x5b) torna-se ESC (0x1b), etc. Algumas combinações de teclas Ctrl são tratadas especialmente de acordo com a tabela a seguir:

Key Sequência
Ctrl + Espaço 0x00 (NUL)
Ctrl + Seta para cima CES [ 1 ; 5 A
Ctrl + Seta para baixo CES [ 1 ; 5 B
Ctrl + Seta para a direita CES [ 1 ; 5 C
Ctrl + Seta para a esquerda CES [ 1 ; 5 D

Observação

Ctrl esquerdo + Alt direito é tratado como AltGr. Quando ambos são vistos juntos, eles serão removidos e o valor Unicode do caractere apresentado pelo sistema será passado para o destino. O sistema irá pré-traduzir os valores AltGr de acordo com as configurações de entrada do sistema atuais.

Amostras

Exemplo de sequências terminais SGR

O código a seguir fornece vários exemplos de formatação de texto.

#include <stdio.h>
#include <wchar.h>
#include <windows.h>

int main()
{
    // Set output mode to handle virtual terminal sequences
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        return GetLastError();
    }

    DWORD dwMode = 0;
    if (!GetConsoleMode(hOut, &dwMode))
    {
        return GetLastError();
    }

    dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    if (!SetConsoleMode(hOut, dwMode))
    {
        return GetLastError();
    }

    // Try some Set Graphics Rendition (SGR) terminal escape sequences
    wprintf(L"\x1b[31mThis text has a red foreground using SGR.31.\r\n");
    wprintf(L"\x1b[1mThis text has a bright (bold) red foreground using SGR.1 to affect the previous color setting.\r\n");
    wprintf(L"\x1b[mThis text has returned to default colors using SGR.0 implicitly.\r\n");
    wprintf(L"\x1b[34;46mThis text shows the foreground and background change at the same time.\r\n");
    wprintf(L"\x1b[0mThis text has returned to default colors using SGR.0 explicitly.\r\n");
    wprintf(L"\x1b[31;32;33;34;35;36;101;102;103;104;105;106;107mThis text attempts to apply many colors in the same command. Note the colors are applied from left to right so only the right-most option of foreground cyan (SGR.36) and background bright white (SGR.107) is effective.\r\n");
    wprintf(L"\x1b[39mThis text has restored the foreground color only.\r\n");
    wprintf(L"\x1b[49mThis text has restored the background color only.\r\n");

    return 0;
}

Observação

No exemplo anterior, a string '\x1b[31m' é a implementação de ESC [ <n> m com <n> sendo 31.

O gráfico a seguir mostra a saída do exemplo de código anterior.

saída do console usando o comando sgr

Exemplo de ativação do processamento de terminal virtual

O código a seguir fornece um exemplo da maneira recomendada de habilitar o processamento de terminal virtual para um aplicativo. A intenção da amostra é demonstrar:

  1. O modo existente deve sempre ser recuperado via GetConsoleMode e analisado antes de ser definido com SetConsoleMode.

  2. Verificar se SetConsoleMode retorna 0 e GetLastError retorna ERROR_INVALID_PARAMETER é o mecanismo atual para determinar quando executado em um sistema de nível inferior. Um aplicativo que recebe ERROR_INVALID_PARAMETER com um dos sinalizadores de modo de console mais recentes no campo bit deve degradar o comportamento e tentar novamente.

#include <stdio.h>
#include <wchar.h>
#include <windows.h>

int main()
{
    // Set output mode to handle virtual terminal sequences
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        return false;
    }
    HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
    if (hIn == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    DWORD dwOriginalOutMode = 0;
    DWORD dwOriginalInMode = 0;
    if (!GetConsoleMode(hOut, &dwOriginalOutMode))
    {
        return false;
    }
    if (!GetConsoleMode(hIn, &dwOriginalInMode))
    {
        return false;
    }

    DWORD dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN;
    DWORD dwRequestedInModes = ENABLE_VIRTUAL_TERMINAL_INPUT;

    DWORD dwOutMode = dwOriginalOutMode | dwRequestedOutModes;
    if (!SetConsoleMode(hOut, dwOutMode))
    {
        // we failed to set both modes, try to step down mode gracefully.
        dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING;
        dwOutMode = dwOriginalOutMode | dwRequestedOutModes;
        if (!SetConsoleMode(hOut, dwOutMode))
        {
            // Failed to set any VT mode, can't do anything here.
            return -1;
        }
    }

    DWORD dwInMode = dwOriginalInMode | dwRequestedInModes;
    if (!SetConsoleMode(hIn, dwInMode))
    {
        // Failed to set VT input mode, can't do anything here.
        return -1;
    }

    return 0;
}

Exemplo de selecionar recursos de atualização de aniversário

O exemplo a seguir pretende ser um exemplo mais robusto de código usando uma variedade de sequências de escape para manipular o buffer, com ênfase nos recursos adicionados na Atualização de Aniversário para Windows 10.

Este exemplo usa o buffer de tela alternativo, manipulando paradas de tabulação, definindo margens de rolagem e alterando o conjunto de caracteres.

// System headers
#include <windows.h>

// Standard library C-style
#include <wchar.h>
#include <stdlib.h>
#include <stdio.h>

#define ESC "\x1b"
#define CSI "\x1b["

bool EnableVTMode()
{
    // Set output mode to handle virtual terminal sequences
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    DWORD dwMode = 0;
    if (!GetConsoleMode(hOut, &dwMode))
    {
        return false;
    }

    dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    if (!SetConsoleMode(hOut, dwMode))
    {
        return false;
    }
    return true;
}

void PrintVerticalBorder()
{
    printf(ESC "(0"); // Enter Line drawing mode
    printf(CSI "104;93m"); // bright yellow on bright blue
    printf("x"); // in line drawing mode, \x78 -> \u2502 "Vertical Bar"
    printf(CSI "0m"); // restore color
    printf(ESC "(B"); // exit line drawing mode
}

void PrintHorizontalBorder(COORD const Size, bool fIsTop)
{
    printf(ESC "(0"); // Enter Line drawing mode
    printf(CSI "104;93m"); // Make the border bright yellow on bright blue
    printf(fIsTop ? "l" : "m"); // print left corner 

    for (int i = 1; i < Size.X - 1; i++)
        printf("q"); // in line drawing mode, \x71 -> \u2500 "HORIZONTAL SCAN LINE-5"

    printf(fIsTop ? "k" : "j"); // print right corner
    printf(CSI "0m");
    printf(ESC "(B"); // exit line drawing mode
}

void PrintStatusLine(const char* const pszMessage, COORD const Size)
{
    printf(CSI "%d;1H", Size.Y);
    printf(CSI "K"); // clear the line
    printf(pszMessage);
}

int __cdecl wmain(int argc, WCHAR* argv[])
{
    argc; // unused
    argv; // unused
    //First, enable VT mode
    bool fSuccess = EnableVTMode();
    if (!fSuccess)
    {
        printf("Unable to enter VT processing mode. Quitting.\n");
        return -1;
    }
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        printf("Couldn't get the console handle. Quitting.\n");
        return -1;
    }

    CONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo;
    GetConsoleScreenBufferInfo(hOut, &ScreenBufferInfo);
    COORD Size;
    Size.X = ScreenBufferInfo.srWindow.Right - ScreenBufferInfo.srWindow.Left + 1;
    Size.Y = ScreenBufferInfo.srWindow.Bottom - ScreenBufferInfo.srWindow.Top + 1;

    // Enter the alternate buffer
    printf(CSI "?1049h");

    // Clear screen, tab stops, set, stop at columns 16, 32
    printf(CSI "1;1H");
    printf(CSI "2J"); // Clear screen

    int iNumTabStops = 4; // (0, 20, 40, width)
    printf(CSI "3g"); // clear all tab stops
    printf(CSI "1;20H"); // Move to column 20
    printf(ESC "H"); // set a tab stop

    printf(CSI "1;40H"); // Move to column 40
    printf(ESC "H"); // set a tab stop

    // Set scrolling margins to 3, h-2
    printf(CSI "3;%dr", Size.Y - 2);
    int iNumLines = Size.Y - 4;

    printf(CSI "1;1H");
    printf(CSI "102;30m");
    printf("Windows 10 Anniversary Update - VT Example");
    printf(CSI "0m");

    // Print a top border - Yellow
    printf(CSI "2;1H");
    PrintHorizontalBorder(Size, true);

    // // Print a bottom border
    printf(CSI "%d;1H", Size.Y - 1);
    PrintHorizontalBorder(Size, false);

    wchar_t wch;

    // draw columns
    printf(CSI "3;1H");
    int line = 0;
    for (line = 0; line < iNumLines * iNumTabStops; line++)
    {
        PrintVerticalBorder();
        if (line + 1 != iNumLines * iNumTabStops) // don't advance to next line if this is the last line
            printf("\t"); // advance to next tab stop

    }

    PrintStatusLine("Press any key to see text printed between tab stops.", Size);
    wch = _getwch();

    // Fill columns with output
    printf(CSI "3;1H");
    for (line = 0; line < iNumLines; line++)
    {
        int tab = 0;
        for (tab = 0; tab < iNumTabStops - 1; tab++)
        {
            PrintVerticalBorder();
            printf("line=%d", line);
            printf("\t"); // advance to next tab stop
        }
        PrintVerticalBorder();// print border at right side
        if (line + 1 != iNumLines)
            printf("\t"); // advance to next tab stop, (on the next line)
    }

    PrintStatusLine("Press any key to demonstrate scroll margins", Size);
    wch = _getwch();

    printf(CSI "3;1H");
    for (line = 0; line < iNumLines * 2; line++)
    {
        printf(CSI "K"); // clear the line
        int tab = 0;
        for (tab = 0; tab < iNumTabStops - 1; tab++)
        {
            PrintVerticalBorder();
            printf("line=%d", line);
            printf("\t"); // advance to next tab stop
        }
        PrintVerticalBorder(); // print border at right side
        if (line + 1 != iNumLines * 2)
        {
            printf("\n"); //Advance to next line. If we're at the bottom of the margins, the text will scroll.
            printf("\r"); //return to first col in buffer
        }
    }

    PrintStatusLine("Press any key to exit", Size);
    wch = _getwch();

    // Exit the alternate buffer
    printf(CSI "?1049l");

}