次のページ 前のページ 目次へ

15. Terminfo と Termcap (詳細)

15.1 はじめに

terminfo (以前は termcap) は端末の能力などについてのデータベースです。 端末の (ほぼ全ての) 型式に関して、端末にどんな能力があるかをアプリケー ションプログラムに示します。新しい位置へのカーソル移動、画面の一部の削 除、画面スクロール、モード変更、外観の変更 (色、明るさ、点滅、下線、反 転表示など) などのことをするために、端末へ送るエスケープシーケンスを教 えてくれます。1980 年頃から、多くの端末では 100 以上ものコマンド (一部 は数値パラメータをとります) をサポートするようになりました。

terminfo がアプリケーションプログラムに情報を与える一般的な方法は、 `` ncurses'' 関数を使うことで、プログラマは C プログラム内に書くことがで きます 。例えば、カーソルを 6 行 3 列 の位置へ移動するなら、単に move(3,6) と書けばよいのです。move() 関数 (ncurses の一部) は、あなたの端 末でどう働けばよいかを知っています (terminfo データベースを読むから)。 それで、ある端末向けの特定の動作をさせるために、適切なエスケープシーケ ンスを送るのです。

通常、terminfo の略語は termcap のものより長めなので、その意味がわかり 易いです。terminfo の man ページにより詳しい説明があります (termcap の 略語も載っています)。また、termcap には terminfo にはないサイズ制限が あります。したがって、あまり termcap に依存してないのなら、terminfo の 使用をお勧めします。

15.2 Terminfo データベース

はじめに

terminfo データベースはコンパイルすることにより、オリジナルな部分とコ ンパイル済の部分とに分かれます。昔の termcap データベースはオリジナル 部分だけですが、コマンドひとつで terminfo 形式への変換と、コンパイルが 実行されます。従って、termcap のソースファイルをコンパイル済 terminfo データベースに作り直せるので、terminfo のオリジナルファイルがなくても よいのです。お使いの端末用 (PC モニタを含む) のデータベースの内容を見 るには、``infocmp'' とタイプしてください。そうすれば、terminfo のソー ス ``ファイル''をご覧になれます。

お使いの端末 (vt100 としましょう) が terminfo データベースにあるかどう かを確認するには、``locate vt100'' とタイプします。端末名がわからなけ れば、コンパイル済データベース内のファイルリストを探しまわるか、 私の端末の terminfo の名前は何 ? をご覧ください。

データベースの場所はどこ ?

コンパイル済データベースの場所

``locate vt100'' とタイプすれば、/usr/lib/terminfo/v/vt100, /usr/share/terminfo/v/vt100, /home/you/.terminfo/v/vt100、あるいは /etc/terminfo/v/vt100 と表示されます。これらは全て、コンパイル済 terminfo ファイルを格納するのに適切な場所です。/etc/terminfo ディレク トリは標準的な格納場所ではありませんが、/usr ディレクトリへのアクセス ができない場合に便利です。例えば /usr ディレクトリが、マウントに失敗し た分割ディスクやパーティションにあった場合などに。上記の場所のどれか一 つにメインの terminfo データベースがあるなら、プログラムは探しあてるこ とができます。さもなければ、環境変数 TERMINFO にはこのデータベースへの パスをセットします。例えば、TERMINFO=/usr/share/terminfo のように。

コンパイル済 terminfo が二箇所以上にある場合、誰かが新しい terminfo フ ァイル を (新しくなったディストリビューションやネット上から、あるいは 古いものを修正することなどで) 入手するまでは普通は問題ありません。新し い terminfo は既存の場所にある全てのファイルと置き換える (あるいは、余 分な場所のは削除する) 必要があります。そうしなければ、アプリケーション プログラムはそれを探しまわったり、``通常の'' 場所に残っている古い (バ グありの) terminfo データをあいかわらず使い続けることになります。(上記 の) 場所情報を最新のものにするための環境変数 TERMINFO の設定はこの問題 を防ぎます。

ソースコードデータベースの場所

