99

I'm building a lightweight version of the ncurses library. So far, it works pretty well with VT100-compatible terminals, but win32 console fails to recognise the\033 code as the beginning of an escape sequence:

# include <stdio.h># include "term.h"int main(void) {  puts(BOLD COLOR(FG, RED) "Bold text" NOT_BOLD " is cool!" CLEAR);  return 0;}

Screenshot

What needs to be done on theC code level, in order that the ANSI.SYS driver is loaded and the ANSI/VT100 escape sequences recognized?

Thomas Dickey's user avatar
Thomas Dickey
55.4k8 gold badges79 silver badges108 bronze badges
askedMay 26, 2013 at 0:25
Witiko's user avatar
13

14 Answers14

89
+200

[UPDATE] For latest Windows 10 please read useful contribution by @brainslugs83, just below in the comments to this answer.

While for versions beforeWindows 10 Anniversary Update:

ANSI.SYS has a restriction that it can run only in the context of the MS-DOS sub-system under Windows 95-Vista.

Microsoft KB101875 explains how to enable ANSI.SYS in a command window,but it does not apply to Windows NT. According to the article:we all love colors, modern versions of Windows do not have this nice ANSI support.

Instead, Microsoft created a lot of functions, but this is far from your need to operate ANSI/VT100 escape sequence.

For a more detailed explanation, see theWikipedia article:

ANSI.SYS also works in NT-derived systems for 16-bit legacy programs executing under the NTVDM.

The Win32 console does not natively support ANSI escape sequences at all. Software such asAnsicon can however act as a wrapper around the standard Win32 console and add support for ANSI escape sequences.

So I thinkANSICON by Jason Hood is your solution. It is written inC, supports 32-bit and 64-bit versions of Windows, andthe source is available.

Also I found some other similar question or post which ultimately have been answered to use ANSICON:

answeredMay 28, 2013 at 18:43
Franco Rondini's user avatar
Sign up to request clarification or add additional context in comments.

6 Comments

I once did a hack to make ANSI work in Windows XP without any thirdparty toolsgroups.google.com/forum/#!topic/alt.msdos.batch.nt/YZnoq80Mcds
How times change ;) In Windows 10 Anniversary Update and beyond, Windows Console was updated with pretty solid support for ANSI/VT sequences, and in Creators Update, was updated to support 24-bit RGB colors too:blogs.msdn.microsoft.com/commandline/2016/09/22/…
@Simon thanks, I removed the link because it doesn't work btw there is anarchived version of kb/101875 here
FYI, in latest Windows 10, you can enable ANSI in conhost via the following reghack -- inHKCU\Console create aDWORD namedVirtualTerminalLevel and set it to0x1; then restart cmd.exe. -- You can test it with the following powershell"?[1;31mele ?[32mct ?[33mroni ?[35mX ?[36mtar ?[m".Replace('?', [char]27);.
Thanks @brainslugs83 - Answer updated to cite your comment
|
43

Starting from Windows 10 TH2 (v1511),conhost.exe andcmd.exe support ANSI and VT100 Escape Sequences out of the box (althoughthey have to be enabled).

Seemy answer over at superuser for more details.

johndoe's user avatar
johndoe
3122 silver badges9 bronze badges
answeredMar 8, 2016 at 10:33
rolve's user avatar

2 Comments

The 105xx builds was the only builds having VT100 sequences enabled by default. In previous and later builds it's disabled by default cause it was enabled by mistake. See here for the explanationwpdev.uservoice.com/forums/…
FYI, in latest Windows 10, you can enable ANSI in conhost via the following reghack -- inHKCU\Console create aDWORD namedVirtualTerminalLevel and set it to0x1; then restart cmd.exe. -- You can test it with the following powershell"?[1;31mele ?[32mct ?[33mroni ?[35mX ?[36mtar ?[m".Replace('?', [char]27);.
31

Base on @BrainSlugs83 you can activate on the current Windows 10 version via register, with this command line:

REG ADD HKCU\CONSOLE /f /v VirtualTerminalLevel /t REG_DWORD /d 1
answeredMay 15, 2019 at 13:24
Daniel De León's user avatar

