Como fazer console win32 reconhecer seqüências de escape ANSI / VT100?

Eu estou construindo uma versão leve da biblioteca ncurses. Até agora, funciona muito bem com terminais compatíveis com VT100, mas o console do win32 não reconhece o código \033 como o início de uma seqüência de escape:

 # include  # include "term.h" int main(void) { puts(BOLD COLOR(FG, RED) "Bold text" NOT_BOLD " is cool!" CLEAR); return 0; } 

Screenshot

O que precisa ser feito no nível de código C, para que o driver ANSI.SYS seja carregado e as seqüências de escape ANSI / VT100 sejam reconhecidas?

[UPDATE] Antes da atualização do aniversário do Windows 10:

ANSI.SYS tem uma restrição que pode ser executado somente no contexto do subsistema MS-DOS no Windows 95-Vista.

Microsoft KB101875 explica como habilitar ANSI.SYS em uma janela de comando, mas não se aplica ao Windows NT . De acordo com o artigo: todos nós amamos as colors , as versões modernas do Windows não têm esse suporte ANSI agradável.

Em vez disso, a Microsoft criou muitas funções, mas isso está longe de sua necessidade de operar a seqüência de escape ANSI / VT100.

Para uma explicação mais detalhada, veja o artigo da Wikipedia :

ANSI.SYS também funciona em sistemas derivados do NT para programas legados de 16 bits executando sob o NTVDM.

O console do Win32 não suporta nativamente seqüências de escape ANSI. No entanto, softwares como o Ansicon podem atuar como um wrapper no console Win32 padrão e adicionar suporte a seqüências de escape ANSI.

Então eu acho que o ANSICON de Jason Hood é a sua solução. Está escrito em C , suporta versões de 32 bits e 64 bits do Windows, e a fonte está disponível .

Também encontrei alguma outra pergunta ou postagem semelhante que, em última instância, foi respondida para usar o ANSICON:

  • Como carregar códigos de escape ANSI ou obter lista de arquivos coloridos no shell do WinXP cmd?
  • como usar ansi.sys no windows 7
  • Como posso obter cmd.exe para exibir seqüências de escape de cor ANSI?
  • cor ansi em conchas do windows
  • ativar colors ansi no prompt de comando do windows

A partir do Windows 10 TH2 (v1511), o conhost.exe e o cmd.exe suportam seqüências de escape ANSI e VT100 prontas para uso (embora conhost.exe ser ativadas ).

Veja minha resposta no superusuário para mais detalhes.

A partir do Windows 10, você pode usar ENABLE_VIRTUAL_TERMINAL_PROCESSING para ativar sequências de escape ANSI:

https://msdn.microsoft.com/pt-br/library/windows/desktop/mt638032(v=vs.85).aspx

Se ANSICON não for aceitável, uma vez que requer que você instale algo no sistema, uma solução mais leve que analisa e converte os códigos ANSI nas funções relevantes do console de API do Win32 , como SetConsoleTextAttribute .

https://github.com/mattn/ansicolor-w32.c

Para o Python 2.7, o seguinte script funciona bem para mim com o Windows 10 (v1607)

 import os print '\033[35m'+'color-test'+'\033[39m'+" test end" os.system('') #enable VT100 Escape Sequence for WINDOWS 10 Ver. 1607 print '\033[35m'+'color-test'+'\033[39m'+" test end" 

