Как сделать консоль win32 распознать escape-последовательности ANSI/VT100?
Я создаю легкую версию библиотеки ncurses. Пока это хорошо работает с терминалами, совместимыми с VT100, но консоль win32 не может распознать код \033
как начало escape-последовательности:
# include <stdio.h>
# include "term.h"
int main(void) {
puts(BOLD COLOR(FG, RED) "Bold text" NOT_BOLD " is cool!" CLEAR);
return 0;
}
![Screenshot]()
Что нужно сделать на уровне кода C, чтобы загрузить драйвер ANSI.SYS и распознать escape-последовательности ANSI/VT100?
Ответы
Ответ 1
[ОБНОВЛЕНИЕ] Для последней версии Windows 10, пожалуйста, прочитайте полезный вклад @brainslugs83, чуть ниже в комментариях к этому ответу.
В то время как для версий до Windows 10 Anniversary Update
:
ANSI.SYS имеет ограничение, что он может работать только в контексте подсистемы MS-DOS под Windows 95-Vista.
Microsoft KB101875 объясняет, как включить ANSI.SYS в командном окне, но это не относится к Windows NT. Согласно статье: мы все любим цвета, современные версии Windows не имеют этой хорошей поддержки ANSI.
Вместо этого Microsoft создала множество функций, но это далеко от необходимости использовать управляющую последовательность ANSI/VT100.
Для более подробного объяснения см. Статью в Википедии:
ANSI.SYS также работает в системах, производных от NT, для 16-разрядных устаревших программ, выполняющихся под NTVDM.
Консоль Win32 вообще не поддерживает escape-последовательности ANSI. Программное обеспечение, такое как Ansicon, может, однако, выступать в качестве оболочки вокруг стандартной консоли Win32 и добавлять поддержку escape-последовательностей ANSI.
Поэтому я думаю, что ANSICON от Jason Hood - это ваше решение. Он написан на C, поддерживает 32-битные и 64-битные версии Windows, и источник доступен.
Также я нашел другой похожий вопрос или пост, на который в конечном итоге был дан ответ на использование ANSICON:
Ответ 2
Начиная с Windows 10 TH2 (v1511), conhost.exe
и cmd.exe
поддерживают ANSI и VT100 Escape Sequences из коробки (хотя они должны быть включен).
Подробнее см. мой ответ на суперпользователя.
Ответ 3
Начиная с Windows 10, вы можете использовать ENABLE_VIRTUAL_TERMINAL_PROCESSING
, чтобы включить escape-последовательности ANSI:
https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032(v=vs.85).aspx
Ответ 4
Для Python 2.7 следующий script работает для меня отлично с Windows 10 (v1607)
import os
print '\ 033 [35m' + 'color-test' + '\ 033 [39m' + "тестовый конец"
os.system('') #enable VT100 Escape Sequence для WINDOWS 10 Ver. 1607
print '\ 033 [35m' + 'color-test' + '\ 033 [39m' + "тестовый конец"
Код>
Результат должен быть:
[35mcolor-test [конец теста 39 м
тест на тест-тест цвета
Код>
Ответ 5
Если ANSICON неприемлемо, поскольку требует установки чего-то в системе, более легкое решение, которое анализирует и переводит коды ANSI в соответствующий Win32 API консольные функции, такие как SetConsoleTextAttribute.
https://github.com/mattn/ansicolor-w32.c
Ответ 6
Для раскрашивания cmd вам нужен Windows.h
и используйте SetConsoleTextAttribute()
более подробную информацию можно найти в http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047%28v=vs.85%29. ASPX
Ответ 7
Может быть ANSICON может помочь u
Просто загрузите и извлеките файлы, в зависимости от ваших окон os: 32bit или 64bit
Установите его с помощью: ansicon -i
Ответ 8
Мне лично нравится клик. Он не только обрабатывает коды ANSI, но также добавляет множество других функций, поэтому Windows Console ведет себя как bash (история, обратный поиск истории, сочетания клавиш и т.д.):
- То же редактирование строки, что и Bash (из библиотеки Readline GNU).
- Сохранение истории между сеансами.
- Контекстно-зависимое завершение;
- Исполняемые файлы (и псевдонимы).
- Команды каталога.
- Переменные среды
- Инструменты третьей стороны; Git, Mercurial, SVN, Go и P4.
- Новые сочетания клавиш;
- Вставить из буфера обмена (Ctrl-V).
- Инкрементный поиск истории ( Ctrl-R/Ctrl-S).
- Мощное завершение ( TAB).
- Отменить ( Ctrl-Z).
- Автоматический "cd.." ( Ctrl-PgUp).
- Расширение переменной среды ( Ctrl-Alt-E).
- (нажмите Alt-H для многих других...)
- Заполнение сценария с помощью Lua.
- Запрос цвета и сценария.
- Автоответчик приглашения Завершить пакетное задание? ".
Ответ 9
Ansi.sys(в папке system32) - это "драйвер MSDOS", предоставляемый как часть Windows XP, 2000 и более ранних версий NT. В 2000 и XP он находится в папке system32 (я не помню структуру более ранних версий NT). Программы, которые работают в подсистеме DOS и используют стандартный вывод, могут использовать ANSI.SYS так же, как они могут работать через MSDOS.
Чтобы загрузить ansi.sys, вы должны использовать команду device = или devicehigh = в config, как и в MSDOS. В Windows NT 5 (2K и XP) каждой копии подсистемы DOS может быть предоставлен отдельный файл конфигурации в pif/shortcut (используйте кнопку "advanced" ), и есть файл по умолчанию CONFIG.NT(также в папка system32), которая используется, если pif/shortcut не указывает специальный файл конфигурации.
Когда ansi.sys загружен правильно, mem/d сообщит, что он загружен. В более ранних версиях NT вы можете и должны загружать надлежащую среду DOS для загрузки ansi.sys, и ansi art будет работать в командной строке. В Win 2K и XP загрузка ansi.sys не повлияет на вашу "подсказку CMD", потому что CMD не является программой DOS: это 32-битная консольная консоль Windows. По какой-то причине я не понимаю, на WinXP, даже если вы загружаете фиксированную копию command.com с помощью команды "command.com/p", командная строка не будет включена ansi: возможно, когда вы делаете это именно так, эмулирует загрузку command.com?
В любом случае, когда вы используете фактическую версию DOS для command.com, ansi активируется после загрузки: вы можете продемонстрировать ее использование с помощью немного ansi-искусства:
command /c type ansiart.ans
(вот пример: http://artscene.textfiles.com/ansi/artwork/beastie.ans)
CONFIG.NT(в папке system32) содержит пример синтаксиса загрузки драйверов устройств. Вам нужно будет быть администратором для редактирования этого файла по умолчанию, или вы можете сделать его копию.
В Win 2K и XP по умолчанию "ярлык" для MSDOS является .PIF файлом, а не файлом .LNK. Если вы создаете файл .lnk в CMD, вы не сможете установить специальные файлы конфигурации и autoexec, он будет использовать CONFIG.NT по умолчанию. Если вы хотите использовать специальный файл конфигурации только для одного приложения DOS, вы можете сделать копию "MSDOS-ярлыка", или вы можете сделать копию "_default.pif", найденную в вашей папке Windows.
Ответ 10
В последней версии win10 это может быть сделано с помощью SetConsoleMode(originMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING)
. См. Https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-septions#example.
Ответ 11
Я обнаружил, что этот инструмент работает для моей цели. Microsoft Color Tool от GitHub
Разархивируйте сжатый файл, затем откройте CMD с разрешения администратора.
Перейдите в папку, куда вы распаковываете файл в CMD.
Затем выполните эту команду " colortool -b scheme-name
"
Имя схемы необходимо заменить любой из следующих опций:
- campbell.ini
- Кемпбелл-legacy.ini
- CMD-legacy.ini
- deuternopia.itermcolors
- OneHalfDark.itermcolors
- OneHalfLight.itermcolors
- solarized_dark.itermcolors
- solarized_light.itermcolors
В моем случае команда будет выглядеть следующим образом: " colortool -b solarized_dark.itermcolors
"
Нажмите справа в окне консоли и выберите Свойства.
Вам не нужно менять какое-либо значение, просто нажмите "ОК", чтобы сохранить настройки. (Вы заметите, что ваш шрифт уже содержит цвета).
Свойство консоли
Затем перезапустите ваш cmd или powerShell.
Цвет ANSI должен быть включен и работать с выбранной ранее цветовой схемой.
Ответ 12
Была такая же проблема. Я установил ConEmu, и он решил мою проблему.
Ответ 13
Основываясь на @BrainSlugs83, вы можете активировать текущую версию Windows 10 через регистр с помощью этой командной строки:
REG ADD HKCU\CONSOLE /f /v VirtualTerminalLevel /t REG_DWORD /d 1