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

Снимок экрана

Что нужно сделать на уровне кода C, чтобы драйвер ANSI.SYS был загружен и управляющие последовательности ANSI / VT100 распознавались?


person Witiko    schedule 26.05.2013    source источник
comment
Обратите внимание, что правила игры кардинально изменились в последних версиях Windows 10.   -  person Andreas Rejbrand    schedule 26.07.2018
comment
К вашему сведению, в последней версии Windows 10 вы можете включить ANSI в conhost с помощью следующего регхака - в HKCU\Console создайте DWORD с именем VirtualTerminalLevel и установите для него значение 0x1; затем перезапустите cmd.exe. - Вы можете проверить это с помощью следующей оболочки PowerShell "?[1;31mele ?[32mct ?[33mroni ?[35mX ?[36mtar ?[m".Replace('?', [char]27);.   -  person BrainSlugs83    schedule 28.10.2018
comment
upd docs.microsoft.com/en-us/windows/console/ здесь, как его можно включить, не редактируя реестр и, возможно, нарушая работу других приложений.   -  person Bogdan Mart    schedule 08.03.2019


Ответы (13)


[ОБНОВЛЕНИЕ] Для последней версии Windows 10 прочтите полезный вклад @ brainslugs83 чуть ниже в комментариях к этому ответу.

Для версий до Windows 10 Anniversary Update:

ANSI.SYS имеет ограничение, заключающееся в том, что он может работать только в контексте подсистемы MS-DOS под Windows 95-Vista.

Microsoft KB101875 объясняет, как включить ANSI.SYS в командном окне, но это не относится к Windows NT. Согласно статье: мы все любим цвета, современные версии Windows не имеют такой хорошей поддержки ANSI.

Вместо этого Microsoft создала множество функций, но это совсем не то, что вам нужно для управления escape-последовательностью ANSI / VT100.

Более подробное объяснение см. В статье Википедии:

ANSI.SYS также работает в производных от NT системах для 16-битных унаследованных программ, выполняемых под NTVDM.

Консоль Win32 вообще не поддерживает escape-последовательности ANSI. Однако такое программное обеспечение, как Ansicon, может действовать как оболочка для стандартной консоли Win32 и добавлять поддержку управляющих последовательностей ANSI.

Поэтому я думаю, что ANSICON Джейсона Гуда - это ваше решение. Он написан на C, поддерживает 32-битные и 64-битные версии Windows и источник доступен.

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

person Franco Rondini    schedule 28.05.2013
comment
Однажды я попытался заставить ANSI работать в Windows XP без сторонних инструментов groups.google.com/forum / #! topic / alt.msdos.batch.nt / YZnoq80Mcds - person est; 20.10.2015
comment
Как меняются времена;) В Windows 10 Anniversary Update и последующих версиях консоль Windows была обновлена ​​с довольно надежной поддержкой последовательностей ANSI / VT, а в Creators Update также была обновлена ​​поддержка 24-битных цветов RGB: blogs.msdn.microsoft.com/commandline/2016 / 09/22 / - person Rich Turner; 12.07.2017
comment
Ответ обновлен в соответствии с вкладом Рича Тернера - person Franco Rondini; 12.07.2017
comment
@Simon, спасибо, я удалил ссылку, потому что она не работает, кстати, есть архивная версия kb / 101875 здесь - person Franco Rondini; 06.03.2018
comment
К вашему сведению, в последней версии Windows 10 вы можете включить ANSI в conhost с помощью следующего регхака - в HKCU\Console создайте DWORD с именем VirtualTerminalLevel и установите для него значение 0x1; затем перезапустите cmd.exe. - Вы можете проверить это с помощью следующей оболочки PowerShell "?[1;31mele ?[32mct ?[33mroni ?[35mX ?[36mtar ?[m".Replace('?', [char]27);. - person BrainSlugs83; 28.10.2018
comment
Спасибо @ brainslugs83 - ответ обновлен, чтобы процитировать ваш комментарий - person Franco Rondini; 30.10.2018

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

Дополнительные сведения см. В моем ответе на странице суперпользователя.

person rolve    schedule 08.03.2016
comment
Сборки 105xx были единственными сборками, в которых по умолчанию были включены последовательности VT100. В предыдущей и более поздних сборках он отключен по умолчанию, потому что был включен по ошибке. См. Объяснение здесь wpdev.uservoice.com/forums/ - person Anatol Belski; 12.08.2016
comment
К вашему сведению, в последней версии Windows 10 вы можете включить ANSI в conhost с помощью следующего регхака - в HKCU\Console создайте DWORD с именем VirtualTerminalLevel и установите для него значение 0x1; затем перезапустите cmd.exe. - Вы можете проверить это с помощью следующей оболочки PowerShell "?[1;31mele ?[32mct ?[33mroni ?[35mX ?[36mtar ?[m".Replace('?', [char]27);. - person BrainSlugs83; 28.10.2018

