web-dev-qa-db-ja.com

win32コンソールにANSI / VT100エスケープシーケンスを認識させる方法

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;
}

Screenshot

ANSI.SYSドライバーがロードされ、ANSI/VT100エスケープシーケンスが認識されるためには、Cコードレベルで何をする必要がありますか?

54
Witiko

[更新]最新のWindows 10については、@ brainslugs83による有用な貢献をお読みください。この回答へのコメントのすぐ下にあります。

一方、Windows 10 Anniversary Update

ANSI.SYSには、Windows 95-VistaのMS-DOSサブシステムのコンテキストでのみ実行できるという制限があります。

Microsoft KB101875は、コマンドウィンドウでANSI.SYSを有効にする方法を説明していますが、Windows NTには適用されません。記事によると、 私たちはすべて色が大好きです 、Windowsの最新バージョンにはこのNice ANSIサポートがありません。

代わりに、Microsoftは多くの関数を作成しましたが、これはANSI/VT100エスケープシーケンスを操作する必要からはほど遠いです。

より詳細な説明については、 ウィキペディアの記事 を参照してください。

ANSI.SYSは、NTVDMで実行される16ビットのレガシープログラムのNT派生システムでも動作します。

Win32コンソールは、ANSIエスケープシーケンスをネイティブでサポートしていません。ただし、 Ansicon などのソフトウェアは、標準のWin32コンソールのラッパーとして機能し、ANSIエスケープシーケンスのサポートを追加できます。

