Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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.
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:
O modo existente deve sempre ser recuperado via GetConsoleMode e analisado antes de ser definido com SetConsoleMode.
Verificar se SetConsoleMode retorna
0e 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");
}