Как заставить консоль win32 распознавать escape-последовательности ANSI/VT100?

Я создаю облегченную версию библиотеки ncurses. До сих пор он довольно хорошо работает с терминалами, совместимыми с VT100, но консоль win32 не распознает 3 код как начало 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?

11 ответов


[обновление] перед обновлением 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 Джейсон Худ-ваше решение. Это написано в C, поддерживает 32-разрядные и 64-разрядные версии Windows, и источник доступен.

также я нашел другой подобный вопрос или сообщение, на которое в конечном итоге был дан ответ, чтобы использовать ANSICON:


начиная с Windows 10 TH2 (v1511), conhost.exe и cmd.exe поддержка ANSI и VT100 Escape-последовательности из коробки (хотя они должны быть включены).

посмотреть мой ответ в superuser для получения более подробной информации.


начиная с Windows 10, вы можете использовать ENABLE_VIRTUAL_TERMINAL_PROCESSING для включения escape-последовательностей ANSI:

https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032(v=vs. 85).aspx


Если ANSICON неприемлемо, так как он требует, чтобы вы установили что-то в системе, более легкое решение, которое анализирует и переводит коды ANSI в соответствующий функции консоли Win32 API например SetConsoleTextAttribute.

https://github.com/mattn/ansicolor-w32.c


для Python 2.7 следующий скрипт отлично работает для меня с Windows 10 (v1607)

import os

print '3[35m'+'color-test'+'3[39m'+" test end"
os.system('') #enable VT100 Escape Sequence for WINDOWS 10 Ver. 1607
print '3[35m'+'color-test'+'3[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


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 (используйте кнопку "Дополнительно"), и есть файл по умолчанию под названием 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, а не a .Файл LNK. Если вы создадите .файл LNK в CMD, вы не сможете установить специальные файлы конфигурации и autoexec, он будет использовать конфигурацию по умолчанию.НОВЫЙ ЗАВЕТ. Если вы хотите использовать специальный файл конфигурации только для одного приложения DOS, вы можете сделать копию "ярлыка MSDOS", или вы можете сделать копию "_default.pif", найденный в вашей папке Windows.


Мне лично нравится Клинк. Он не только обрабатывает коды ANSI, он также добавляет много других функций, поэтому консоль Windows ведет себя как Баш (истории, поиск истории, горячих клавиш и т. д.):

  • то же редактирование строк, что и Bash (из библиотеки Readline GNU).
  • сохранение истории между сеансами.
  • контекстная завершения;
    • исполняемые файлы (и псевдонимы).
    • команды директорию.
    • переменные среды
    • инструменты Thirdparty; 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-legacy.ini
  • deuternopia.itermcolors
  • OneHalfDark.itermcolors
  • OneHalfLight.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