WindowsのCMDシェル(コマンドプロンプトの中身)はbashと違って文字色を柔軟に変更できませんが、ConEmu + CMDなら、bashと同じ「エスケープシーケンスの色指定」が使えると判明。早速psqlで、前からやりたかった「プロンプト/クエリと結果のテキストカラーを分ける」を模索したところ、クエリ実行を、自分で定義したメタコマンドで行うことで実現できました。以下、ConEmuの簡易な導入方法を含めた手順です。

実行環境(ConEmuはダウンロードして起動するだけ)

ConEmuは基本的にシェルの外見や操作性を良くするものだけど、文字色・背景色については、bashと同様のコマンドをCMDシェル上で使えるという機能追加がありました。psqlに限らないCMD一般でのテストは後日とし、今回は「既存のpsql + ConEmu + 若干のメタコマンド」での文字色変更に絞ってます。 まずConEmuの準備は、公式サイトからダウンロードページ ↓ を開き、Portableとあるインストール不要のポータブル版を入手し好きな場所に解凍するだけ。迷ったら上から四つ目Stable Portableにして下さい(自分も今回これを使いました)。Firefoxで「リンクを右クリック、保存」したらうまくダウンロードできず、直接クリックしたらできました。 http://www.fosshub.com/ConEmu.html ↓ ポータブル版は7z形式で圧縮されてます。zipと違って何か解凍ソフトが必要ですが、例えば7-Zip Portableとかフリーで使えるのがたくさんあるので説明は省略。 ↓ ファイル群を好きなフォルダに解凍したら、トップにあるConEmuの実行ファイルを起動するだけ。二つあるのは32bit、64bit版です。初回のみ設定ダイアログが出て(二つ目の画像)カラー設定もありますが、後からも変更可能なのでここはスルーしてOKを押すと、コマンドプロンプトとは一見違う黒い画面が出ます(三つ目の画像)。中身はCMDシェルなのでコマンドプロンプトと同じです(lsとか打っても駄目)。 ↓ とりあえずpsqlのあるフォルダに移動して実行・接続すれば(別途PostgreSQLサーバが起動済みの前提)、いつもと同じpsqlです。ただしConEmuのデフォルトは日本語向けのフォント設定でなく、Consolasの代替フォントが適当に使われて見づらいので、最初にchcp 437を打ってからpsqlを起動。「コードページがOSのと違う」と警告が出るものの、psqlのメッセージが全て英語になります。 これで実行環境の準備終わり。後はpsqlの作業だけです。

まずプロンプトだけ色を変える

これは公式ドキュメントに載っているしブログ記事もあるので、割と知られてそう。Windowsのコマンドプロンプトでは無効ですが、今回のConEmu + psqlなら使えます。 例えばドキュメント記載の例を実行すると ↓ こんな感じ。%[から%]の間に制御文字列を入れ、%033がエスケープ、[1;33;40mとかが色指定です。制御文字列の囲みを除けばbashシェル共通の構文。
\set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%]%# '
bashでの色指定方法は種類がたくさんある中、Stack Overflow : ANSI Color Specific RGB Sequence Bashに載ってるRGBの各値を渡す ↓ のが最も汎用的。未対応のターミナルもあると思いますがConEmuでは使えます。先頭の38が文字色(前面)のみを変える指定、次の2が24bit(RGB×8bit)の意味。
\set PROMPT1 '%[%033[38;2;255;0;0m%]%/=#\n%[%033[0m%]' -- red(255, 0, 0)
postgres=#
\set PROMPT1 '%[%033[38;2;0;255;0m%]%/=#\n%[%033[0m%]' -- green(0, 255, 0)
postgres=#
\set PROMPT1 '%[%033[38;2;0;0;255m%]%/=#\n%[%033[0m%]' -- blue(0, 0, 255)
postgres=#
なおコンソールが明るい配色だと、文字色の黒と白が自動的に逆になってしまう、つまり(0, 0, 0)の指定が白、(255, 255, 255)が黒になります。bashとConEmuどちらの仕様か不明ですが、混乱するので無効にしたいところ。方法がないか引き続き調べます。

プロンプト以降の文字色を一括で変えつつ、クエリ結果だけ別の色にする