Для 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
person Guestreader    schedule 24.09.2016
comment
Это начинает походить на черную магию и никакого упоминания о том, как потом отключить настройку консоли? как ни странно, у меня работает, но непонятно почему из волшебной пустой струны. - person Conrad B; 23.04.2018
comment
Если вы заключите печатный материал в круглые скобки (...), это будет работать в Python 3 в Windows 10 (v1703). (т.е. print('\033[35m'+'color-test'+'\033[39m'+" test end")) - person whatisit; 10.02.2019
comment
Есть ли у кого-нибудь исходники или известно, что os.system('') меняется в консоли? - person Boop; 26.03.2019
comment
os.system('') работает, по-видимому, из-за ошибки в cmd.exe (cmd.exe включает режим VT, но не отключает его при выходе). Для получения дополнительной информации и лучшего кода для включения режима VT см. Обсуждение проблемы 30075 на python.org. - person Richard Goulter; 20.02.2020

Начиная с Windows 10, вы можете использовать ENABLE_VIRTUAL_TERMINAL_PROCESSING для включения управляющих последовательностей ANSI:

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

person Star Brilliant    schedule 13.06.2016

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

REG ADD HKCU\CONSOLE /f /v VirtualTerminalLevel /t REG_DWORD /d 1
person Daniel De León    schedule 15.05.2019
comment
Поддерживается ли это во всех версиях Windows 10? Или доступно из конкретного обновления? - person Youssef13; 15.12.2019
comment
в первых версиях Windows 10 не поддерживается, но в токовых работает нормально. - person Daniel De León; 16.12.2019
comment
Я хочу знать конкретную версию, которая поддерживала это. - person Youssef13; 16.12.2019
comment
@ Youssef13 Согласно superuser.com/a/1300251/702169, первой поддерживаемой версией является сборка 16257. - person InQβ; 22.07.2021

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

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

person Joakim    schedule 03.03.2015

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

person rho    schedule 26.05.2013
comment
Это довольно громоздкое решение, не говоря уже о том, что оно позволяет раскрашивать только текст, а не остальные коды ANSI.SYS. users.cybercity.dk/~bse26236/batutil/help/ANSI~ S_S.HTM - person Witiko; 26.05.2013

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

person bitlixi    schedule 10.08.2018

Может быть, ANSICON поможет вам

Просто скачайте и извлеките файлы, в зависимости от вашей ОС Windows: 32-разрядная или 64-разрядная.

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

person user3137537    schedule 14.12.2016

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

  • Редактирование той же строки, что и Bash (из библиотеки GNU Readline).
  • Сохранение истории между сессиями.
  • Context sensitive completion;
    • Executables (and aliases).
    • Команды каталога.
    • Переменные среды
    • Сторонние инструменты; Git, Mercurial, SVN, Go и P4.
  • New keyboard shortcuts;
    • Paste from clipboard (Ctrl-V).
    • Пошаговый поиск по истории (Ctrl-R / Ctrl-S).
    • Мощное завершение (ВКЛАДКА).
    • Отменить (Ctrl-Z).
    • Автоматический "cd .." (Ctrl-PgUp).
    • Расширение переменной среды (Ctrl-Alt-E).
    • (нажмите Alt-H, чтобы увидеть многое другое ...)
  • Автодополнение с помощью сценария Lua.
  • Цветная подсказка с поддержкой сценариев.
  • Автоматический ответ на запрос «Завершить пакетное задание?».
person David Ferenczy Rogožan    schedule 20.02.2018

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 / ярлыке (используйте кнопку «расширенный»), и есть файл по умолчанию с именем CONFIG.NT (также в папка system32), которая используется, если в pif / ярлыке не указан специальный файл конфигурации.

Если файл 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», командная строка не будет включена: возможно, когда вы сделаете это таким образом, это только эмулирует загрузку command.com?

В любом случае, когда вы используете реальную версию command.com для DOS, ansi активирован после загрузки: вы можете продемонстрировать его использование с помощью некоторой части ansi art, например:

command /c type ansiart.ans

(вот пример: http://artscene.textfiles.com/ansi/artwork/beastie.ans)

CONFIG.NT (в папке system32) содержит пример синтаксиса для загрузки драйверов устройств. Вы должны быть администратором, чтобы редактировать этот файл по умолчанию, или вы можете сделать его копию.

В Win 2K и XP ярлыком по умолчанию для MSDOS является файл .PIF, а не файл .LNK. Если вы создадите файл .lnk для CMD, вы не сможете установить специальные файлы config и autoexec, он будет использовать CONFIG.NT по умолчанию. Если вы хотите использовать специальный файл конфигурации только для одного приложения DOS, вы можете сделать копию «ярлыка MSDOS» или вы можете сделать копию «_default.pif», находящуюся в вашей папке Windows.

person david    schedule 22.03.2018

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

person GeertVc    schedule 26.01.2019

Я обнаружил, что этот инструмент работает для меня. Microsoft Color Tool от GitHub

Разархивируйте сжатый файл, затем откройте CMD с правами администратора.

Зайдите в папку, куда вы распаковываете файл в CMD.

Затем выполните эту команду "colortool -b scheme-name"

Название схемы необходимо заменить на любую из следующих опций:

  • campbell.ini
  • Campbell-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 должен быть включен и работать с выбранной ранее цветовой схемой.

person Arung Isyadi    schedule 26.07.2018
comment
Я попробовал это, но докер-машина отказалась подключаться. - person Ken Ingram; 31.12.2018
comment
Прошу прощения за так долго, но описанный выше метод никогда не тестировался для докеров. - person Arung Isyadi; 13.09.2019