terminfo
terminfoを使用すると出力場所とかをイイ感じにできるかもしれない.
かつてのUNIXシステムではいろんな端末があって,それらの制御方法は標準化されていなかった.そこで,統一されたインタフェースでプログラムからの要求を受け取り,保持している各端末の制御方法に関するデータを参照して処理するパッケージとしてterminfoが登場した.terminfoはcursesと組み合わせて使用するが,両者の境界はなんだかあいまいらしい.
私のシステムではterminfoのデータが入っているterminfoファイルは/usr/share/terminfo/に沢山あった.これらはterminfoファイル名の頭文字ごとにディレクトリに分けられ,それぞれのterminfoファイルはticというコマンドでコンパイルされたもの(バイナリファイル)らしい.terminfoファイル内の各データは以下の3種類に分けられる.
- ブール型
- 該当する機能をサポートするか否か.
- 数値型
- サイズを表す.
- 文字列型
- 端末機能にアクセスするためのキーとか,キーボード入力をどんな文字列に変換してプログラムに渡すかを定義.
- setuptermで現在の端末に対応するTERMINAL構造体を取得
- tigetflag,tigetnum,tigetstrで現在の端末の状態を取得
- エスケープシーケンスを生成
- putp,tputsでエスケープシーケンスを端末に送る
サンプルとしてclearコマンドを作成する.man clearによるとclearコマンド自体,tputをclear引数とともに呼んでいるらしい.
terminfoを使用するときは,コンパイル時にコンパイルオプションが必要である.私のシステムでは以下でコンパイルできた.
gcc -Wall -o my_clear my_clear.c -lncurses-lncursesがないと怒られる.システムによっては-Iでncurses.hの場所を教える必要があるかもしれない(私のシステムでは/usr/include/ncurses.hがあった).コンパイル後実行するとclearコマンドと同様の結果が得られた.
もう一つの例としてカーソル移動のサンプルを作成してみた.
このサンプルはviみたくhjklでカーソルを移動する.文字は入力できない.あとqを入力すると終了する.

