Как заставить консоль 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 45

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 .

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

Для 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