Linux端末で \e[H\e[2J ANSI エスケープシーケンスを解釈するには?

Linux端末で \e[H\e[2J ANSI エスケープシーケンスを解釈するには?

StackOverflowに質問をもう一度投稿しましたが、回答がなく、賞金を追加しましたが効果がありません(ただ賞金を削除しました)。私の考えでは、ここの人々が何が起こっているのかをよりよく知ることができると思います。

私のJavaScriptライブラリのためのより良いANSIエスケープコードソルバーを開発していますが、コマンドの処理に問題がありますtopscript端末出力をファイルにダンプするコマンドを使用)。

代替画面を使用するMacOSのサンプルファイルがありますESC [ ? 1049 hlここに録音してください

問題は、コマンドのLinuxバージョンがtop代替画面のみを使用しないことです。\e[H\e[2J順序は1,1に移動して画面を消去することです。私の理解では、実際にこのコマンドの前に端末に印刷されたすべての内容を消去する必要があります。これが私がパーサー/インタープリターでやっていることです。しかし、Linux端末はそうではありません(私はXFce端末を使用しています)。何とか画面の一部を消去してページを下にスクロールします。

それで、私の質問は、\e[H\e[2JLinuxターミナルのようにレンダリングするために最上位のコマンド(シーケンス)を処理する正確なステップ(アルゴリズム)は何ですか?私の端末に表示されるセッション出力として文字列が必要です。

以下はスクリプトコマンドの出力例です。https://jcubic.pl/screen_dump_linux_top.txt

テストコードがありますコードペン:

次のコードを使用してください。

$.terminal.format($.terminal.overtyping($.terminal.from_ansi(text)));

Linuxでtopコマンドの出力を見てください。以前は、コマンドの出力は表示されません。すべてを印刷するmacOSファイルと比較します(実際の端末は、メイン画面に戻すときに代替画面を印刷しないことを知っていますが、その出力をそこに入れることにしました。おそらくトグルオプションを追加したかもしれません)。

端末エミュレータのソースコードを確認できることを知っていますが、単にこれについて尋ねるよりも時間がかかります。

ベストアンサー1

\e[Hカーソルをホームページ(左上)に移動して\e[2J画面を消去します(よく見る部分ですが、後ろにスクロールする部分ではありません)。

多くの端末エミュレータでは、\e[2J画面上でよく見られる部分は単にその場で消去されます。結果は次のとおりです。いくつかの出力(seq 100テスト目的など)を生成するコマンドを実行してから実行すると、前のプログラムtop出力の先頭はスクロールバックバッファに残りますが、出力の終わりは永久に失われます。

この非論理的な動作を解決するために、一部の端末エミュレータ(Xfce端末で使用されるVTEウィジェットを含む)は動作を修正しました\e[2J。つまり、画面をスクロールバックバッファにスクロールします。 「一般領域」の結果は同じです。空の画面が表示されます。スクロールバックバッファの内容は間違いなくより意味があります。前のコマンドの出力全体が保持されます。

\e[3Jこれを行うには、これを使用してスクロールバックバッファを消去できます。これを送る後ろに \e[2Jそれ以外の場合は、1画面のデータがスクロールされます。 (これがまさにこのclearコマンドがすることです。)

それで、私の質問は、\e[H\e[2JLinuxターミナルのようにレンダリングするために最上位のコマンド(シーケンス)を処理する正確なステップ(アルゴリズム)は何ですか?

答えは次のとおりです。端末によって異なります。

おすすめ記事