
Termcap (「ターミナルキャップ機能」) は、Unix 系コンピュータで使用されるレガシー ソフトウェア ライブラリおよびデータベースです。これにより、プログラムがデバイスに依存しない方法でコンピュータ端末を表示できるようになります。これにより、ポータブルテキスト モードアプリケーションの作成プロセスが大幅に簡素化されます。これは、 ncurses、tput、およびその他のプログラム で使用されるterminfoデータベースに置き換えられました。
ビル・ジョイは1978年にバークレーUnixオペレーティングシステム用に最初のtermcapライブラリ[1] [2]を作成しました。それ以来、ほとんどのUnixおよびUnix系環境に移植され、OS-9にも移植されています。[3]ジョイの設計は、以前の非互換タイムシェアリングシステムの端末データストアの設計に影響を受けたと言われています。[4] [より良い情報源が必要] [疑わしい–議論する]
termcap データベースは、何百もの異なるディスプレイ端末の機能を記述できます。これにより、プログラムは端末の種類に関係なく、文字ベースのディスプレイ出力を持つことができます。viやEmacsなどのオンスクリーン テキスト エディタは、 termcap を使用するプログラムの例です。その他のプログラムは、 Termcapカテゴリにリストされています。
データベースで説明されている内容の例:
- ディスプレイの幅は何列か
- カーソルを任意の位置に移動するために送信する文字列(行番号と列番号のエンコード方法を含む)
- 画面を1行または複数行上にスクロールする方法
- このようなスクロール操作にはどのくらいのパディングが必要か。
データモデル
Termcap データベースは、端末の 1 つ以上の記述で構成されます。
インデックス
各説明には、端末の正規名が含まれている必要があります。また、端末名の 1 つ以上のエイリアスが含まれている場合もあります。正規名またはエイリアスは、ライブラリが termcap データベースを検索するためのキーです。
データ値
説明には、慣例的な名前を持つ 1 つ以上の機能が含まれます。機能は、boolean、numeric、string の型で表されます。 termcap ライブラリには、各機能名に対して事前に決定された型はありません。各機能の型は、次の構文によって決定されます。
- 文字列機能では、機能名とその値の間に「=」が入ります。
- 数値機能の場合、機能名とその値の間に「#」が付きます。
- ブール機能には関連する値はありません (指定されている場合は常にtrueになります)。
termcap を使用するアプリケーションは、一般的に使用される機能に対して特定のタイプを想定しており、データベースの内容が想定されるタイプと一致する場合にのみ正常に返されるライブラリ呼び出しを使用して、termcap データベースから機能の値を取得します。
階層
Termcap 記述は、ある記述の内容を別の記述に組み込む、組み込まれた記述から機能を抑制、または機能を上書きまたは追加することによって構築できます。どのストレージ モデルが使用されているかに関係なく、termcap ライブラリは、要求された記述から端末記述を構築し、要求時に組み込み、抑制、または上書きを行います。
ストレージモデル
Termcap データはテキストとして保存されるため、簡単に変更できます。テキストは、ファイルまたは環境変数から termcap ライブラリによって取得できます。
環境変数
TERM環境変数には端末タイプ名が含まれます 。
TERMCAP環境変数には、termcap データベースが含まれている場合があります。これは、ターミナル エミュレータによって設定され、シェルと依存プログラムにターミナルの特性を提供する単一の termcap 記述を格納するために最もよく使用されます。
TERMPATH環境変数は、新しい termcap 実装でサポートされており、termcap ファイルの検索パスを定義します。
フラットファイル
termcap ライブラリの元の (そして最も一般的な) 実装は、フラット テキスト ファイルからデータを取得します。たとえば 500 kB などの大きな termcap ファイルの検索は遅くなる可能性があります。パフォーマンスを向上させるために、reorderなどのユーティリティを使用して、最も頻繁に使用されるエントリをファイルの先頭近くに配置します。
ハッシュデータベース
4.4BSD ベースの termcap 実装では、端末の説明をハッシュ データベース (たとえば、 Berkeley DBバージョン 1.85など) に保存します。これらには、正規のエントリを指すエイリアスと正規のエントリ自体の 2 種類のレコードが保存されます。termcap エントリのテキストは、そのまま保存されます。
制限と拡張
オリジナルの termcap 実装は、メモリをほとんど使用しないように設計されました。
- 名前は16ビットに収まるように2文字です
- 機能名は2文字です
- 説明は 1023 文字までに制限されています。
- 定義を含む termcap エントリは 1 つだけ含めることができ、最後に置く必要があります。
termcap インターフェースの新しい実装では、通常、エントリの先頭に 2 文字の名前は必要ありません。
機能名は、すべての実装において依然として 2 文字です。
端末記述の読み取りに使用されるtgetent関数は、データに十分な大きさのバッファを使用します。バッファのサイズは 1024 文字と想定されています。termcap インターフェースの新しい実装では、固定バッファの代わりにヌル ポインタを許可したり、[5]収まらないデータをNetBSD termcapのZZ機能などを使用して非表示にしたりすることで、この制約を緩和する場合があります。[6] terminfoライブラリ インターフェースもtermcap インターフェースをエミュレートしますが、実際には固定サイズのバッファを使用しません。
terminfoライブラリのtermcapのエミュレーションでは、位置を制限せずに複数の他のエントリを含めることができます。termcapライブラリの他のいくつかの新しい実装でもこの機能が提供される場合がありますが、十分に文書化されていません。[7]
廃止された機能
特別な機能である「hz」機能は、ASCIIチルダ文字 ('~') を制御シーケンスの導入子として使用するという残念な特性を持つHazeltine 1500端末をサポートするために特別に定義されました。 [8] [議論] この端末をサポートするには、データベースを使用するコードがチルダを使用して特定の制御シーケンスを導入することを知っている必要があるだけでなく、表示されるテキスト内のチルダを別の印刷可能な文字に置き換えることも知っておく必要がありました。これは、テキスト内のチルダが端末によって制御シーケンスの開始として解釈され、テキストが欠落したり画面が文字化けしたりするためです。[9] さらに、属性マーカー (下線の開始と終了など) 自体が画面上のスペースを占有しました。[引用が必要] データベースのソースコード内のコメントでは、これを「Hazeltine braindamage」と呼ぶことがよくありました。[10] ヘイゼルタイン1500は1970年代後半に広く使用されていた端末であったため[要出典]、アプリケーションがその制限に対処できることが重要でした。
参照
- ANSIエスケープシーケンスは、多くのシーケンスを統一しようとするものである。
- コンピュータ端末
- Curses (プログラミングライブラリ)
- 用語情報
- ターミナルエミュレータ
参考文献
- ^ Peter H. Salus、「Unix の歴史は、テクノロジーと同じくらいコラボレーションに関するものである」、Byte、1994 年 10 月。
- ^ Kenneth CRC Arnold と Elan Amir、「画面更新とカーソル移動の最適化: ライブラリ パッケージ」
- ^ Joel Mathew Hegberg (1994 年 11 月). 「Tackling Termcap, Part I」. OS-9/OSK Answers! . 2021 年4 月 26 日閲覧。
- ^ Mark Crispin (1998 年 10 月 7 日)。「Re: KL コンソール コマンド」。ニュースグループ: alt.sys.pdp10。
- ^ GNU Termcap ライブラリ
- ^ NetBSD termcap ファイル形式
- ^ vi における termcap の議論
- ^ – BSDファイル形式マニュアル
- ^ Stallman, Richard M. (1992). 「Termcap ライブラリとデータベース、第 2 版」. Gnu.org . 2014 年5 月 17 日閲覧。
- ^ "termcap.src". Apple Computer . 2014年5月17日閲覧。
外部リンク
- 現在の termcap データ
- Eric S. Raymondの Web サイトの Termcap/Terminfo リソース ページ
