ANSIカラー処理を備えたWindowsコンソール

ANSIカラー処理を備えたWindowsコンソール

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\VirtualTerminalLevelANSI エスケープ シーケンスを処理するためのグローバルな既定の動作を設定します。DWORDキーを作成し (必要な場合)、その値を に設定して、 ANSI 処理を既定で1グローバルに有効 (または0無効) にします。

[HKEY_CURRENT_USER\コンソール]
"仮想ターミナルレベル"=dword:00000001

このレジストリ設定は、デフォルトつまり、 を呼び出してコンソールモードを明示的に操作しないコンソールアプリにのみ影響しますSetConsoleMode(...)。したがって、レジストリ値は有効にするANSIのコンソールモードの無知アプリには影響しませんコンソールモードに精通アプリは(何らかの理由で)明示的に無効にするANSI。

ここに画像の説明を入力してください

答え2

コンエミュXterm 256 色拡張を備えた ANSI X3.64 をサポートします。私はこのコンソール エミュレータの作者です。

ANSI シーケンスは、ConEmu タブで実行されるすべてのプロセスに対して処理されます。

私の知る限り、ConEmu は Ansicon よりも多くのコードをサポートしています。

ConEmu と ANSI X3.64 / Xterm 256 色

答え3

Windows 10 TH2 (v1511) 以降では、conhost.exe(拡張機能によりcmd.exe) ANSI エスケープ シーケンス、特に色をサポートしています。

下記のMSDNページからの画像

コンソール仮想端末シーケンスに関する 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

関連情報