シェルでless
のようなページャーまたはnano
のようなエディターを使用するときはいつでも(シェルはGNU bash))、完全に説明できない動作が表示されますcat
やls
などの他のツールで観察できる動作とは異なります。この動作がどのように発生するのかを確認したいと思います。
「説明するのは簡単ではありません」の動作は、通常、stdout/stderrへのすべての出力がターミナルエミュレータのバックバッファに記録されるため、less
またはnano
、出力はターミナルエミュレーターによって表示されますが、プログラムを終了すると、コンテンツは「魔法のように消えます」。
これらの2つの例を挙げます。
seq 1 200
(バックバッファーで200行を生成)seq 1 200 | less
(200行を追加しますが、最終的には「クリーンアップ」し、バックバッファーには何も記録されません)私の疑いは、ある種のエスケープコードが機能していることです。この観察された動作の違いの説明を私に指摘してくれる人に感謝します。
一部のコメントと回答は、振る舞いを変更したいという私の願望のように語られているため、これは「知っておくと良いでしょう」ですが、実際に望まれる回答は、メカニズムの説明であり、変更方法ではありません。
ここには2つの世界観があります。
termcapとterminfoは、プログラムが見るこの世界観を、端末から見た世界観に変換します。
全画面テキストユーザーインターフェースを表示するプログラム(vim
、nano
、less
、mc
など)は、termcap/terminfoを使用して、起動時にカーソルアドレス指定モードに切り替え、スクロールに戻ります一時停止、またはシェルアウト、または終了するときのモード。 ncursesライブラリはこれを行いますが、termcap/terminfoの上にさらに直接ビルドする非ncurses使用プログラムも同様です。
less
またはvim
によって提示されるTUI内のスクロールは、scrollbackとは関係ありません。これはこれらのプログラム内に実装されており、スクロールすると適切にフルスクリーンのテキストユーザーインターフェイスが再描画されます。
これらのプログラムしないでください代替画面バッファに「コンテンツを残さない」ことに注意してください。端末は単に、彼らが残したものをもはや表示していません。
less
が最も顕著になるまで)、最後のプログラムによって残された代替画面バッファーの古い内容が表示される可能性がありますパイプラインの終わりに)。実際の制御シーケンスは、関連する標準が呼び出すものですset private mode制御シーケンス。関連するプライベートモード番号は、47、1047、1048、および1049です。代替画面バッファとの切り替えに加えて、それぞれが暗示する追加のアクションの違いに注意してください。
Cursesと呼ばれるライブラリは、使用している端末タイプを認識し、正しいエスケープシーケンスを送信します。そこにある端末は、別の垂直バッファと、より多くの制御を可能にするモードに切り替えるように求められます。
いくつかの方法で、これに非クリアを追加できます。 -X
引数を指定してless
を呼び出すと、画面がクリアされなくなります。
以下のコマンドラインの$
記号に注意してください。通常のユーザーの端末プロンプトを指定します。
$ 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
に変更します。
rmcupおよびsmcupを検索して画面をクリアする指示を削除し、次の2つの指示を削除します。
smcup=\E[?1049h,
そして
rmcup=\E[?1049l,
ファイルを保存し、次のようにターミナル定義を追加します。
$ tic ~/xterm-noclear.src
これをシステム全体で利用可能な端末定義にすることができます。
$ Sudo tic ~/xterm-noclear.src
これでこれをTERM
で使用できます:
$ export TERM=xterm-noclear