私はncursesライブラリの軽量版を作っています。今のところ、VT100互換のターミナルではうまく動作していますが、win32コンソールは 033
コードをエスケープシーケンスの始まりとして認識することに失敗します。
# include <stdio.h>
# include "term.h"
int main(void) {
puts(BOLD COLOR(FG, RED) "Bold text" NOT_BOLD " is cool!" CLEAR);
return 0;
}
ANSI.SYSドライバをロードしてANSI/VT100エスケープシーケンスを認識させるには、Cコードレベルで何をする必要があるのでしょうか?
[UPDATE] 最新のWindows 10については、この回答のコメント欄のすぐ下にある@brainslugs83による有用な投稿をお読みください。
Windows 10 Anniversary Update」以前のバージョンについては、「Windows 10 Anniversary Update」のままです。
ANSI.SYSは、Windows 95-VistaのMS-DOSサブシステムのコンテキストでのみ実行可能という制限があります。
Microsoft KB101875では、コマンドウィンドウでANSI.SYSを有効にする方法が説明されていますが、Windows NTには適用されません。記事によるとwe all love colors によると、最近のバージョンのWindowsには、この素晴らしいANSIサポートがないそうです。
その代わり、マイクロソフトは多くの関数を作りましたが、これはANSI/VT100エスケープシーケンスの操作の必要性からは程遠いものです。
詳しい説明は、Wikipediaの記事をご覧ください。
ANSI.SYSは、NT派生システムにおいて、NTVDMの下で実行される16ビットレガシープログラムに対しても機能します。
Win32コンソールは、ANSIエスケープシーケンスをネイティブに全くサポートしていません。しかし、Ansiconのようなソフトウェアは、標準のWin32コンソールのラッパーとして動作し、ANSIエスケープシーケンスのサポートを追加することができます。
そこで、Jason HoodによるANSICONがあなたの解決策になると思います。C](http://en.wikipedia.org/wiki/C_Language) で書かれ、32ビットと64ビット版のWindowsをサポートし、ソースが入手可能なのです。
また、他の類似の質問や投稿を見つけたのですが、最終的にはANSICONを使用するように回答されています。
ANSICONがシステムに何かをインストールする必要があるため受け入れられない場合は、ANSIコードを解析してSetConsoleTextAttributeなどの関連するWin32 API console functions に変換するより軽量のソリューションがあります。
cmd の色付けには Windows.h
が必要で、SetConsoleTextAttribute()
を使用します。詳細は http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047%28v=vs.85%29.aspx に記載されています。