Compartilhar via


Sequências de terminais virtuais do console

As sequências de terminal virtual são sequências de caracteres de controle que podem controlar a movimentação do cursor, a cor do console e outras operações quando gravadas no fluxo de saída. As 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 de habilitar comportamentos de terminal virtual é incluído no final deste documento.

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

Sequências de saída

As sequências de terminal a seguir são interceptadas pelo host do console quando gravadas no fluxo de saída, se o sinalizador ENABLE_VIRTUAL_TERMINAL_PROCESSING for definido no identificador do buffer de tela usando a função SetConsoleMode . Observe que o sinalizador de 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. Nenhum espaço deve ser incluído em sequências de terminal. 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 obter um exemplo de como essas sequências são usadas na prática, consulte o exemplo no final deste tópico.

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

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

O movimento do cursor será limitado pelo visor atual no buffer. A rolagem (se disponível) não ocorrerá.

Sequência Taquigrafia Comportamento
ESC M RI Índice Inverso – 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*
ESC 7 DECSC Salvar posição do cursor na memória**
ESC 8 DECSR Restaurar a posição do cursor da memória**

Observação

* Se houver margens de rolagem definidas, a 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 save. A única maneira de acessar o valor salvo é com o comando de restauração.

Posicionamento do cursor

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

Para todos os parâmetros, as seguintes regras se aplicam, a menos que indicado de outra forma:

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

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

O movimento do cursor será limitado pelo visor atual no buffer. A rolagem (se disponível) não ocorrerá.

