Вопрос или проблема
Существует ли эмулятор консоли для Windows, который интерпретирует ANSI цветовую раскраску?
Мы используем rspec, и часть нашей команды использует Windows, и специальные строки для раскраски не очень полезны для них ;).
Ни один из ответов на этой странице не упоминает важный аспект новой поддержки ANSI управления терминалом, которая была добавлена в Windows 10 консольный хост в сборке 16257 (и позже). А именно, по умолчанию она не включена. Если конкретное программное обеспечение, которое вы используете, включает обработку ANSI, вызывая SetConsoleMode API с флагом ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0004)
, вы не увидите цветов и не получите обработку ANSI для этого приложения.
ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
https://docs.microsoft.com/windows/console/setconsolemodeПри записи с помощью WriteFile или WriteConsole, символы анализируются для VT100 и подобных последовательностей управляющих символов, которые управляют движением курсора, цветом/шрифтом и другими операциями, которые также могут выполняться через существующие консольные API. Для получения дополнительной информации см. последовательности виртуального терминала консоли.
Я предполагаю, что причина, по которой примеры на этой странице работают, заключается в том, что, по-видимому, команда echo
(или, возможно, пакетная обработка части CMD.EXE
или conhost
) включает обработку ANSI, вызывая упомянутый API. Но многие другие инструменты или исполняемые файлы, которые записывают в stdin
или stdout
, могут этого не делать, в этом случае вы не увидите цвета для этих процессов.
К счастью, глобальный параметр по умолчанию можно изменить с оптимизированного на оптимизированный выход. Регистровый ключ HKEY_CURRENT_USER\Console\VirtualTerminalLevel
устанавливает глобальное поведение по умолчанию для обработки последовательностей ANSI. Создайте ключ DWORD
(если необходимо) и установите его значение на 1
, чтобы глобально включить (или 0
, чтобы отключить) обработку ANSI по умолчанию.
[HKEY_CURRENT_USER\Console] "VirtualTerminalLevel"=dword:00000001
Обратите внимание, что эта настройка реестра контролирует значение по умолчанию, что означает, что она влияет только на консольные приложения, которые не манипулируют режимом консоли, вызывая SetConsoleMode(...)
. Следовательно, хотя значение реестра может помочь включить ANSI для приложений, не знающих о режиме консоли, оно не окажет никакого воздействия на любое приложение, знающее о режиме консоли, которое (почему-то) может отключить ANSI.
ConEmu поддерживает ANSI X3.64 с расширением Xterm 256 цветов. Я автор этого эмулятора консоли.
Секреты ANSI обрабатываются для всех процессов, работающих на вкладках ConEmu.
Насколько мне известно, 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 цветов в консоли
Для версий Windows ниже 10 консоль команд Windows не поддерживает цветной вывод по умолчанию. Вы можете установить либо Cmder, ConEmu, ANSICON или Mintty (используется по умолчанию в GitBash и Cygwin), чтобы добавить поддержку раскраски в вашу консоль команд Windows.
Windows 10 – Цвета командной строки
Начиная с Windows 10 консоль Windows поддерживает последовательности ANSI Escape и некоторые цвета по умолчанию.
Демонстрация
Пакетная команда
Файл win10colors.cmd
был написан Микеле Локатти:
@echo off
cls
echo [101;93m СТИЛИ [0m
echo ^<ESC^>[0m [0mСброс[0m
echo ^<ESC^>[1m [1mЖирный[0m
echo ^<ESC^>[4m [4mПодчеркнутый[0m
echo ^<ESC^>[7m [7mОбратный[0m
echo.
echo [101;93m НОРМАЛЬНЫЕ ЦВЕТА ТЕКСТА [0m
echo ^<ESC^>[30m [30mЧерный[0m (черный)
echo ^<ESC^>[31m [31mКрасный[0m
echo ^<ESC^>[32m [32mЗеленый[0m
echo ^<ESC^>[33m [33mЖелтый[0m
echo ^<ESC^>[34m [34mСиний[0m
echo ^<ESC^>[35m [35mПурпурный[0m
echo ^<ESC^>[36m [36mЦиан[0m
echo ^<ESC^>[37m [37mБелый[0m
echo.
echo [101;93m НОРМАЛЬНЫЕ ФОНЫ [0m
echo ^<ESC^>[40m [40mЧерный[0m
echo ^<ESC^>[41m [41mКрасный[0m
echo ^<ESC^>[42m [42mЗеленый[0m
echo ^<ESC^>[43m [43mЖелтый[0m
echo ^<ESC^>[44m [44mСиний[0m
echo ^<ESC^>[45m [45mПурпурный[0m
echo ^<ESC^>[46m [46mЦиан[0m
echo ^<ESC^>[47m [47mБелый[0m (белый)
echo.
echo [101;93m СИЛЬНЫЕ ЦВЕТА ТЕКСТА [0m
echo ^<ESC^>[90m [90mБелый[0m
echo ^<ESC^>[91m [91mКрасный[0m
echo ^<ESC^>[92m [92mЗеленый[0m
echo ^<ESC^>[93m [93mЖелтый[0m
echo ^<ESC^>[94m [94mСиний[0m
echo ^<ESC^>[95m [95mПурпурный[0m
echo ^<ESC^>[96m [96mЦиан[0m
echo ^<ESC^>[97m [97mБелый[0m
echo.
echo [101;93m СИЛЬНЫЕ ФОНЫ [0m
echo ^<ESC^>[100m [100mЧерный[0m
echo ^<ESC^>[101m [101мКрасный[0m
echo ^<ESC^>[102m [102мЗеленый[0m
echo ^<ESC^>[103m [103мЖелтый[0m
echo ^<ESC^>[104m [104мСиний[0m
echo ^<ESC^>[105m [105мПурпурный[0m
echo ^<ESC^>[106m [106мЦиан[0m
echo ^<ESC^>[107m [107мБелый[0m
echo.
echo [101;93m КОМБИНАЦИИ [0m
echo ^<ESC^>[31m [31мкрасный цвет текста[0m
echo ^<ESC^>[7m [7мобратный цвет текста ^<-^> фон[0m
echo ^<ESC^>[7;31m [7;31мобратный красный цвет текста[0m
echo ^<ESC^>[7m и вложенные ^<ESC^>[31m [7мдо [31минесенного[0m
echo ^<ESC^>[31m и вложенные ^<ESC^>[7m [31мдо [7минесенного[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);
// Ссылки:
//SetConsoleMode() и ENABLE_VIRTUAL_TERMINAL_PROCESSING?
//https://stackoverflow.com/questions/38772468/setconsolemode-and-enable-virtual-terminal-processing
// Консоль Windows с обработкой ANSI цветов
// https://superuser.com/questions/413073/windows-console-with-ansi-colors-handling
#endif
Windows Terminal поддерживает коды ANSI escape:
https://github.com/microsoft/terminal
Это открытый исходный код, и вы также можете скачать сборки отсюда:
В Windows 10/11 ANSI включен по умолчанию. Протестируйте с помощью:
echo AZ←[30mER←[31mTY←[32mUI←[33mOP←[34mQS←[35mDF←[36mGH←[0m>con:
Символ [←] – это ASCII символ 27, названный ESC, вводимый с помощью [Alt]+”27″; 27 вводится с использованием цифровой клавиатуры.
Хотя вы можете включить кодировку ANSI, используя вышеуказанные методы, это имеет свои ограничения. Вместо того чтобы проходить через громоздкие процессы, вы можете использовать Git Bash, который кодирует все ANSI цвета, и его легко использовать.
Вот код для безопасной активации последовательностей виртуального терминала консоли в ваших собственных программах. Это больше или меньше сокращение и вставка кода с сайта 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 << "мигание";
cout << "\x1B[10;20fПривет";
cout << "\x1B[11;20fМир" << endl;
}
Вот что я использую – set
обновит текущий запрос терминала, а setx
обновит его для будущих терминалов. Обратите внимание: set
использует ‘=’, в то время как setx
использует ‘ ‘.
set prompt=$_$E[1;32m[$P]$E[0m$_$G$S
setx prompt $_$E[1;32m[$P]$E[0m$_$G$S
Ответ или решение
Поддержка ANSI-цветов в консоли Windows
Введение
ANSI-коды для управления цветами в консоли являются важной частью пользовательского опыта для разработчиков, особенно в контексте использования инструментов тестирования, таких как RSpec. Вопрос о поддержке ANSI-цветов в Windows, особенно в контексте версий Windows 10 и выше, становится все более актуальным. В данной статье мы подробно рассмотрим, как консоль Windows обрабатывает ANSI-коды, возможности использования сторонних эмуляторов консоли и методы их активации.
Поддержка ANSI-кодов в Windows
С версии Windows 10 build 16257 и выше, консоль Windows (conhost.exe) начала поддерживать ANSI Escape Sequences, что позволяет более гибко использовать цвета и форматирование текста. Однако стоит отметить, что эта поддержка не включена по умолчанию. Программное обеспечение должно вызывать API SetConsoleMode
с флагом ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0004)
, чтобы активировать эту возможность.
Ознакомьтесь с основными аспектами:
- API для активации: Для включения поддержки ANSI-кодов необходимо использовать API-функцию Windows
SetConsoleMode
. - Глобальная настройка: Можно изменить реестр системы, чтобы сделать обработку ANSI-кодов глобальной по умолчанию. Это делается добавлением
DWORD
ключа вHKEY_CURRENT_USER\Console\VirtualTerminalLevel
и установкой его значения на1
.
Использование сторонних эмуляторов консоли
Для версий Windows до 10 и в случаях, когда необходимо обеспечить полную совместимость с ANSI-кодами, следует рассмотреть использование сторонних эмуляторов. Некоторые из них включают:
-
ConEmu:
- Высокопроизводительный эмулятор консоли, который поддерживает ANSI X3.64 и позволяет запускать множество процессов в отдельных вкладках. ConEmu обрабатывает ANSI-коды для всех процессов, запущенных во вкладках.
-
Cmder:
- Портативная консольная среда, построенная на базе ConEmu, с дополнительно установленными Unix-подобными инструментами.
-
ANSICON:
- Легковесный инструмент, который позволяет добавлять поддержку ANSI-кодов в стандартную консоль Windows.
-
Mintty:
- Эмулятор терминала, используемый в Cygwin и Git Bash, который поддерживает полные ANSI-коды.
Активация ANSI-цветов в программе
Если необходимо программно активировать поддержку ANSI-цветов в вашем приложении, можно использовать следующий образец кода на C++:
#include <windows.h>
#include <iostream>
int main() {
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD mode;
GetConsoleMode(hOut, &mode);
SetConsoleMode(hOut, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
std::cout << "\x1B[31mТекст красного цвета\x1B[0m" << std::endl; // Вывод красного текста
}
Этот код активирует поддержку ANSI-кодов и выводит текст красного цвета.
Заключение
Поддержка ANSI-цветов в консоли Windows, обеспеченная с версии Windows 10, значительно улучшает удобство работы с текстом. Хотя изначально эта функция не включена по умолчанию, она может быть активирована как программно, так и через изменения в реестре. Сторонние эмуляторы консоли, такие как ConEmu и Cmder, предоставляют расширенные возможности для работы с ANSI-кодами и могут быть рекомендованы для более универсального использования.
Рекомендуемая литература
- Документация Microsoft по последовательностям виртуального терминала консоли
- Примеры использования ANSI-кодов на GitHub
С учетом описанных выше аспектов, команды, использующие RSpec и работающие на Windows, могут испытывать гораздо меньшие проблемы с отображением цветного вывода, что улучшает общую работу команды и повышает качество процессов тестирования.