bash
プログラムでは、「ロールバック」と「ロールバックバッファ」とは何screen
ですか?実行中のプログラムであるttyとstdin / stdout / stderrとはどのような関係がありますか?
これが私が今まで見つけた「ロールバック」の唯一の定義です。アーチLinuxウィキ):
スクロールバックは、ユーザーが画面にスクロールしたテキスト行を後ろに戻して表示できるようにするテキストコンソールに実装されている機能です。これは、ロールバックバッファ用に特別に生成されたビデオアダプタとディスプレイデバイス間のバッファを介して行われます。
しかし、これはより多くの質問を引き起こします。
- 「サブルーチン」の「関数」を意味しますか、「関数」の「関数」を意味しますか?
- このスクロールバックバッファのUnix標準やAPIはありますか?
vim
ターミナルエミュレータで実行されるようscreen
なプログラムの「スタック」でこれらのプログラムの中でスクロールバックバッファを制御するプログラムは何ですか?bash
ssh
私screen
もファイルへのロールバックダンプ。ファイルの上部には多くのスペースがあり、端末エミュレータが表示する「ビュー」はバッファの下部の数行にすぎません。
- このようなプログラムが
vim
親シェルのスクロールバックバッファに一時的にアクセスできるため、ターミナルウィンドウ全体を「消去」できるのはなぜですか? vim
それとも、親スクロールバックバッファの上に何らかの方法でオーバーレイされた独自のスクロールバックバッファを使用しますか?
答え1
これはやや複雑な質問です。私はあなたの質問に順番に答えようとします。しかし、まず一般的な説明として:
スクロールバックバッファは、ターミナルエミュレータ(xterm
、Konsole、GNOMEターミナル)によって実装されます。これには、端末で実行されるすべてのプログラムの標準出力や標準エラーなど、画面に表示されるすべてのテキストが含まれます。これは、スクロールして過去の過去の出力を表示したり、以前に話した内容を確認したりできる端末機能です。
スクロールバックバッファは長いレコードページの出力と考えることができ、ターミナルウィンドウはいつでも一部しか表示できないウィンドウと考えることができます。何も上にスクロールしない場合、バッファの終わりが表示されます。一般に、忘れる前に追跡する行数の制限が端末に設定されています。
制限が1000行であるとします。セッションの最初の1000行の出力の場合は、バッファに追加してセッションの先頭まで直接スクロールできます。 1001番目の出力ラインを取得すると、バッファの最初のラインが削除され、スクロールできる最も遠いラインがセッションの2番目のラインになります。バッファには常に画面に表示される最新の1000行の出力が含まれており、いつでも上にスクロールして前の出力を表示できます。
「サブルーチン」の「関数」を意味しますか、「関数」の「関数」を意味しますか?
これが「機能」と「特徴」です。ターミナルエミュレータには、画面の内容を記録し、画面内で上下にスクロールする機能があります。一部のシステムのコンソールは、制限されたロールバックもサポートしています。
screen
一度混合すると、状況はさらに複雑になります。この時点では、screen
スクロールバックバッファ自体がシミュレートされます。したがって、X選択を使用する代わりに、プログラムにコピーして貼り付けることができます。このスクロールバックバッファのUnix標準やAPIはありますか?
短い答えは「いいえ」です。端末で提供するだけです。より長い答えは下部にあります。
画面で起動されたvim、ターミナルエミュレータで起動されたbash、sshの起動などのプログラムの「スタック」で、これらのプログラムのうちスクロールバックバッファを制御するプログラムは何ですか?
vim
との場合はbash
制御できません(下から再度警告)。ターミナルはシェルから始まり、ターミナル内のすべてのプログラムのスクロールバックバッファを提供します。screen
前述のように、ロールバック自体がシミュレートされています。また、screen を使用してロールバックをファイルにダンプします。ファイルの上部には多くのスペースがあり、端末エミュレータが表示する「ビュー」はバッファの下部の数行にすぎません。
これが
screen
内部バッファです。このとき画面に表示される内容は通常バッファの下部の内容です。これは、vimのようなプログラムが親シェルのスクロールバックバッファに一時的にアクセスできるため、ターミナルウィンドウ全体を「消去」できる理由ですか?
これは状況がより複雑になる部分の1つです。ほとんどすべてのXベースのターミナルエミュレータはVT100をエミュレートし、それらが行う1つはサポートです。「代替画面バッファ」。シーケンシャル出力とのほとんどの端末対話に使用される通常のバッファとは異なり、代替画面バッファはまさに端末サイズです。表示されるコンテンツより大きくないため、上下にスクロールできません。
アイデアは、フルスクリーンアプリがすでに画面上の何かを妨げることなく必要な操作を実行してから、以前の表示状態に戻すことができるようにすることです。これがすぐに入力したときに
vim
全画面を埋めますが、離れると前の端末出力(以前のすべてのプロンプトとコマンド出力)が再び表示される理由です。vim
起動時に代替画面バッファに切り替え、終了時に通常のバッファに戻ります。このバックアップバッファは上記の注意事項の1つです。時には、プログラムには、バッファで実行するタスクを端末に通知する機能があります。
screen
これを行うもう1つのプログラムが、これがスクリーンセッションにあるときに、通常端末のスクロール機能が機能しない理由です。screen
スクロールバックバッファ自体がシミュレートされるため、以前の出力を取得するには内部機能を使用する必要があります。それとも、vimは親スクロールバックバッファの上に何らかの方法で重複する独自のスクロールバックバッファを使用しますか?
私は主に前の質問でこの質問に答えましたが、この特定の質問に対する短い答えは、
vim
端末から(スクロールバックなしで)独自の一時バッファを取得し、内部的にドキュメントのすべてのスクロールを実行することです。
私が言及したすべての例外は次のとおりです。
今回も少し複雑になります。私はアプリケーションがロールバックを制御することができず、完全に端末から提供されると言いました。場合によっては、特定の端末との相互作用が制限される。プログラムは特定のエスケープシーケンスを印刷します。過去に手動で端末の色付けを使用したことがある場合は、その外観を見ることができます。端末は、これらのシーケンスを解釈し、動作を変更し、情報をプログラムに送り返すこともできる。使用できるエスケープシーケンスについては、次を参照してください。termcap(ターミナル機能)データベース。
一部の端末は、スクロールバックバッファに対する制限されたクエリと操作をサポートしています。多くのxterm
派生項目には、端末がビューをスクロールできるようにするエスケープシーケンスがあります。多くの端末では、スクロールする画面の特定の領域を指定し、残りの部分は変更しない機能もサポートしています。これによりスクロールバックバッファが破損する傾向があります。
ほとんどすべての端末は、画面の周りにカーソルを移動するシーケンスをサポートしています。これは、ncurses
ライブラリがディスプレイの他のすべての部分を更新できる方法です。あなたは見ることができますVT100シリアルサポートxterm
。スクロールバックバッファと対話する方法は、時々少し奇妙なことがあります。特に、コマンドなどの独自のスクロール動作を実装する場合はさらにそうですless
。less
端末が予期しない方法でテキストが一番上に再描画されるため、スクロールバックで行が重複または欠落する可能性があります。他のプログラムでは、時にはディスプレイ全体の複数のコピーでバッファを埋めることがあります。