iPhone 5の入手からはや1週間が経過しました。すっかり慣れてしまいましたが、私はiPhone 4Sを併用していますから、ときどきハッとさせられます。そう、軽いんですよ、明らかに。横浜市の郊外に住んでいるため、なかなかLTEの恩恵は受けられないのですが(涙)。

さて、今回は「Terminalの制御コード」について。ふだん何気なく利用しているTerminalだが、その基盤にはターミナルエミュレータとしての奥深い歴史があるのだ。

制御コードとは

OS Xに付属の「Terminal」は、多くのユーザにとって"UNIXコマンドを実行するためのツール"として認知されている。現在のポジションからすると確かにそのとおりだが、UNIX系OSとしての歴史と経緯からすれば、それは一面に過ぎないともいえる。

そもそもTerminalは「ターミナルエミュレータ」だ。ターミナルエミュレータとは、初期のUNIX系OSで利用されていたキャラクタベースのビデオ端末と同等の機能を果たすアプリケーションであり、メインフレームやミニコンピュータに直接接続されていた制御装置(コンソール)が、時代を下ってCRTを用いたビデオ表示端末へと進化、それがソフトウェアの形で実装されたもの。ホスト側はUNIX系OSが多く採用されていたため、ユーザはシェルおよび各種コマンドを使い対話式の作業を行うこととなり、それが"コマンド実行ツール"として知られるようになった背景にある。

OS Xのように個人利用が主目的のUNIXが増えた現在、制御端末としての色合いはかなり薄まったが、その名残りはいまも見ることができる。そのひとつが「制御コード」だ。

制御コードとは、文字どおり(端末を)制御するための命令のこと。命令といっても、人間が理解しやすい文字列/単語の形式ではなく、無味乾燥な記号が利用される。かつての端末は、基本的に文字しか表示できなかったが、制御コードを送信することでビープ音など視覚的に表現できない処理を可能にしていた。それが後方互換性の意味あいから、現在もTerminalなどのターミナルエミュレータに引き継がれている、というわけだ。

なお、「'\' + '英数1字'」の組み合わせからなる制御コードは利用頻度が高く、エスケープシーケンスと呼ばれる。ベル(\a)や改行(\n)、水平タブ(\t)がその例だ。「ESC」(\e)はなかでも特別で、直後にアルファベット1文字~数文字を付けくわえ、特別な機能を割当てた制御コードとして利用される。

Terminalの設定画面では、どの端末の制御コードをエミュレーションするか決めることができる

使って便利な制御コード技5連発

以上の説明で制御コードのあらましを理解していただけたと思うが、制御コードを送信し改行してみたところで、ほとんどのユーザはなんの関心も示さないだろう。しかし、制御コードでこんなことができるのか、と知れば考えも改まるに違いない。

多くのターミナルエミュレータは、かつて一世を風靡したDEC製端末「VT100」の動作に準拠しているため、VT100の制御コードをそのまま利用できる。世界標準規格(ECMA-48)ということもあり、Terminalでも当然サポートされているものだ。

制御コードはVT100以外の端末にも規定があり、たとえばXterm(X Window Systemに標準装備のターミナルエミュレータ)ではVT100にない数々の制御コードが用意されている(参考)。TerminalもXtermの制御コードに一部対応しているので、VT100のものとあわせ5つをピックアップし、その実行例を紹介してみよう。

1. Terminalの画面を最大化

Xtermには、ウインドウ内の表示をカスタマイズする命令が多数定義されている。前述したリンクにあるうち、「P s = 9;1」という制御コードを送信(標準出力へアウトプット)すれば、Terminalの画面は現在のデスクトップサイズにあわせて最大化される。

$ printf '\e[9;1t'

最大化されたTerminalのウインドウ。OS Xのフルスクリーン機能とは異なり、仮想端末側で表示領域を変えている点に注目してほしい

2. Terminalの画面を反転

以下のとおり制御コードを送信すれば、Terminalの表示を反転することもできる。これはVT100の制御コードでも定義されているもので、制御コードを「\e[?5l」とすれば、初期設定に戻すことができる。

$ printf '\e[?5h'

画面の反転表示もコマンドライン1行でOK。元に戻すこともかんたんだ

3. Terminalの行/文字数を指定

画面の行/文字を調整することもできる。たとえば、以下のとおり制御コードを送信すると、10行/20文字の画面に変更される。初期値の24行/80文字に戻すには、制御コードを「\e[8;24;80t」とすればいい。

$ printf '\e[8;10;20t'

Terminalの画面を10行/20文字に変更したところ

4. Terminalをデスクトップ左上隅へ移動

Xtermでは、デスクトップの任意の位置にウインドウを表示する制御コードも用意されている。書式は「3;x;y」の要領で、「x」にはX座標、「y」にはY座標をピクセル単位で指定すればいい。以下のとおりコマンドを実行すれば、Terminal画面の左上はメニューバーの真下、Appleマークの下に移動するはずだ。

$ printf '\e[3;0;0t'

Terminalウインドウの表示位置をピクセル単位で指定できる

5. コマンド終了後にバッジで通知

最後に紹介するのは、OS XのTerminal独自の仕様で、ビープ音が出されたときに画面がアクティブでない場合はバッジ(Dockのアイコンに重ねて表示される赤丸)で知らせるというもの。たとえば、以下のとおりコマンドを実行してTermialをDockに格納し、10秒待つと、Terminalのアイコンにバッジが表示されるはずだ。動画のエンコードを知らせるなど、作業完了まで時間のかかるコマンドがあるときに使えそうだ。

$ sleep 10 ; printf '\a'

Terminalのアイコン、および縮小したTerminalウインドウには、ビープ音が出力されたことを知らせるバッジが表示される