ターミナルエスケープシーケンス:ターミナルがterminfoに頼るのではなく、サポートする機能を報告しないのはなぜですか?

ターミナルエスケープシーケンス:ターミナルがterminfoに頼るのではなく、サポートする機能を報告しないのはなぜですか?

私は最近エスケープシーケンスを調べてきたし、それができることに驚きました。 X11ウィンドウの移動にもxterm使用できます(試してみてくださいprintf '\e[3;0;0t')。うわー!

端末がどの機能をサポートしているかを調べる最も一般的な方法は、データベースを使用するようです。これは、ncursesエスケープシーケンスに依存するアプリケーションの99.9%がそれを使用することです。
Ncursesは、コンソールでサポートされている機能を決定するために、terminfoシェル環境変数のデータベースを読み取ります。シェルの環境変数を変更できます。これにより、ほとんどのアプリケーションがより少ない機能を使用したり、誤動作(実行または設定を試みた後)を開始したりできます。TERM
TERMnanovimTERM=""

一部のエスケープコードによって、端末が何かを報告するようになることがわかりました。たとえば、端末にカーソル<ESC>[6n位置を報告させるようにします。 ( printf '\e[6n')

  • 同様の報告メカニズムを使用してコンソールにサポートされている機能を報告するようにしたいですか?

各コンソールは機能を値に結合するのではなく、独自の機能を宣伝することで、TERM全体をより正確かつ信頼性の高いものにすることができます。なぜこれはあまりないのですか?


編集:以前に尋ねたことがありました...新しいエスケープシーケンスを作成し、konsoleとgnome-terminalをハックしてそれをサポートし、いくつかのスクリプトで使用したいと思います。
私が実行しているコンソールがこの機能をサポートしていることを確認するためにコンソールに問い合わせたいと思います。推奨されるアプローチは何ですか?

ベストアンサー1

思ったほど簡単ではありません。 xterms(たとえば、VT100で始まるDEC VTxxx端末)には、さまざまな状況に関する多くのレポートがあります。特徴(引用するXTerm制御シーケンス)。最も一般的に有用なのは、端末の種類を知らせることです。

CSI Ps c  Send Device Attributes (Primary DA).

すべての端末にこの種の応答があるわけではありません(Sunハードウェアコンソールではまったく)。

ただし、レポートよりも多くの機能があります(たとえば、端末が実際にUTF-8を解釈していることを確認するには:許可されるパスは次のようになります。)ロケール環境変数なので、他の制御シーケンス/応答を構築する必要はありません。

実際にはレポートに焦点を当てたいくつかのアプリケーションがあります(例:ウィム、ファンクションキーの実際の値、使用されている色の数を確認してください。DCS + p Pt ST、またはカーソル形状を使用してDCS $ q Pt ST)、一部の開発者は、機能を実装するよりも、与えられたレポート応答を返す方が簡単だと思うので、プロセスを信頼できません。さまざまなプログラムのソースコードを読んで、誰かが特定のバージョンのxtermのように見えるように応答をカスタマイズした興味深い機能を見つけることができます。

おすすめ記事