是否有任何适用于 Windows 的控制台模拟器可以解释 ANSI 颜色?
我们使用 rspec,我们团队的一部分人使用 Windows,所以用于着色的特殊字符串对他们来说不是很有用;)。
答案1
本页上的所有答案均未提及对ANSI 终端控制被添加到Windows 10版本 16257(及更高版本)中的控制台主机。也就是说,它是不不不默认情况下。除非你使用的特定软件启用通过调用 ANSI 进行处理设置控制台模式带有标志的 API ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0004)
,您将看不到颜色或无法获得该应用程序的 ANSI 处理。
启用虚拟终端处理0x0004
https://docs.microsoft.com/windows/console/setconsolemode使用时写文件或者写入控制台,字符被解析为 VT100 和类似的控制字符序列,这些控制字符序列控制光标移动、颜色/字体模式和其他也可以通过现有控制台 API 执行的操作。有关更多信息,请参阅控制台虚拟终端序列。
我猜想本页上显示的示例之所以有效,是因为显然命令echo
(或者可能是批量处理CMD.EXE
或的一部分conhost
)通过调用刚才提到的 API 来启用 ANSI 处理。但是,许多其他写入 或 的工具或可执行文件stdin
可能stdout
不会执行此操作,在这种情况下,您将看不到这些进程的颜色。
幸运的是,全局默认值可以从选择参加到选择退出。注册表项 处HKEY_CURRENT_USER\Console\VirtualTerminalLevel
设置处理 ANSI 转义序列的全局默认行为。创建一个DWORD
项(如有必要)并将其值设置为,以1
全局默认启用(或0
禁用)ANSI 处理。
[HKEY_CURRENT_USER\控制台] “虚拟终端级别”=dword:00000001
请注意,此注册表设置控制默认,这意味着它只会影响那些没有通过调用明确操纵控制台模式的控制台应用程序SetConsoleMode(...)
。因此,虽然注册表值可能有帮助使能够ANSI 为控制台模式忽略应用程序,它不会影响任何控制台模式应用程序(由于某种原因)可能明确禁用ANSI。
答案2
康埃穆支持 ANSI X3.64 和 Xterm 256 色扩展。我是这个控制台模拟器的作者。
在 ConEmu 选项卡中运行的所有进程均处理 Ansi 序列。
据我所知,ConEmu 比 Ansicon 支持更多的代码。
答案3
从 Windows 10 TH2 (v1511) 开始,conhost.exe
(以及扩展cmd.exe
)支持 ANSI 转义序列,特别是颜色:
这有关控制台虚拟终端序列的 MSDN 页面解释支持哪些序列以及如何启用它们:
您可以使用获取控制台模式和设置控制台模式标志来配置此行为。 [...]
以下序列的行为基于 VT100 和派生的终端仿真器技术,特别是 xterm 终端仿真器。有关终端序列的更多信息,请访问http://vt100.net以及http://invisible-island.net/xterm/ctlseqs/ctlseqs.html。
答案4
目前,Win10 中默认未启用 CMD 控制台颜色,因此,要启用它,请将其添加到您的代码中:
#if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwMode = 0;
GetConsoleMode(hOut, &dwMode);
dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
SetConsoleMode(hOut, dwMode);
// References:
//SetConsoleMode() and ENABLE_VIRTUAL_TERMINAL_PROCESSING?
//https://stackoverflow.com/questions/38772468/setconsolemode-and-enable-virtual-terminal-processing
// Windows console with ANSI colors handling
// https://superuser.com/questions/413073/windows-console-with-ansi-colors-handling
#endif