Sequência Code Descrição Comportamento
ESC [ <n> A CUU Cursor para cima Cursor para cima por <n>
ESC [ <n> B CUD Cursor para baixo Cursor para baixo por <n>
ESC [ <n> C CUF Cursor Para Frente Cursor para a frente (direita) por <n>
ESC [ <n> D FILHOTE Cursor para trás Cursor para trás (esquerda) por <n>
ESC [ <n> E CNL Próxima Linha do Cursor Cursor para baixo <n> linhas da posição atual
ESC [ <n> F CPL Linha anterior do cursor Cursor n <> linhas da posição atual
ESC [ <n> G CHA Cursor Horizontal Absolute O cursor move para <n>th posição horizontalmente na linha atual
ESC [ <n> d VPA Posição de linha vertical absoluta O cursor move-se para a <n>th posição verticalmente na coluna atual
ESC [ <y> ; <x> H CHÁVENA Posição do cursor *O cursor move para <x>; <coordenada y> dentro do visor, onde <x> é a coluna da <linha y>
ESC [ <y> ; <x> f HVP Posição vertical horizontal *O cursor move para <x>; <coordenada y> dentro do visor, onde <x> é a coluna da <linha y>
ESC [ s ANSISYSSC Salvar Cursor – emulação Ansi.sys **Sem parâmetros, executa uma operação de salvamento de cursor, como DECSC
ESC [ u ANSISYSRC Restaurar cursor – emulação Ansi.sys **Sem parâmetros, executa uma operação de cursor de restauração 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 https://msdn.microsoft.com/library/cc722862.aspx e implementada para conveniência/compatibilidade.

Visibilidade do cursor

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

Sequência Code Descrição Comportamento
ESC [ ? 12 h ATT160 Cursor de Texto Habilitar Piscar Iniciar o cursor piscando
ESC [ ? 12 l ATT160 Desabilitar o cursor de texto piscando Parar de piscar o cursor
ESC [ ? 25 h DECTCEM Exibição de modo habilitar o cursor de texto Mostrar o cursor
ESC [ ? 25 l DECTCEM Ocultar modo habilitar o cursor de texto Ocultar o cursor

Dica

As sequências de habilitação terminam em um caractere H em letras minúsculas (h) e as sequências de desabilitaçã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 Code Descrição Comportamento
ESC [ 0 SP q DECSCUSR Forma do Usuário Forma de cursor padrão configurada pelo usuário
ESC [ 1 SP q DECSCUSR Bloco piscando Forma do cursor de bloco piscando
ESC [ 2 SP q DECSCUSR Bloco Estável Forma do cursor de bloco estável
ESC [ 3 SP q DECSCUSR Sublinhado piscando Forma do cursor de sublinhado piscando
ESC [ 4 SP q DECSCUSR Sublinhado Estável Forma do cursor de sublinhado estável
ESC [ 5 SP q DECSCUSR Barra piscando Forma do cursor da barra piscando
ESC [ 6 SP q DECSCUSR Barra Estável Forma do cursor de barra estável

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 visor

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

Cuidado Os nomes de comando são enganosos. A rolagem refere-se à direção em que o texto se move durante a operação, e não para que modo o visor parece se mover.

Sequência Code Descrição Comportamento
ESC [ <n> S UA Rolar para cima Role o texto para cima por <n>. Também conhecida como pan down, novas linhas são preenchidas na parte inferior da tela
ESC [ <n> T SD Rolar para baixo Role para baixo por <n>. Também conhecida como pan-up, novas linhas são preenchidas na parte superior da tela

O texto é movido a partir da linha em que o cursor está ativado. Se o cursor estiver na linha intermediária do visor, role para cima movendo a metade inferior do visor e insira 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 observar que a rolagem para cima e para baixo também é afetada 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 omitido opcionalmente.

Modificação de texto

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

Sequência Code Descrição Comportamento
ESC [ <n> @ ICH 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 à direita é removido.
ESC [ <n> P DCH Excluir Caractere Exclua <n> caracteres na posição atual do cursor, mudando em caracteres de espaço da borda direita da tela.
ESC [ <n> X ECH Apagar caractere Apagar n> caracteres <da posição atual do cursor substituindo-os com um caractere de espaço.
ESC [ <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.
ESC [ <n> M DL Excluir linha Exclui n> linhas <do buffer, começando com a linha em que o cursor está ativado.

Observação

Para IL e DL, somente as linhas nas margens de rolagem (ver 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 serã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 do visor nunca são afetadas.

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

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

  • 0 apaga da posição atual do cursor (inclusive) até o final da linha/exibição
  • 1 apaga desde o início da linha/exibição até e incluindo a posição atual do cursor
  • 2 apaga toda a linha/exibição
Sequência Code Descrição Comportamento
ESC [ <n> J ED Apagar em Exibição Substituir todo o texto no visor/tela atual especificado por n> por <caracteres de espaço
ESC [ <n> K EL Apagar na linha Substituir 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 geralmente são equivalentes a chamar APIs de console SetConsoleTextAttribute para ajustar a formatação de todas as gravações futuras no buffer de texto de saída do console.

Esse comando é especial porque 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 Code Descrição Comportamento
ESC [ <n> m SGR Definir representação de gráficos Definir o formato da tela e do texto conforme especificado por <n>

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

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 opção mais à direita tendo precedência.

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 tornar a posição "azul" na tabela exibir um tom RGB de vermelho, todas as chamadas para Foreground Blue exibirão essa cor vermelha até que seja alterada de outra forma.

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

Cores Estendidas

Alguns emuladores de terminal virtual dão suporte a uma paleta de cores maior 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 cores 16 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.

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

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

Cores da Tela

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

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

Observe que essa sequência é uma sequência "Comando do sistema operacional" da OSC e não um CSI como muitas das outras sequências listadas e, como tal, comece com "\x1b]", não "\x1b[". Como sequências de OSC, elas são encerradas com um Terminador de Cadeia de Caracteres representado como <ST> e transmitido com ESC \ (0x1B 0x5C). BEL (0x7) pode ser usado como terminador, mas o formulário mais longo é preferencial.

Sequência Descrição Comportamento
ESC ] 4 ; <i> ; rgb : <r> / <g> / <b><ST> Modificar cores da tela Define o índice <de paleta de cores de 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. Há dois conjuntos diferentes de modos de entrada, o Modo de Teclas de Cursor e o Modo de Teclas do Teclado. O Modo de Teclas de Cursor controla as sequências emitidas pelas teclas de direção, bem como Página Inicial e Final, enquanto o Modo teclas do teclado controla as sequências emitidas pelas teclas no numpad principalmente, bem como as chaves de função.

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

Consulte as seções Teclas de Cursor e Numpad &Chaves de Função para as sequências emitidas nesses modos.

Sequência Code Descrição Comportamento
ESC = DECKPAM Habilitar o modo de aplicativo do teclado As teclas do teclado emitirão suas sequências do Modo de Aplicativo.
ESC > DECKPNM Habilitar o modo numérico do teclado As teclas do teclado emitirão suas sequências de Modo Numérico.
ESC [ ? 1 h DECCKM Habilitar o modo de aplicativo de chaves de cursor As teclas do teclado emitirão suas sequências do Modo de Aplicativo.
ESC [ ? 1 l DECCKM Desabilitar o modo de aplicativo de chaves de cursor (use o modo normal) As teclas do teclado emitirão suas sequências de Modo Numérico.

Estado da consulta

Todos os comandos nesta seção geralmente são equivalentes a chamar APIs de 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 está fazendo a consulta sempre desejará receber a resposta.

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

Guias

Embora o console do Windows tradicionalmente espere que as guias sejam exclusivamente de oito caracteres de largura, *os aplicativos nix que utilizam determinadas 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 dentro da janela do console, remova-os e navegue entre eles.

Sequência Code Descrição Comportamento
ESC H HTS Conjunto de Guias Horizontais Define uma parada de tabulação na coluna atual em que o cursor está.
ESC [ <n> I CHT Guia Horizontal do Cursor (Avançar) Avance 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, mova para a última coluna da linha. Se o cursor estiver na última coluna, mova para a primeira coluna da próxima linha.
ESC [ <n> Z CBT 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, mova o cursor para a primeira coluna. Se o cursor estiver na primeira coluna, não mova o cursor.
ESC [ 0 g TBC Tab Clear (coluna atual) Limpa a parada de tabulação na coluna atual, se houver uma. Caso contrário, não faz nada.
ESC [ 3 g TBC Limpar tabulação (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 nenhuma parada de tabulação definida por meio de HTS, CHT e CBT tratarão as primeiras e últimas colunas da janela como as duas únicas paradas de tabulação.
  • Usar o 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 o 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 que eles sejam exibidos como outros glifos na própria tela do terminal. Atualmente, os dois únicos conjuntos de caracteres com suporte são ASCII (padrão) e o Conjunto de Caracteres gráficos especiais dec. Consulte http://vt100.net/docs/vt220-rm/table2-4.html uma listagem de todos os caracteres representados pelo conjunto de caracteres gráficos especiais dec.

Sequência Descrição Comportamento
ESC ( 0 Designar Conjunto de Caracteres – Desenho de Linha DEC Habilita o modo de desenho de linha DEC
ESC ( B Designar conjunto de caracteres – US ASCII Habilita o modo ASCII (padrão)

Notavelmente, o modo 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 afetada pelas operações de rolagem. Esse é um subconjunto das linhas que são ajustadas quando a tela rolaria de outra forma, por exemplo, em um '\n' ou RI. Essas margens também afetam as linhas modificadas por IL (Insert Line) e Delete Line (DL), Scroll Up (SU) e Scroll Down (SD).

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

Para DECSTBM, há dois parâmetros opcionais, <t> e <b>, que são usados para especificar as linhas que representam as linhas superior e inferior da região de rolagem, inclusive. Se os parâmetros forem omitidos, <o padrão t> será 1 e <b> será padrão para a altura atual do visor.

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

Sequência Code Descrição Comportamento
ESC [ <t> ; <b> r DECSTBM Definir a 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 de cadeia de caracteres> especificado<. 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 de "comando do sistema operacional" da OSC, 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 de OSC, elas são encerradas com um Terminador de Cadeia de Caracteres representado como <ST> e transmitido com ESC \ (0x1B 0x5C). BEL (0x7) pode ser usado como terminador, mas o formulário mais longo é preferencial.

Sequência Descrição Comportamento
ESC ] 0 ; <corda><ST> Definir Título da Janela Define o título da janela do console como cadeia <de caracteres>.
ESC ] 2; <corda><ST> Definir Título da Janela Define o título da janela do console como cadeia <de caracteres>.

O caractere de terminação aqui é o caractere "Bell", '\x07'

Buffer de Tela Alternativo

*Os aplicativos de 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 rolagem.

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

Sequência Descrição Comportamento
ESC [ ? 10 4 9 h Usar buffer de tela alternativo Alterna para um novo buffer de tela alternativo.
ESC [ ? 10 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 à API de console SetConsoleScreenBufferInfoEx para definir a largura da janela.

Sequência Code Descrição Comportamento
ESC [ ? 3 h DECCOLM Definir número de colunas como 132 Define a largura do console como 132 colunas de largura.
ESC [ ? 3 l DECCOLM Definir número de colunas como 80 Define a largura do console como 80 colunas de largura.

Redefinição reversível

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 listados 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 de Cursor: Modo Normal (DECCKM)
  • Margens superior e inferior: top=1, altura inferior=console (DECSTBM)
  • Conjunto de Caracteres: US ASCII
  • Representação de gráficos: SGR (padrão/desativado)
  • Salvar o estado do cursor: Posição inicial (0,0) (DECSC)
Sequência Code Descrição Comportamento
ESC [ ! p DECSTR Redefinição reversível Redefina determinadas configurações de terminal para seus padrões.

Sequências de Entrada

As sequências de terminal a seguir 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.

Há dois modos internos que controlam quais sequências são emitidas para as chaves de entrada fornecidas, o Modo de Teclas de Cursor e o Modo de Teclas do Teclado. Elas são descritas na seção Alterações de Modo.

Teclas de cursor

Chave Modo Normal Modo de Aplicativo
Seta para cima ESC [ A ESC O A
Seta para Baixo ESC [ B ESC O B
Seta para a Direita ESC [ C ESC O C
Seta para a Esquerda ESC [ D ESC O D
Página Inicial ESC [ H ESC O H
participante ESC [ F ESC O F

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

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

Numpad &Function Keys

Chave Sequência
Tecla Backspace 0x7f (DEL)
Pausa 0x1a (SUB)
Fuga 0x1b (ESC)
Inserir ESC [ 2 ~
Excluir ESC [ 3 ~
Página Para Cima ESC [ 5 ~
Página Para Baixo ESC [ 6 ~
F1 ESC O P
F2 ESC O Q
F3 ESC O R
F4 ESC O S
F5 ESC [ 15 ~
F6 ESC [ 17 ~
F7 ESC [ 18 ~
F8 ESC [ 19 ~
F9 ESC [ 2 0 ~
F10 ESC [ 2 1 ~
F11 ESC [ 2 3 ~
F12 ESC [ 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 maneira, exceto que o sistema operacional terá pré-deslocado a <chave c> para o caractere de controle apropriado que será retransmitido para o aplicativo.

Ctrl geralmente é passado exatamente como recebido do sistema. Normalmente, esse é 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:

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

Observação

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

Amostras

Exemplo de sequências de terminal do 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 cadeia de caracteres '\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 habilitaçã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 do exemplo é demonstrar:

  1. O modo existente sempre deve ser recuperado por meio de 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 ao executar 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 de bits deve degradar normalmente 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 destina-se a 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");

}