ANSI カラーリングを解釈する Windows 用のコンソール エミュレーターはありますか?
私たちは rspec を使用しており、チームの一部は Windows を使用していますが、色付け用の特殊な文字列は彼らにとってあまり役に立ちません ;)。
答え1
このページの回答のどれも、新しいサポートの重要な側面について言及していません。ANSI 端末制御追加されたのはウィンドウズ10ビルド16257以降のコンソールホスト。つまり、有効になっていませんデフォルトでは、使用している特定のソフトウェアが有効にするANSI処理を呼び出すコンソールモードの設定フラグ付きの API ではENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0004)
、そのアプリケーションの色は表示されず、ANSI 処理も実行されません。
仮想端末処理を有効にする0x0004
https://docs.microsoft.com/windows/console/setconsolemode書くときはファイルの書き込みまたはコンソールの書き込み、文字は、カーソルの移動、色/フォント モード、および既存のコンソール API 経由でも実行できるその他の操作を制御する VT100 および類似の制御文字シーケンスに対して解析されます。詳細については、「コンソール仮想端末シーケンス」を参照してください。
このページの例が機能する理由は、どうやらコマンドecho
(あるいはバッチ処理CMD.EXE
またはの一部conhost
) は、前述の API を呼び出すことによって ANSI 処理を有効にします。ただし、stdin
またはに書き込む他の多くのツールや実行可能ファイルはstdout
これを行わない可能性があり、その場合、それらのプロセスの色は表示されません。
幸いなことに、グローバルデフォルトはオプトインに身を引くのレジストリ キーは、HKEY_CURRENT_USER\Console\VirtualTerminalLevel
ANSI エスケープ シーケンスを処理するためのグローバルな既定の動作を設定します。DWORD
キーを作成し (必要な場合)、その値を に設定して、 ANSI 処理を既定で1
グローバルに有効 (または0
無効) にします。
[HKEY_CURRENT_USER\コンソール] "仮想ターミナルレベル"=dword:00000001
このレジストリ設定は、デフォルトつまり、 を呼び出してコンソールモードを明示的に操作しないコンソールアプリにのみ影響しますSetConsoleMode(...)
。したがって、レジストリ値は有効にするANSIのコンソールモードの無知アプリには影響しませんコンソールモードに精通アプリは(何らかの理由で)明示的に無効にするANSI。
答え2
コンエミュXterm 256 色拡張を備えた ANSI X3.64 をサポートします。私はこのコンソール エミュレータの作者です。
ANSI シーケンスは、ConEmu タブで実行されるすべてのプロセスに対して処理されます。
私の知る限り、ConEmu は Ansicon よりも多くのコードをサポートしています。
答え3
Windows 10 TH2 (v1511) 以降では、conhost.exe
(拡張機能によりcmd.exe
) ANSI エスケープ シーケンス、特に色をサポートしています。
のコンソール仮想端末シーケンスに関する MSDN ページサポートされているシーケンスとそれを有効にする方法について説明します。
使用できますコンソールモードを取得するそしてコンソールモードの設定この動作を設定するためのフラグ。[...]
以下のシーケンスの動作は、VT100 および派生したターミナル エミュレータ テクノロジ、特に xterm ターミナル エミュレータに基づいています。ターミナル シーケンスの詳細については、次の Web サイトを参照してください。ホームページそしてhttp://invisible-island.net/xterm/ctlseqs/ctlseqs.html。
答え4
現在、Win10 では CMD コンソール カラーはデフォルトで有効になっていません。有効にするには、コードに以下を追加します。
#if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwMode = 0;
GetConsoleMode(hOut, &dwMode);
dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
SetConsoleMode(hOut, dwMode);
// References:
//SetConsoleMode() and ENABLE_VIRTUAL_TERMINAL_PROCESSING?
//https://stackoverflow.com/questions/38772468/setconsolemode-and-enable-virtual-terminal-processing
// Windows console with ANSI colors handling
// https://superuser.com/questions/413073/windows-console-with-ansi-colors-handling
#endif