Как сделать консоль 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:

Ответ 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 м

тест на тест-тест цвета
Код>

Ответ 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.

Ответ 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