Существует ли эмулятор консоли для Windows, который интерпретирует цветовую гамму ANSI?
Мы используем rspec, а часть нашей команды использует Windows, и специальная строка для раскрашивания для них не очень полезна ;).
решение1
Ни один из ответов на этой странице не упоминает важный аспект новой поддержкиТерминальное управление ANSIкоторый был добавлен вВиндовс 10Консольный хост в сборке 16257 (и более поздних). А именно, этоне включенопо умолчанию. Если только конкретное программное обеспечение, которое вы используете,позволяетОбработка ANSI путем вызоваУстановитьКонсольныйРежимAPI с этим ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0004)
флагом, вы не увидите цвета или не получите обработку ANSI для этого приложения.
ВКЛЮЧИТЬ_ОБРАБОТКУ_ВИРТУАЛЬНОГО_ТЕРМИНАЛА0x0004
https://docs.microsoft.com/windows/console/setconsolemodeПри письме сWriteFileилиWriteConsole, символы анализируются для VT100 и аналогичных последовательностей управляющих символов, которые управляют перемещением курсора, режимом цвета/шрифта и другими операциями, которые также могут быть выполнены через существующие консольные API. Для получения дополнительной информации см. Console Virtual Terminal Sequences.
Я предполагаю, что причина, по которой примеры, показанные на этой странице, работают, заключается в том, что, по-видимому, команда echo
(или, возможно,пакетная обработкачасть CMD.EXE
или conhost
) включает обработку ANSI, вызывая только что упомянутый API. Но многие другие инструменты или исполняемые файлы, которые пишут в stdin
или , stdout
могут этого не делать, и в этом случае вы не увидите цвета для этих процессов.
К счастью, глобальное значение по умолчанию можно изменить свыбрать вкуклоняться. Ключ реестра в HKEY_CURRENT_USER\Console\VirtualTerminalLevel
устанавливает глобальное поведение по умолчанию для обработки escape-последовательностей ANSI. Создайте DWORD
ключ (при необходимости) и задайте его значение для 1
глобального включения (или 0
отключения) обработки ANSI по умолчанию.
[HKEY_CURRENT_USER\Консоль] "VirtualTerminalLevel"=dword:00000001
Обратите внимание, что этот параметр реестра управляетпо умолчанию, что означает, что это влияет только на консольные приложения, которые явно не манипулируют консольным режимом, вызывая SetConsoleMode(...)
. Из этого следует, что, хотя значение реестра может помочьдавать возможностьANSI дляконсольный-режим-незабываемыйприложения, это не окажет никакого влияния на какие-либоконсольный-режим-знающийприложение, которое (по какой-то причине) может явнозапрещатьАНСИ.
решение2
ConEmuподдерживает ANSI X3.64 с расширением цвета Xterm 256. Я автор этого эмулятора консоли.
Последовательности ANSI обрабатываются для всех процессов, запущенных на вкладках ConEmu.
Насколько мне известно, ConEmu поддерживает больше кодов, чем Ansicon.
решение3
Начиная с Windows 10 TH2 (v1511), conhost.exe
(и, соответственно, cmd.exe
) поддерживаются управляющие последовательности ANSI, в частности цвета:
TheСтраница MSDN о последовательностях виртуальных терминалов консолиобъясняет, какие последовательности поддерживаются и как их включить:
Вы можете использоватьПолучитьКонсольныйРежимиУстановитьКонсольныйРежимфлаги для настройки этого поведения. [...]
Поведение следующих последовательностей основано на VT100 и производных технологиях эмулятора терминала, в частности эмуляторе терминала xterm. Более подробную информацию о последовательностях терминала можно найти наhttp://vt100.netи вhttp://invisible-island.net/xterm/ctlseqs/ctlseqs.html.
решение4
В настоящее время цвета консоли CMD по умолчанию не включены в Win10, поэтому, чтобы включить их, добавьте в свой код следующее:
#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