あなたがお使いのソースコードは /etc/termcap か terminfo.src (別な名前 かも) にあるはずです。このソースファイルを生成 (または修正) するのに必 要なフォーマットは man ページの terminfo(5) か termcap(5) をご覧くださ い。terminfo.src ファイルはコンピュータ内のいろんな場所にあるか、ある いはお使いの Linux ディストリビューションには含まれてないかもしれませ ん。locate コマンドで探してみてください。このファイルは http://sagan.earthspace.net/terminfo から (termtypes.ti の名前 で) ダウンロードできます。

訳注 : 2000 年 2 月時点でダウンロードできませんでした。

Terminfo コンパイラ (tic)

ソースファイルのデータは、termcap フォーマットから terminfo フォーマッ トに変換する ``tic'' プログラムを使ってコンパイルします。これで termcap のソースからコンパイル済の terminfo データベースを生成できるのです。 おそらく、Linux をインストールするプログラムがコンパイル済ファイルをハ ードディスクにインストールしてあるでしょうから、/etc/termcap (もしくは terminfo.src) を変更しない限り、コンパイルする必要はありません。 ``tic'' はコンパイル後に、アプリケーションプログラムが使うであろう terminfo ディレクトリにコンパイル済ファイルを自動でインストールします。

Terminfo を見なさい

ご使用の端末の terminfo エントリを調べて、コメント (もちろんソースコー ド内) を読むのもいい考えです。コメントに頼らない手っ取り早い方法は、 ``infocmp'' とタイプすることです。しかし、コメントには terminfo データ ベースが正しく働かない場合に、それを設定する方法などの端末に関する特別 な情報を教えてくれます。

不要なデータの削除

ディスクスペースを節約するために、使用する端末タイプ (と将来必要かもし れないもの) 以外の全てのデータをデータベースから削除します。``Linux 端 末'' と X Windows System を使うなら xterm 関係 (訳注:日本版なら kter m) のエントリを termcaps から消してはいけません。端末タイプ ``dumb'' はアプリケーションプログラムが端末のタイプを特定できない時に必要です。 あなたがお持ちの端末だけをインストールプログラムでインストールしたり、 新しく追加した端末の termcap をインターネットから数秒で入手できる場合 もディスクの節約になります。

15.3 既存の Terminfo ファイル (とハードウェア) 内のバグ

残念ながら terminfo と termcap ファイルにはバグが多くあります。さらに 定義の多くに不備があり、端末で利用できるはずの特徴を定義していません。 terminfo を変更せずになんとかやっていくことができますが、ある場合には、 terminfo を変更したり、可能なら、良好な terminfo と一緒に別なエミュレ ーションを使う必要があります。

提供される terminfo ファイルがひどい状態なのは、いくつか理由があるので す。一つは、terminfo ファイルの多くが 1980 年代に (termcap フォーマッ トで) 書かれたもので、アプリケーションプログラムがその高度な機能を利用 しなかったためです。それで、そんな機能が termcap (または terminfo) フ ァイルになくても誰も文句を言いませんでした。現代では、vim のようなプロ グラムが ``文脈強調'' を使ったり、minicom などは端末のグラフィックキャ ラクターセットを使ったりします。このことは、古い termcap に加えられる べき定義がもっと必要であることを意味します。これはすでに実行されている はずです (まだかもしれない)。

ほとんどの端末には (ファームウェアに起因する) ハードウェアバグがあって、 時々は termcap を変更することでバグを ``修正'' しました。それから、メ ーカがこのバグを修正する交換用のチップを送ることがあります。端末所有者 の全員がチップの置き換えに悩むわけではありません。端末にはチップのファ ームウェアに依存している 2 つ以上の terminfo があるからです。この状況 は termcap ではほとんど考慮されておらず、Linux ではただ一つだけ対応し ています。これまでほとんど使われたことがない機能に関するハードウェアバ グは、けっして修正されませんでした。ハードウェアのバグがけっして修正さ れなかったのは、当時はたいした問題ではなかったか、メーカのビジネス上の 理由などによるとの報告もあります。

