Как заставить консоль win32 распознавать escape-последовательности ANSI / VT100?
Я создаю облегченную версию библиотеки ncurses. До сих пор он довольно хорошо работает с терминалами, совместимыми с VT100, но консоль win32 не распознает код 33
как начало escape-последовательности:
# include <stdio.h>
# include "term.h"
int main(void) {
puts(BOLD COLOR(FG, RED) "Bold text" NOT_BOLD " is cool!" CLEAR);
return 0;
}
Что нужно сделать на уровне кода C, чтобы ANSI.Драйвер SYS загружен и аварийные последовательности ANSI / VT100 распознаны?
11 ответов:
[обновление] перед обновлением Windows 10 Anniversary:
Анси.SYS имеет ограничение, что он может работать только в контексте подсистемы MS-DOS под управлением Windows 95-Vista.
Microsoft KB101875 объясняет, как включить ANSI.SYS в окне командной строки, но это не относится к Windows NT. Согласно статье: мы все любим цвета , современные версии Windows не имеют такой хорошей поддержки ANSI.
Вместо этого Microsoft создала множество функций, но это далеко от вашей потребности управлять аварийной последовательностью ANSI/VT100.
Более подробное объяснение см. В статье Википедии :
Анси.SYS также работает в NT-производных системах для 16-битных унаследованных программ, выполняющихся под NTVDM.
Консоль Win32 изначально не поддерживает escape-последовательности ANSI. Программное обеспечение, такое как Ansicon , может, однако, действовать как оболочка вокруг стандартной консоли Win32 и добавить поддержку ANSI escape последовательности.
Поэтому я думаю, чтоANSICON Джейсона Гуда-это ваше решение. Он написан на языке C, поддерживает 32-битные и 64-битные версии Windows, а такжедоступен исходный код .
Также я нашел какой-то другой подобный вопрос или пост, на который в конечном итоге был дан ответ, чтобы использовать ANSICON:
Начиная с Windows 10 TH2 (v1511),
conhost.exe
иcmd.exe
поддерживают Escape-последовательности ANSI и VT100 из коробки (хотя они должны быть включены).Смотрите мой ответ в superuser для получения более подробной информации.
Начиная с Windows 10, вы можете использовать
ENABLE_VIRTUAL_TERMINAL_PROCESSING
для включения escape-последовательностей ANSI:Https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032 (v=против 85).aspx
Если ANSICON не приемлем, так как он требует установки чего-то в системе, более легкое решение, которое анализирует и переводит коды ANSI в соответствующие консольные функции Win32 API , такие как SetConsoleTextAttribute .
Для Python 2.7 следующий скрипт прекрасно работает для меня с Windows 10 (v1607)
import os print '\033[35m'+'color-test'+'\033[39m'+" test end" os.system('') #enable VT100 Escape Sequence for WINDOWS 10 Ver. 1607 print '\033[35m'+'color-test'+'\033[39m'+" test end"
результат должен быть:
[35mcolor-test[39m test end color-test test end
Для раскрашивания cmd вам нужно
Windows.h
и использоватьSetConsoleTextAttribute()
Более подробную информацию можно найти в http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047%28v=vs.85%29.aspx
Может быть, ANSICON может помочь u
Просто загружайте и извлекайте файлы, в зависимости от вашей ОС windows: 32bit или 64bit
Установите его с помощью:
ansicon -i
Анси.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 не указан специальный конфигурационный файл.
Когда Анси.sys загружен правильно, mem / d сообщит, что он загружен. В более ранних версиях NT вы можете и должны загрузить соответствующую среду DOS для загрузки ansi.sys, и ANSI art будет работать по подсказке. На Win 2K и XP, загружающий ansi.sys не будет иметь никакого влияния на вашу" командную строку", потому что 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 )
Конфигурация.NT (в папке system32) содержит пример синтаксиса для загрузки драйверов устройств. Вы должны быть администратором, чтобы отредактировать этот файл по умолчанию, или вы можете сделать его копию.
На Win 2K и XP "ярлык" по умолчанию для MSDOS - это a .Файл PIF, а не a .Файл LNK. Если вы создадите .lnk файл в CMD, вы не сможете установить специальные файлы config и autoexec, он будет использовать конфигурацию по умолчанию.НЗ. Если вы хотите использовать специальный конфигурационный файл только для одного приложения DOS, вы можете сделать копию "MSDOS ярлык", или вы можете сделать копию " _default.pif", найденный в вашей папке Windows.
Лично мне нравится чокаться. Он не только обрабатывает коды ANSI, но и добавляет множество других функций, поэтому консоль Windows ведет себя как 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. цветная и скриптовая подсказка. автоответчик " завершить пакетное задание? " подсказка.
Я обнаружил, что этот инструмент работает для моей цели. Microsoft Color Tool от GitHub
Распакуйте сжатый файл и откройте CMD с разрешением администратора.
Перейдите в папку, в которую вы распаковываете файл в CMD.
Затем выполните эту команду "
colortool -b scheme-name
"Имя схемы должно быть заменено любым из этих вариантов ниже:
- Кэмпбелл.ini
- Кэмпбелл-наследие.ini
- cmd-наследие.ini
- дейтернопия.itermcolors
- OneHalfDark.itermcolors
- один полет.itermcolors
- solarized_dark.itermcolors
- solarized_light.itermcolors
В моем случае команда была бы такой:"
colortool -b solarized_dark.itermcolors
"Щелкните правой кнопкой мыши в окне консоли и выберите пункт Свойства.
Вам не нужно изменять какое-либо значение, просто нажмите кнопку "ОК", чтобы сохранить установочный. (Вы заметите, что ваш шрифт уже содержит цвета).
Затем перезагрузите cmd или powerShell.
Цвет ANSI должен быть включен и работать с цветовой схемой, которую вы выбрали ранее.
В lastest win10 это можно сделать с помощью
SetConsoleMode(originMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING)
. Видишь https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#example