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

51
26 мая '13 в 3:25
источник поделиться
13 ответов

[ОБНОВЛЕНИЕ] Для последней версии 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:

54
28 мая '13 в 21:43
источник

Связанные вопросы


Похожие вопросы

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

Подробнее см. мой ответ на суперпользователя.

35
08 марта '16 в 13:33
источник

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

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

12
13 июня '16 в 10:04
источник

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

тест на тест-тест цвета
Код>
10
24 сент. '16 в 12:59
источник

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

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

8
03 марта '15 в 19:21
источник

Для раскрашивания cmd вам нужен Windows.h и используйте SetConsoleTextAttribute() более подробную информацию можно найти в http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047%28v=vs.85%29. ASPX

5
26 мая '13 в 4:40
источник

Мне лично нравится клик. Он не только обрабатывает коды 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.
  • Запрос цвета и сценария.
  • Автоответчик приглашения Завершить пакетное задание? ".
1
20 февр. '18 в 16:31
источник

В последней версии win10 это может быть сделано с помощью SetConsoleMode(originMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING). См. Https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-septions#example.

1
10 авг. '18 в 4:35
источник

Может быть ANSICON может помочь u

Просто загрузите и извлеките файлы, в зависимости от ваших окон os: 32bit или 64bit

Установите его с помощью: ansicon -i

1
14 дек. '16 в 17:40
источник

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.

1
22 марта '18 в 5:52
источник

Была такая же проблема. Я установил ConEmu, и он решил мою проблему.

0
26 янв. '19 в 19:30
источник

Я обнаружил, что этот инструмент работает для моей цели. 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 должен быть включен и работать с выбранной ранее цветовой схемой.

0
26 июля '18 в 16:33
источник

Основываясь на @BrainSlugs83, вы можете активировать текущую версию Windows 10 через регистр с помощью этой командной строки:

REG ADD HKCU\CONSOLE /f /v VirtualTerminalLevel /t REG_DWORD /d 1
0
15 мая '19 в 16:24
источник

Посмотрите другие вопросы по меткам или Задайте вопрос