シェルでフェイザーやless
同様のエディタ(私のシェルはGNU bash)などを使用するたびに説明できない動作が表示されます。これは 。このような行動がどのように起こるのか尋ねたいです。nano
cat
ls
簡単に説明できない動作は、通常、stdout / stderrへのすべての出力が最終的にターミナルエミュレータバックバッファに書き込まれるため、後ろにスクロールできることです。これは(通常私には当てはまりません)less
orを使用する場合ですnano
。出力は端末エミュレータによって表示されますが、プログラムを終了するとコンテンツは「魔法のように消えます」。
私は次の2つの例を見たいと思います。
seq 1 200
(バックバッファに200ライン生成)seq 1 200 | less
(200行でページングできますが、最終的に「クリーンアップ」され、バックバッファに何も書き込まれません)
ある種のエスケープコードが動作していると思われ、誰かが観察された動作の違いの説明を教えてくれることを願っています。
一部のコメントや回答は、動作を変更したいように表現されているので、「知っておくと良い」。しかし、実際に望む答えは、メカニズムを変更する方法ではなく、メカニズムの説明でなければなりません。
ベストアンサー1
ここには2つの世界観があります。
- termcap / terminfoを使用するプログラムの場合、端末には2つのモードがあります。カーソルアドレッシングモードそしてスクロールモード。後者は通常モードです。プログラムが行アドレスと列アドレスに画面上でカーソルを移動する必要がある場合、プログラムはカーソルアドレス指定モードに切り替えて画面を2次元オブジェクトとして扱います。
termcapとterminfoは、プログラムが見る世界観をターミナルが見る世界観に変換することを担当します。
- 端末(エミュレーションまたは実際)の場合は、2つの画面バッファがあり、いつでもそれらの1つだけが表示されます。メインスクリーンバッファと代替画面バッファ。プログラムによって発行された制御シーケンスは、2つの間で端末を切り替えます。
- 一部の端末(通常はエミュレートされた端末)の場合、代替画面バッファはtermcap / terminfoの使用に基づいてカスタマイズされます。彼らのデザインは次の知識に基づいています。カーソルアドレッシングモード代替画面バッファへの切り替えと切り替えの一部スクロールモードメイン画面バッファに切り替えています。これがtermcap / terminfoが翻訳する方法です。したがって、これらの端末は、代替画面バッファが表示されたときにスクロールUIウィジェットを表示せず、その画面バッファのスクロールバックメカニズムはまったくありません。
- 他の端末(通常は実際の端末)の場合、代替画面バッファは基本画面バッファと非常によく似ています。どちらも基本的にサポートされているものは同じです。一部のエミュレートされた端末はこのカテゴリに属します。たとえば、Unicode rxvtには、メイン画面バッファと代替画面バッファの両方のスクロールバック機能があります。
提示されたプログラムフルスクリーンテキストユーザーインターフェース(たとえばvim
、、、、nano
などless
)mc
起動時にカーソルアドレッシングモードに切り替え、一時停止、終了、または終了時にスクロールモードに戻るには、termcap / terminfoを使用します。 ncursesライブラリはこれを実行できますが、ncurses以外のユーザーもtermcap / terminfoの上に直接構築できます。
less
vim
スクロールバックとしてマークされているか、スクロールバックとは無関係のTUI内でスクロールします。これは、スクロール時にフルスクリーンテキストユーザーインターフェースを適切に再描画するこれらのプログラムによって内部的に実装されています。
これらの手順を参照してください。欲しくない代替画面バッファに「何も保持しません」。端末には残った内容は表示されません。
- これは、カーソルアドレッシングモードに切り替えるために使用されるtermcap / terminfoシーケンスが代替スクリーンバッファを暗黙的に消去しないいくつかのプラットフォームのUnicode rxvtで特に注目に値します。したがって、これらの全画面TUIプログラムを複数連続して使用すると、少なくとも新しいプログラムが出力を書き込むまで(特に
less
パイプの終わりに)しばらくの間前のプログラムが残したスペアスクリーンバッファの以前の内容が表示されることがあります。 。 - xtermを使用すると、ターミナルエミュレータのGUIメニューから切り替えて代替画面バッファを表示し、まだ残っている内容を確認できます。
実際の制御順序は関連規格に記載されています。プライベートモード設定制御順序。関連するプライベートモード番号は47、1047、1048、1049です。代替画面バッファに切り替えるか、代替画面バッファから切り替えることに加えて、各モードで暗示する追加の操作には違いがあります。