前項の各例では、メタコマンドの最後の%[%033[0m%]で色設定を元に戻してました。これを省けば、プロンプトに限らずその後すべての文字色が変わります。
\set PROMPT1 '%[%033[38;2;0;0;255m%]%/=#\n'
-- 以下すべての文字色が rgb(0, 0, 255) になる
これをもう一歩進め「クエリ結果だけを別色で」表示できれば、今回の目的達成。それをConEmu + CMDシェルでやってみると ↓ こんな感じになりました。コマンドの説明は次項で。
\set g '\\g | set /p x=\x1b[38;2;255;255;255m<nul& find "" /v'

select version() :g -- このクエリ結果だけ、上で指定した色になる
+-------------------------------------------------------------+
|                           version                           |
+-------------------------------------------------------------+
| PostgreSQL 9.5.0, compiled by Visual C++ build 1800, 64-bit |
+-------------------------------------------------------------+
(1 row)

select version(); -- プロンプトと同じ色
+-------------------------------------------------------------+
|                           version                           |
+-------------------------------------------------------------+
| PostgreSQL 9.5.0, compiled by Visual C++ build 1800, 64-bit |
+-------------------------------------------------------------+
(1 row)
冒頭の例はConEmuのカラースキームをSolarized Lightにし、色指定を24bitでなく8bit(256色)で行なったもの。コマンドの構文は上と同じです。
\set PROMPT1 '%[%033[38;5;7m%]%/=# '
\set g '\\g | set /p x=\x1b[38;5;1m<nul& find "" /v'

 (クエリを普通に実行 → 文字色はプロンプトと同じ)
 (クエリの末尾に :g を打って実行 → 文字色が変わる)

方法 : メタコマンド\gをカスタマイズして色指定を加え、それでクエリを実行

前項で達成した方法を分解すると ↓ こんな感じ。☆★印は、WindowsのCMDシェル特有の変な部分です。 要するに\gコマンドをカスタマイズして色指定を加え、セミコロンの代わりにそれでクエリを実行する流れ。\gのカスタマイズ版は好きな名前の変数にでき、:変数名 + リターンでコマンドとして機能。変数化する際、メタコマンドのバックスラッシュを二つ重ねてシングルクォートします。 ☆はWindowsユーザ以外には意味不明でしょうが、echoでエスケープシーケンスを入力すると余計な改行が必ず付くので、改行なしechoとして有名な「set /p ... <nul」コマンドを使ってます。xというのはここだけで使う環境変数名で、他と被らなければ何でも可。 この色指定の後、パイプで渡したクエリ結果をそのまま表示すればOK。Windowsでは「標準入力をそのまま表示する」普通のコマンドが無いですが、★のとおりfindで代用可能。psqlから一時的に起動したシェルが終われば、そこでの色指定も終わり。プロンプトとクエリの文字色が、最初に指定したものに戻ります。 bashシェルなら☆★の部分はもっと簡単になるはず。また普通のクエリ結果と同様に1画面ずつ表示したければ、カスタマイズ版\gコマンドの最後に | more を付けてページャに渡します。

psql起動と同時に使えるよう設定

1月3日の記事に書いたとおり、psqlは起動時に設定ファイルを読み込むことができ、そのパスは環境変数psqlrcで変えられます。そこで今回の方法を設定ファイル化し、それを読んでpsqlを起動するバッチファイルを作りました。 psqlrc.confに書いた色設定は、黒い画面でなく明るい系のSolarized Lightに合わせたもの。これはConEmuに初めからあるカラースキームの一つで、設定は「Alt + Space → Settings → Features → Colors」でできます。 カラー設定が済んだら二つのファイルをConEmuと同じ場所に置きます。バッチファイルではpsqlを絶対パスで起動するので、適宜パスや接続文字列を変えて下さい。バッチをConEmuにドラッグ&ドロップすれば ↓ 今回と同じpsqlが立ち上がるはず。色を変えたいクエリは:gで、普通のクエリはそのままでOK。 バッチファイルは冒頭でchcp 437を実行し、psqlのメッセージを英語化。ConEmuで日本語表示用のフォント設定をしてたら不要で(参考:昨年6月7日の記事)、psqlの日本語メッセージを普通に表示できます。 あと、Windows版psqlでよくある「ページャ中止のCtrl-Cをうっかり連続打鍵してpsqlを閉じてしまう」ミスを防ぐため、バッチファイル中にループを入れました。Ctrl-Cでpsqlを閉じようとすると「バッチファイルを終了しますか?」という例のメッセージが出て、yesなら終了、noなら再びpsqlが立ち上がります。↓ 普段はイラッと来るCMDシェルの仕様(Ctrl-Cですぐ閉じれない)をこんな形で有効活用。代わりに、\qで閉じても必ずpsqlが復活してきます。こっちの方が煩しければ、バッチの最終行 goto loop を消して下さい。