O resultado deve ser:

 [35mcolor-test[39m test end color-test test end 

Para colorir o cmd você precisa do Windows.h usar SetConsoleTextAttribute() mais detalhes podem ser encontrados em http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047%28v=vs.85%29. aspx

Talvez ANSICON possa te ajudar

Basta baixar e extrair arquivos, dependendo do seu sistema operacional Windows: 32 bits ou 64 bits

Instale-o com: ansicon -i

Ansi.sys (na pasta system32) é um “driver MSDOS” fornecido como parte do Windows XP, 2000 e versões anteriores do NT. Em 2000 e XP, está localizado na pasta system32 (não me lembro da estrutura das versões anteriores do NT). Programas que são executados no subsistema DOS e usam a saída padrão podem usar ANSI.SYS da mesma forma que poderiam executar em MSDOS.

Para carregar ansi.sys, você deve usar o comando device = ou devicehigh = em config, como faria no MSDOS. No Windows NT 5 (2K e XP), cada cópia do subsistema DOS pode receber um arquivo de configuração separado no atalho / pif (use o botão “avançado”), e há um arquivo padrão chamado CONFIG.NT (também em a pasta system32), que é usada se o pif / atalho não especificar um arquivo de configuração especial.

Quando ansi.sys é carregado corretamente, o mem / d informará que está carregado. Em versões anteriores do NT, você pode e deve carregar um ambiente DOS adequado para carregar ansi.sys, e ansi art funcionará no prompt. No Win 2K e XP, o carregamento do ansi.sys não afetará o “prompt do CMD” porque o CMD não é um programa do DOS: é um programa de console do Windows de 32 bits. Por alguma razão que eu não entendo, no WinXP, mesmo que você carregue uma cópia fixa do command.com usando “command.com / p”, o prompt de comando não estará habilitado: talvez quando você o fizer dessa maneira, somente emula o comando loading.com?

Em qualquer caso, quando você usa uma versão real do command.com, o ansi é ativado após ser carregado: você pode demonstrar seu uso com um pouco de ansi art como este:

 command /c type ansiart.ans 

(aqui está um exemplo: http://artscene.textfiles.com/ansi/artwork/beastie.ans )

CONFIG.NT (na pasta system32) contém um exemplo da syntax para carregar drivers de dispositivo. Você precisará ser um administrador para editar o arquivo padrão ou fazer uma cópia dele.

No Win 2K e XP, o “atalho” padrão para o MSDOS é um arquivo .PIF, não um arquivo .LNK. Se você criar um arquivo .lnk para o CMD, não poderá definir arquivos especiais de configuração e autoexec; ele usará o CONFIG.NT padrão. Se você quiser usar um arquivo de configuração especial para apenas um aplicativo DOS, você pode fazer uma cópia do “atalho MSDOS”, ou você pode fazer uma cópia de “_default.pif”, encontrado em sua pasta do Windows.

Eu pessoalmente gosto de clink . Ele não apenas processa códigos ANSI, mas também adiciona muitos outros resources para que o Console do Windows se comporte como o bash (histórico, pesquisa de histórico inverso, atalhos de teclado, etc.):

  • A mesma linha que edita como Bash (da biblioteca Readline do GNU).
  • Persistência do histórico entre as sessões.
  • Conclusão sensível ao contexto;
    • Executáveis ​​(e aliases).
    • Comandos de diretório.
    • Variáveis ​​ambientais
    • Ferramentas de terceiros; Git, Mercurial, SVN, Go e P4.
  • Novos atalhos de teclado;
    • Cole da área de transferência ( Ctrl-V ).
    • Pesquisa de histórico incremental ( Ctrl-R / Ctrl-S ).
    • Conclusão poderosa ( TAB ).
    • Desfazer ( Ctrl-Z ).
    • Automático “cd ..” ( Ctrl-PgUp ).
    • Expansão de variables ​​de ambiente ( Ctrl-Alt-E ).
    • (pressione Alt-H para muitos mais …)
  • Conclusão Scriptable com Lua.
  • Prompt colorido e programável.
  • Resposta automática do prompt ” Encerrar trabalho em lote? “.

Eu encontrei esta ferramenta para trabalhar para o meu fim. Microsoft Color Tool do GitHub

Descompacte o arquivo compactado e abra o CMD com permissão de administração.

Vá para a pasta onde você descompactou o arquivo no CMD.

Então execute este comando ” colortool -b scheme-name

O nome do esquema precisa ser substituído por qualquer uma destas opções abaixo:

  • campbell.ini
  • campbell-legacy.ini
  • cmd-legacy.ini
  • deuternopia.itermcolors
  • OneHalfDark.itermcolors
  • OneHalfLight.itermcolors
  • solarized_dark.itermcolors
  • solarized_light.itermcolors

No meu caso, o comando seria assim ” colortool -b solarized_dark.itermcolors

Clique à direita na janela do console e selecione Propriedades.

Você não precisa alterar nenhum valor, basta clicar em “OK” para salvar a configuração. (Você notará que sua fonte já contém colors).

Propriedade do Console

Em seguida, reinicie seu cmd ou powerShell.

A cor ANSI deve estar ativada e funcionando com o esquema de colors escolhido anteriormente.

No último win10, isso pode ser feito por SetConsoleMode(originMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING) . Consulte https://docs.microsoft.com/pt-br/windows/console/console-virtual-terminal-sequences#example