4 Comments

Is this supported in all Windows 10 versions ? Or available from a specific update ?
in the firsts version of Windows 10 is not supported, but in the currents one work fine.
I want to know the specific version that supported this.
@Youssef13 According tosuperuser.com/a/1300251/702169, first supporting version is build 16257.
20

For Python 2.7 the following script works for me fine with Windows 10 (v1607)

import osprint '\033[35m'+'color-test'+'\033[39m'+" test end"os.system('') #enable VT100 Escape Sequence for WINDOWS 10 Ver. 1607print '\033[35m'+'color-test'+'\033[39m'+" test end"

Result should be:

[35mcolor-test[39m test endcolor-test test end
Xantium's user avatar
Xantium
11.7k12 gold badges72 silver badges96 bronze badges
answeredSep 24, 2016 at 9:59
Guestreader's user avatar

5 Comments

That starts to look like black magic and no mention of how to turn off the console setting afterwards? curiously, it works for me, but unclear why from the magical empty string.
If you wrap the printed material in parentheses(...) this works in Python 3 on Windows 10 (v1703). (i.e.print('\033[35m'+'color-test'+'\033[39m'+" test end"))
Does someone have a source or know whatos.system('') changes to the console ?
os.system('') works apparently because of a bug in cmd.exe (cmd.exe enables VT mode, but doesn't disable it on exit). For more info, and better code to enable VT mode, see discussion onissue 30075 on python.org
You end console codes that end with m by doing\033[0m. Or, if you want to reset the whole terminal, and clear the screen, do\033c.
19

Starting from Windows 10, you can useENABLE_VIRTUAL_TERMINAL_PROCESSING to enable ANSI escape sequences:

https://learn.microsoft.com/windows/console/console-virtual-terminal-sequences

johndoe's user avatar
johndoe
3122 silver badges9 bronze badges
answeredJun 13, 2016 at 7:04
Star Brilliant's user avatar

Comments

14

If ANSICON is not acceptable since it requires you to install something on the system, a more lightweight solution that parses and translates the ANSI codes into the relevantWin32 API console functions such asSetConsoleTextAttribute.

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

answeredMar 3, 2015 at 16:21
Joakim's user avatar

1 Comment

Just for instance, you can recompile the app by using theParseAndPrintString function directly.
8

For coloring the cmd you needWindows.h and useSetConsoleTextAttribute() more details can be found inhttps://learn.microsoft.com/windows/console/setconsoletextattribute

johndoe's user avatar
johndoe
3122 silver badges9 bronze badges
answeredMay 26, 2013 at 1:40
rho's user avatar

1 Comment

That's quite an unwieldy solution, not to mention the fact that this only allows for the coloring of a text - not the rest of ANSI.SYS codes.users.cybercity.dk/~bse26236/batutil/help/ANSI~S_S.HTM
7

In lastest win10, it can be done bySetConsoleMode(originMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING). Seehttps://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#example

answeredAug 10, 2018 at 1:35
bitlixi's user avatar

Comments

5

MaybeANSICON can help u

Just download and extract files, depending on your windows os: 32bit or 64bit

Install it with:ansicon -i

answeredDec 14, 2016 at 14:40
user3137537's user avatar

Comments

2

I personally likeclink. It not only processes ANSI codes, it also adds many other features so Windows Console behaves likebash (history, reverse history search, keyboard shortcuts, etc.):

  • The same line editing as Bash (from GNU's Readline library).
  • History persistence between sessions.
  • Context sensitive completion;
    • Executables (and aliases).
    • Directory commands.
    • Environment variables
    • Thirdparty tools; Git, Mercurial, SVN, Go, and P4.
  • New keyboard shortcuts;
    • Paste from clipboard (Ctrl-V).
    • Incremental history search (Ctrl-R/Ctrl-S).
    • Powerful completion (TAB).
    • Undo (Ctrl-Z).
    • Automatic "cd .." (Ctrl-PgUp).
    • Environment variable expansion (Ctrl-Alt-E).
    • (pressAlt-H for many more...)
  • Scriptable completion with Lua.
  • Coloured and scriptable prompt.
  • Auto-answering of the "Terminate batch job?" prompt.
answeredFeb 20, 2018 at 13:31
David Ferenczy Rogožan's user avatar

Comments

2

Ansi.sys (in the system32 folder) is an "MSDOS driver" provided as part of Windows XP, 2000, and earlier versions of NT. In 2000 and XP, it is located in the system32 folder (I don't remember the structure of earlier versions of NT). Programs that run in the DOS subsystem and use standard output can use ANSI.SYS just as they could running over MSDOS.

To load ansi.sys, you must use the device= or devicehigh= command in config, just as you would in MSDOS. On Windows NT 5 (2K & XP), each copy of the DOS subsystem can be given a separate config file in the pif/shortcut (use the "advanced" button), and there is a default file called CONFIG.NT (also in the system32 folder), which is used if the pif/shortcut does not specify a special config file.

When ansi.sys is loaded correctly, mem /d will report that it is loaded. On earlier versions of NT, you can and must load a proper DOS environment to load ansi.sys, and ansi art will work at the prompt. On Win 2K and XP, loading ansi.sys will have no effect on your "CMD prompt" because CMD is not a DOS program: it is a 32 bit Windows console program. For some reason that I do not understand, on WinXP, even if you load a fixed copy of command.com using "command.com /p", the command prompt will not be ansi enabled: perhaps when you do it that way it only emulates loading command.com?

In any case, when you use an actual DOS version of command.com, ansiis enabled after being loaded: you can demonstrate it's use with a bit of ansi art like this:

command /c type ansiart.ans

(here is an example:http://artscene.textfiles.com/ansi/artwork/beastie.ans)

CONFIG.NT (in the system32 folder) contains an example of the syntax for loading device drivers. You will need to be an Administrator to edit that default file, or you can make a copy of it.

On Win 2K and XP, the default "shortcut" for MSDOS is a .PIF file, not a .LNK file. If you create a .lnk file to CMD, you won't be able to set special config and autoexec files, it will use the default CONFIG.NT. If you want to use a special config file for just one DOS application, you can make a copy of the "MSDOS shortcut", or you can make a copy of "_default.pif", found in your Windows folder.

answeredMar 22, 2018 at 2:52
david's user avatar

Comments

2

I found this tool to be working for my end.Microsoft Color Tool from GitHub

Unzip the compressed file then open CMD with Administration permission.

Go to the folder where you unzip the file in CMD.

Then execute this command "colortool -b scheme-name"

The scheme-name needs to be replaced with any of these options below:

  • campbell.ini
  • campbell-legacy.ini
  • cmd-legacy.ini
  • deuternopia.itermcolors
  • OneHalfDark.itermcolors
  • OneHalfLight.itermcolors
  • solarized_dark.itermcolors
  • solarized_light.itermcolors

In my case, the command would be like this "colortool -b solarized_dark.itermcolors"

Click right on the console window and select Properties.

You don't need to change any value just click "OK" to save the setting. (You will notice that your font already contains colors).

Console Property

Then restart your cmd or powerShell.

The ANSI color should be enabled and working with the color scheme you chose before.

answeredJul 26, 2018 at 13:33
Arung Isyadi's user avatar

2 Comments

I tried this and then docker-machine refused to connect.
I'm sorry for so long but the method above was never tested for docker.
2

Had the same issue. I installedConEmu and that one solved my problem.

answeredJan 26, 2019 at 16:30
GeertVc's user avatar

Comments

0

Somehow in Windows you just need to call any shell command first, rather call thesystem function. Just in start of your main method putsystem("");, and don't forget to includestdlib.h.

I noticed this when I looked at some of my old programs that also used ANSI codes to understand why they work, but my new code is not

answeredNov 3, 2022 at 19:33
ThisIDeaL's user avatar

Comments

Your Answer

Sign up orlog in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

By clicking “Post Your Answer”, you agree to ourterms of service and acknowledge you have read ourprivacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.