だから、ジェイソン・フッドの[〜#〜] ansicon [〜#〜]があなたの解決策だと思う。 [〜#〜] c [〜#〜] で記述されており、32ビット版と64ビット版のWindowsをサポートし、 ソースが利用可能 です。

また、最終的にANSICONを使用するように回答された他の同様の質問または投稿を見つけました:

56
Franco Rondini

Windows 10 TH2(v1511)以降、conhost.exeおよびcmd.exe ANSIおよびVT100エスケープシーケンスをそのまま使用できます(ただし、 有効にする必要があります )。

詳細については、 スーパーユーザーでの私の答え を参照してください。

36
rolve

Windows 10以降では、ENABLE_VIRTUAL_TERMINAL_PROCESSINGは、ANSIエスケープシーケンスを有効にします。

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

13
Star Brilliant

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
11
Guestreader

システムに何かをインストールする必要があるためANSICONが受け入れられない場合、ANSIコードを解析して関連する Win32 APIコンソール関数SetConsoleTextAttribute などのより軽量なソリューション=。

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

8
Joakim

Cmdの色付けには_Windows.h_が必要で、SetConsoleTextAttribute()を使用します。詳細は http://msdn.Microsoft.com/en-us/library/windows/desktop/にあります。 ms686047%28v = vs.85%29.aspx

5
rho

@ BrainSlugs83に基づいて、次のコマンドラインを使用して、registerを介して現在のWindows 10バージョンでアクティブ化できます。

REG ADD HKCU\CONSOLE /f /v VirtualTerminalLevel /t REG_DWORD /d 1
3
Daniel De León

個人的には clink が好きです。 ANSIコードを処理するだけでなく、他の多くの機能も追加するため、Windowsコンソールはbash(履歴、逆履歴検索、キーボードショートカットなど)のように動作します。

  • Bashと同じ行編集(GNUのReadlineライブラリから)。
  • セッション間の履歴の永続化。
  • 状況依存の補完;
    • 実行可能ファイル(およびエイリアス)。
    • ディレクトリコマンド。
    • 環境変数
    • サードパーティのツール。 Git、Mercurial、SVN、Go、およびP4。
  • 新しいキーボードショートカット;
    • クリップボードから貼り付けます(Ctrl-V)。
    • 増分履歴検索(Ctrl-R/Ctrl-S)。
    • 強力な補完([〜#〜] tab [〜#〜])。
    • 元に戻す(Ctrl-Z)。
    • 自動 "cd .."(Ctrl-PgUp)。
    • 環境変数の展開(Ctrl-Alt-E)。
    • Alt-Hを押してさらに...)
  • Luaによるスクリプト可能な補完。
  • 色付きでスクリプト可能なプロンプト
  • Terminate batch job?」プロンプトの自動応答。

最新のwin10では、SetConsoleMode(originMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING)で実行できます。 https://docs.Microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#example を参照してください

1
bitlixi

多分 [〜#〜] ansicon [〜#〜] はあなたを助けることができます

Windows OSに応じて、ファイルをダウンロードして抽出するだけです:32ビットまたは64ビット

ansicon -iでインストールします

1
user3137537

Ansi.sys(system32フォルダー内)は、Windows XP、2000、およびNTの以前のバージョンの一部として提供される「MSDOSドライバー」です。 2000およびXPでは、system32フォルダーにあります(NTの以前のバージョンの構造は覚えていません)。 DOSサブシステムで実行され、標準出力を使用するプログラムは、MSDOS上で実行できるのと同じようにANSI.SYSを使用できます。

Ansi.sysをロードするには、MSDOSの場合と同様に、configでdevice =またはdevicehigh =コマンドを使用する必要があります。 Windows NT 5(2KおよびXP)では、DOSサブシステムの各コピーにpif /ショートカット(「詳細」ボタンを使用)で個別の構成ファイルを指定できます。また、CONFIG.NTというデフォルトファイルがあります(これもsystem32フォルダー)。これは、pif/shortcutが特別な構成ファイルを指定しない場合に使用されます。

Ansi.sysが正しくロードされると、mem/dはロードされたことを報告します。 NTの以前のバージョンでは、適切なDOS環境を読み込んでansi.sysを読み込むことができ、また読み込む必要があり、ANSIアートはプロンプトで機能します。 Win 2KおよびXPでは、CMDはDOSプログラムではないため、ansi.sysを読み込んでも「CMDプロンプト」には影響しません。これは32ビットのWindowsコンソールプログラムです。私が理解できない何らかの理由で、WinXPでは、「command.com/p」を使用してcommand.comの固定コピーをロードしても、コマンドプロンプトはansi対応になりません。 command.comの読み込みをエミュレートしますか?

いずれにせよ、command.comの実際のDOSバージョンを使用すると、ロード後にansiisが有効になります。このようなANSIアート:

command /c type ansiart.ans

(例を示します: http://artscene.textfiles.com/ansi/artwork/beastie.ans

CONFIG.NT(system32フォルダー内)には、デバイスドライバーを読み込むための構文の例が含まれています。デフォルトファイルを編集するには、管理者である必要があります。または、コピーを作成することもできます。

Win 2KおよびXPでは、MSDOSのデフォルトの「ショートカット」は.LNKファイルではなく.PIFファイルです。 .lnkファイルをCMDに作成すると、特別なconfigおよびautoexecファイルを設定できなくなり、デフォルトのCONFIG.NTが使用されます。 1つのDOSアプリケーションだけに特別な構成ファイルを使用する場合は、「MSDOSショートカット」のコピーを作成するか、Windowsフォルダーにある「_default.pif」のコピーを作成できます。

1
david

同じ問題がありました。 ConEm をインストールすると、問題が解決しました。

0
GeertVc

私はこのツールが私の目的のために機能していることがわかりました。 GitHubのMicrosoft Color Tool

圧縮ファイルを解凍し、管理権限で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 "

コンソールウィンドウを右クリックし、[プロパティ]を選択します。

値を変更する必要はありません。[OK]をクリックして設定を保存します。 (フォントにはすでに色が含まれていることに気付くでしょう)。

コンソールプロパティ

次に、cmdまたはpowerShellを再起動します。

ANSIカラーを有効にして、前に選択したカラースキームで作業する必要があります。

0
Arung Isyadi