¿Cómo hacer que la consola win32 reconozca las secuencias de escape ANSI/VT100 en `c`?

6 minutos de lectura

Avatar de usuario de Witiko
Witiko

Estoy construyendo una versión ligera de la biblioteca ncurses. Hasta ahora, funciona bastante bien con terminales compatibles con VT100, pero la consola win32 no reconoce el \033 código como el comienzo de una secuencia de escape:

# include <stdio.h>
# include "term.h"

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

Captura de pantalla

¿Qué hay que hacer en el C code nivel, para que se cargue el controlador ANSI.SYS y se reconozcan las secuencias de escape ANSI/VT100?

  • hay colorama módulo para Python: “En Windows, Colorama elimina estos caracteres ANSI de la salida estándar y los convierte en llamadas win32 equivalentes para texto en color. En otras plataformas, Colorama no hace nada”.

    – jfs

    18 de septiembre de 2017 a las 8:25

  • Tenga en cuenta que las reglas del juego han cambiado drásticamente a partir de las versiones recientes de Windows 10.

    – Andreas Rejbrand

    26 de julio de 2018 a las 13:37

  • FYI, en la última versión de Windows 10, puede habilitar ANSI en conhost a través del siguiente reghack: en HKCU\Console crear un DWORD llamado VirtualTerminalLevel y configúralo en 0x1; luego reinicie cmd.exe. — Puedes probarlo con el siguiente powershell "?[1;31mele ?[32mct ?[33mroni ?[35mX ?[36mtar ?[m".Replace('?', [char]27);.

    – BrainSlugs83

    27/10/2018 a las 21:17


  • actualización learn.microsoft.com/en-us/windows/console/… aquí cómo podría habilitarse sin editar el registro y posiblemente romper otras aplicaciones

    – Bogdan Mart

    8 de marzo de 2019 a las 18:13

  • ANSI.SYS es algo que no veo desde los días de WIN98.

    – Luis Felipe

    30 de noviembre de 2022 a las 15:57

Avatar de usuario de Franco Rondini
franco rondini

[UPDATE] Para el último Windows 10, lea la útil contribución de @brainslugs83, justo debajo de los comentarios de esta respuesta.

Mientras que para las versiones anteriores Windows 10 Anniversary Update:

ANSI.SYS tiene la restricción de que solo puede ejecutarse en el contexto del subsistema MS-DOS en Windows 95-Vista.

Microsoft KB101875 explica cómo habilitar ANSI.SYS en una ventana de comandos, pero no se aplica a Windows NT. Según el artículo: todos amamos los coloreslas versiones modernas de Windows no tienen este agradable soporte ANSI.

En cambio, Microsoft creó muchas funciones, pero esto está lejos de su necesidad de operar la secuencia de escape ANSI/VT100.

Para una explicación más detallada, consulte el artículo de wikipedia:

ANSI.SYS también funciona en sistemas derivados de NT para programas heredados de 16 bits que se ejecutan bajo NTVDM.

La consola Win32 no admite secuencias de escape ANSI de forma nativa. Software como Ansicon sin embargo, puede actuar como un envoltorio alrededor de la consola Win32 estándar y agregar soporte para secuencias de escape ANSI.

Por eso pienso ANSICON por Jason Hood es su solución. esta escrito en Cadmite versiones de Windows de 32 y 64 bits y la fuente esta disponible.

También encontré otra pregunta o publicación similar que finalmente se respondió para usar ANSICON:

  • Una vez hice un truco para que ANSI funcionara en Windows XP sin herramientas de terceros. groups.google.com/forum/#!topic/alt.msdos.batch.nt/YZnoq80Mcds

    – est

    20 de octubre de 2015 a las 1:31

  • Cómo cambian los tiempos 😉 En Windows 10 Anniversary Update y más allá, Windows Console se actualizó con un soporte bastante sólido para secuencias ANSI/VT, y en Creators Update, también se actualizó para admitir colores RGB de 24 bits: blogs.msdn.microsoft.com/commandline/2016/09/22/…

    – Rich Turner

    12 de julio de 2017 a las 0:29

  • @Simon gracias, eliminé el enlace porque no funciona por cierto hay un versión archivada de kb/101875 aquí

    – Franco Rondini

    6 de marzo de 2018 a las 19:03

  • FYI, en la última versión de Windows 10, puede habilitar ANSI en conhost a través del siguiente reghack: en HKCU\Console crear un DWORD llamado VirtualTerminalLevel y configúralo en 0x1; luego reinicie cmd.exe. — Puedes probarlo con el siguiente powershell "?[1;31mele ?[32mct ?[33mroni ?[35mX ?[36mtar ?[m".Replace('?', [char]27);.

    – BrainSlugs83

    27 oct 2018 a las 21:18


  • Gracias @brainslugs83 – Respuesta actualizada para citar tu comentario

    – Franco Rondini

    30 oct 2018 a las 17:57

avatar de usuario de rolve
papel

A partir de Windows 10 TH2 (v1511), conhost.exe y cmd.exe Admite secuencias de escape ANSI y VT100 listas para usar (aunque tienen que estar habilitados).

Ver mi respuesta en superusuario para más detalles.

  • Las compilaciones 105xx fueron las únicas compilaciones que tenían secuencias VT100 habilitadas de manera predeterminada. En compilaciones anteriores y posteriores, está deshabilitado de forma predeterminada porque se habilitó por error. Ver aquí para la explicación wpdev.uservoice.com/forums/…

    – Anatol Belsky

    12 de agosto de 2016 a las 0:03

  • FYI, en la última versión de Windows 10, puede habilitar ANSI en conhost a través del siguiente reghack: en HKCU\Console crear un DWORD llamado VirtualTerminalLevel y configúralo en 0x1; luego reinicie cmd.exe. — Puedes probarlo con el siguiente powershell "?[1;31mele ?[32mct ?[33mroni ?[35mX ?[36mtar ?[m".Replace('?', [char]27);.

    – BrainSlugs83

    27 oct 2018 a las 21:18

Basado en @BrainSlugs83, puede activar la versión actual de Windows 10 a través del registro, con esta línea de comando:

REG ADD HKCU\CONSOLE /f /v VirtualTerminalLevel /t REG_DWORD /d 1

  • ¿Es compatible con todas las versiones de Windows 10? ¿O disponible a partir de una actualización específica?

    – Youssef13

    15 de diciembre de 2019 a las 7:02

  • en la primera versión de Windows 10 no es compatible, pero en las actuales funciona bien.

    –Daniel De León

    15 de diciembre de 2019 a las 22:19

  • Quiero saber la versión específica que admite esto.

    – Youssef13

    16 de diciembre de 2019 a las 7:42

  • @Youssef13 Según superusuario.com/a/1300251/702169la primera versión compatible es la compilación 16257.

    – InQβ

    22 de julio de 2021 a las 1:59

Avatar de usuario del lector invitado
Lector invitado

Para Python 2.7, el siguiente script me funciona bien con Windows 10 (v1607)

importar o imprimir '\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"

Result should be:

[35mcolor-test[39m test end

color-test test end

Starting from Windows 10, you can use ENABLE_VIRTUAL_TERMINAL_PROCESSING to enable ANSI escape sequences:

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

Joakim's user avatar
Joakim

If ANSICON is not acceptable since it requires you to install something on the system, a more lightweight solution that parses and translates the ANSI codes into the relevant Win32 API console functions such as SetConsoleTextAttribute.

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

Xantium's user avatar
Xantium

For coloring the cmd you need Windows.h and use SetConsoleTextAttribute() more details can be found in http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047%28v=vs.85%29.aspx

¿Ha sido útil esta solución?