
私はここ数日、情報を探していました。明確に言うと、私の目標はncurses
- のようなCライブラリを作成することです。ANSIエスケープシーケンスそして、それらをどのように使用するか。しかし、私は移植性を求めているので、データベースに興味がありますterminfo
。次のようなドキュメントの一部を読みました。
- https://www.tldp.org/HOWTO/テキストターミナルHOWTO-16.html)
- https://en.wikipedia.org/wiki/Terminfo
- terminfo のマニュアルページ
理論と原理は理解できましたが、実際には C のようなプログラミング言語でデータベースにアクセスしたりインターフェースしたりする方法の例は見つかりませんでした。
現在、私の頭に浮かぶ唯一の方法は、terminfo
データベースのバイナリ ファイルをメモリにロードして手動でアクセスすることですが、独自のスキームを構築する必要があること、そしてこれらのデータベースにアクセスするためのより簡単で実用的で公式な方法がないことは奇妙に思えます。
答え1
FreeBSD上のtermcapデータベースにアクセスするには、はオペレーティングシステムに付属する方法です。FreeBSD Cライブラリには、アクセスするためのAPIがあります。機能データベース.getcap()
など、これらは、低レベルで termcap データベースにアクセスするために呼び出す関数です。(実際には低レベルの API もありますが、API のようにgetcap()
、機能データベースが可変長レコードのフラット ファイルか、プログラムで構築された適切なインデックス付きバイナリ データベース ファイルのいずれかであるという事実を抽象化しませんcap_mkdb
。)
より上位のレベルにはtgetent()
、、tputs()
などがあります。(これらは、多くの Linux ベースのオペレーティング システムなどの terminfo オペレーティング システムにも存在します。) ただし、これらは FreeBSD C ライブラリにある termcap ncurses ライブラリの一部であり、独自の「ncurses のような」ライブラリを作成しようとしています。(Linux ベースのオペレーティング システムでは、これらは terminfo ncurses ライブラリの一部です。)
ncurses 独自の terminfo API を経由せずに terminfo データベース レコードにアクセスする例としては、unibilium ライブラリがあります。NeoVIM はこれを使用します。
より高いレベルでは…
terminfo/termcapはよりポータブル21世紀の20年目には限界点を超えています。ECMA-48:1976に準拠していない実際のビデオ端末に出会うことはまずないでしょう。紙の端末は言うまでもありません。そして、実際のビデオ端末の動作と実際には一致しないことが多いterminfoの抽象化は、ある意味では障害移植性に欠けるため、多少ゆがんだ作業方法を強いられる。
これは特に端末入力実際には、1980 年代初頭から ECMA-48 (RXVT、Interix、Linux KVT、SCO コンソール用のステート マシンの不備を含む) であり、固定文字列を一致させる termcap/terminfo モデルはこれに非常に不適合です。しかし、"local"/"xmit" 電卓キーパッド、"カーソル アドレッシング モード"、および 3 種類のカーソル表示形式などのアイデアも、端末の実際の動作方法と一致しません。
もし、あんたがはncurses を再発明するつもりなら、少なくともそのカラーペア モデルをコピーしないでください。これは、端末が四半世紀以上にわたって使用してきた ITU T.416 インデックスおよびダイレクト カラー メカニズムは言うまでもなく、ECMA-48 および AIXterm カラー システムとほとんど一致しません。
参考文献
getcap
。BSD ライブラリ関数マニュアル. FreeBSD. 2002-03-22.tgetent
。ncurses(3X) マニュアル フリーBSD。- https://github.com/mauke/unibilium
- https://unix.stackexchange.com/a/567575/5132
- ジョナサン・デ・ボイン・ポラード(2019年)。端末機能「」。 C++ ライブラリ. nosh ツールセット。