シェルでフェイザーや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です。代替画面バッファに切り替えるか、代替画面バッファから切り替えることに加えて、各モードで暗示する追加の操作には違いがあります。
追加読書
答え2
さまざまな方法でノクリアを追加できます。less
パラメータを使用して呼び出すと、画面が消去される問題を解決できます-X
。
参考にしてください$
以下のコマンドラインの記号。一般ユーザーのための端末プロンプトです。
$ seq 1 200 | less -X
これが望ましい動作であれば、このless
デフォルトのエイリアスを次のように指定できます。
$ alias less='less -X'
他のプログラムにも同様の回避策があります。
あるいは、各アプリケーションを個別に構成する代わりに、独自の端末定義を追加することもできます。この場合は電話します。xterm-noclearこの例では。
新しい xterm 定義を生成するには、次の手順を実行します。
$ infocmp -I xterm > xterm-noclear.src
$ gedit xterm-noclear.src
エディタの2行目をからに変更xterm
しますxterm-noclear
。
検索で画面を消去するコマンドを削除するカップそしてsmcupをクリックして、次の2つのコマンドを削除します。
smcup=\E[?1049h,
そして
rmcup=\E[?1049l,
ファイルを保存し、端末定義を追加します。
$ tic ~/xterm-noclear.src
以下を使用して、システム全体の端末定義にすることができます。
$ sudo tic ~/xterm-noclear.src
これで、次の目的で使用できますTERM
。
$ export TERM=xterm-noclear
答え3
使用している端末の種類を知って正しいエスケープシーケンスを送信するcursesというライブラリです。端末は、他の垂直バッファとより多くの制御を可能にするモードに切り替える必要があります。