是否有適用於 Windows 的控制台模擬器可以解釋 ANSI 顏色?
我們使用 rspec,我們團隊的一部分使用 Windows,用於著色的特殊字串對他們來說不是很有用;)。
答案1
本頁上的所有答案都沒有提到新支援的一個重要方面ANSI 終端控制被添加到Windows 10版本 16257(及更高版本)中的控制台主機。也就是說,它是n̲o̲t̲ e̲n̲a̲b̲l̲e̲d̲預設情況下。除非您使用的特定軟體使透過呼叫 ANSI 處理設定控制台模式帶有該標誌的 API ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0004)
,您將看不到顏色或獲得該應用程式的 ANSI 處理。
ENABLE_VIRTUAL_TERMINAL_PROCESSING0x0004
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 顏色擴充。我是這個控制台模擬器的作者。
Ansi 序列適用於在 ConEmu 標籤中執行的所有進程。
AFAIK,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