25日のビットマップ表示、27日のランダムウォーク、2ConEmu + psqlでエスケープシーケンスを使って遊びました。今日はその後分かった点や、記事で省略した細かいor横道的な話題。

Contents


psqlでのクエリとエスケープシーケンス

 • psqlで整形オフ(\pset format unaligned)でないと無効。
 • 変な所で区切られたら、ページャをオフに(\pset pager off)。
 • 列名があると駄目かと思って\t onにしてたけど、列名はあっても良さそう。
 • クォーテーション前のEを忘れずに。小文字eでも可。改行(E'\n')と同じ。
 • 型は文字型。bytea型にするとエスケープシーケンスでなくなる。
 • E'\x1b'以外に、E'\033'とも書ける。
 • 遅延表示用などに大量に挿入する場合、psqlで整形オンにしてると大変。
-- psqlで整形オフ(\pset format unaligned)でないと無効
# \pset format aligned
# select E'\x1b[38;2;255;0;0m 文字列を赤に\n'
    || E'\033[38;2;0;0;255m 青にして、最後に元の色に戻す\033[m';

# \pset format unaligned
# -- 直前のクエリを実行
# \g

-- 遅延表示用に「文字色を戻す = 何もしない」エスケープシーケンスを
-- 繰り返し入れたが、うっかり整形オフ(\pset format aligned)にすると
# \pset format aligned

# select text '何かの文字列'
    || repeat(E'\033[m', 100)  -- ここで表示を遅らせるつもりが
    || '後に続く文字列';


上の例は控え目に100個エスケープシーケンスを入れてますが、実際の遅延表示は概ね1000個以上ないと効果が出ません。それで整形もページャもオフで実行すると大変。画面に延々とエスケープシーケンスが表示され続けます。Ctrl+Cを押し続けて何とか止まる状態。psqlWindowsネイティブだとCtrl+Cで終了するし…。


「>5l」でなく「?25l」でキャレットを消せた

エスケープシーケンスの仕様を検索すると、キャレット(テキストカーソル)のオフ・再表示が「>5l」「>5h」とよく見かけます。でも自分の環境では機能せず。まぁ古い規格なので仕方ないかと思いつつ、だいたい一緒に載ってる他のキー、例えば画面クリアの2Jは普通に使えたので、キャレット制御は廃止されたと早合点してました。

ところが
昨日の記事UPした後で ↓ これを発見。初めて見る「?25l」「?25h」というシーケンスで、試したら確かにキャレットオン・オフでき、慌ててクエリ・ストアド・動画を作り直して記事を修正しました。

» Hide the cursor in a PHP script with ANSI escape code·GitHub


2つのシーケンスの関係(どっちかが古い等)や、使える環境の違いはまだ不明。スッキリしないけど、出来ないと思い込んでたことが出来たので良しとします。


ANSICON + psqlでもエスケープシーケンス使用可(RGBの色指定は除く)

Windowsのコマンドプロンプトではエスケープシーケンスが効かないのでConEmuを使いましたが、ANSICONというOSSは文字通り「コマンドプロンプトでANSIエスケープシーケンスを効かせる」に特化したもの。ConEmuのように別物のターミナルでない分、手軽です。

残念ながらRGBの色指定は無理っぽいけど、他は使えそうなのでメモ。超シンプルな公式サイト(リンク上述)にzip一つ
(v1.66)とカラーサンプル用テキストがあり、zip32/64bit両方を同梱。


好きな場所に解凍してansicon.exeをダブルクリック、で一見普通のコマンドプロンプトが起動。でもその中でエスケープシーケンスが有効になってます。


動作確認は、
公式サイトにあるANSI Prompt Coloursというテキストファイルをダウンロードしてtypeすると早いです。RGBではないものの様々な色が、シーケンスと一緒に表示されます。


同じファイルを普通のコマンドプロンプト上でtypeすると ↓


ANSICON上でpsqlを起動し、SELECT文にエスケープシーケンスを混ぜると確かに有効でした。RGBの色指定にこだわらなければ、結構使えそう。

今回試してませんがANSICONには起動オプションがいくつかあり、-iが「インストール」。常時コマンドプロンプトとともに有効になるかもしれません。