15.4 Terminfo ファイルの修正

こうするには、端末で使用できるエスケープシーケンスが載ったマニュアルが 必要です。1990 年代以降のマニュアルにはほとんど記載がありません。それ と、terminfo のマニュアル (か、それに類するもの) も必要です。例えば、 グラフィックスの能力を加えるには、ソースファイルを編集して、enacs、 rmacs、smacs などの terminfo 変数に値を割り付けなければなりません。それ から ``tic'' でコンパイルします。``tic'' はコンパイル済の terminfo フ ァイルを予約された正しいディレクトリにコピーします。

ある端末用に準備された terminfo エントリより良いものを見つけたければ、 インターネットを検索してみてください (但し、さらに悪いものかもしれませ ん)。新しい terminfo エントリが古いものより安定してると思われる (しば らく使ってみて問題ない) なら、terminfo (または termcap) のソースファイ ルの最初のほうに書いてあるメンテナにコピーを送るべきです。

15.5 初期化文字列

terminfo には、端末へ送られる初期化文字が含まれています。これは、画面 表示の変更、端末モードの変更、そしてまた端末エミュレーションを他の端末 への変更を行ないます。初期化文字は、初期化のために端末に自動的に送られ るわけではありません。getty プログラムがそうすればいいと思うかもしれま せんが、もしそうしたら、端末のセットアップした設定を変更したり、設定内 容を初期化文字が自動的に取り消してしまいます。コマンド行 (もしくは、シ ェルスクリプト) から初期化文字を送るコマンドを使わなければなりません。 これには、 ``tset'', ``tput init'', あるいは ``setterm-initialize'' な どのコマンドがあります。端末は電源が入ったときにそれ自身で正しい設定を 行なうこともあるので、そういった時は初期化文字を送る必要はありません (このとき、設定して端末の不揮発メモリに保存されたオプション設定が用い られます)。

15.6 TERM 変数

環境変数 TERM には使用する端末の名称を設定すべきです。まだ設定していな くて、使ってる端末名を知らないなら 私の端末の terminfo の名前は何 ?をご覧ください。通常は getty プログラムに渡す terminal_type パラメータで設定します (/etc/inittab ファ イルをご覧ください)。この名前は terminfo データベースにあるものにして ください。コマンド行で ``set'' とタイプすれば (あるいは tset -q)、 TERM に何が設定されているのかわかります。コンソール (モニタ) での TERM は ``linux'' で、これは架空の端末タイプ ``linux'' をエミュレートする PC モニタです。``linux'' は vt100 や多くのテキスト端末にも似ているので、 ``linux'' の指定は、テキスト端末として使う場合の一時的な手段です。

同じポート (/dev/tty...) に複数のタイプの端末が接続する (例えば、 同じシリアルポートで違うタイプの端末を切り換えたり、違ったタイプの端末 を使う人達が、モデムで接続したりする) なら、TERM は誰かが接続する度に設定し 直す必要があります。これは使用する端末名をコンピュータが問合せる方法で 行われます。別な方法は、ユーザに対して、彼か彼女が使用している端末のタ イプを入力 (または選択) してもらうよう求めることです。これには tset を 使ったり、短いシェルスクリプトを書く必要があります。

一つの方法は ``tset''(man ページをご覧ください) を使うことです。tset は使用する端末のタイプを決定しようとします。terminfo 内のデータを検索 し、初期化文字を端末に送ります。また、TERM 変数の値も設定できます。例 えば、ユーザがダイアルインしたり、ログインしたときなどに。.profile ロ グインスクリプトには eval `tset -s ?vt100` が含まれています。この結果、 彼または彼女が使っているのは vt100 かどうか尋ねることになります。ユー ザは yes と答えるか、実際に使っている端末名を入力することになります。 それから tset は、端末に初期化文字を送ったり、端末名 (タイプ) を TERM に設定するのです。

15.7 Terminfo/Termcap 文書


次のページ 前のページ 目次へ