スクロールバックとスクロールバックバッファーとは正確には何ですか?


23

やなどのプログラムの「スクロールバック」や「スクロールバッファ」とは何ですか?bashまたscreen、tty、実行中のプログラム、stdin / stdout / stderrとはどのように関係していますか?

これが私がこれまでに見つけた「scrollback」の唯一の定義です(archlinux wikiで):

スクロールバックは、テキストコンソールに実装されている機能であり、ユーザーが戻って画面からスクロールしたテキストの行を表示できるようにします。これは、ビデオアダプタとディスプレイデバイスの間にこの目的のために作成されたバッファによって可能になります。スクロールバックバッファ。

しかし、これは私にとってより多くの質問を提起します:

  • 「サブルーチン」や「機能」などの「機能」を意味しますか?
  • このスクロールバックバッファ用のUnix標準またはAPIはありますか?
  • 以下のようなプログラムの「スタック」でvimに発売screenに発売bashに発売されssh、これらのプログラムのスクロールバックバッファを制御している端末エミュレータ、に発売?

また、スクロールバックをファイルscreenダンプするのに使用しました。このファイルの上部には多くの空白があり、ターミナルエミュレータが表示する「ビュー」は、バッファの最後の数行にすぎないようです。

  • これはvim、親シェルのスクロールバックバッファに一時的にアクセスするため、プログラムがターミナルウィンドウ全体を「クリア」できるのはなぜですか?
  • またはvim、親スクロールバックバッファーの上に何らかの方法でオーバーレイされる独自のスクロールバックバッファーを使用しますか?

回答:


28

これは少し複雑な質問です。私はあなたの質問に順番に答えようとしますが、最初に一般的な説明をします。

スクロールバックバッファーは、ターミナルエミュレーター(xterm、Konsole、GNOMEターミナル)によって実装されます。これには、端末で実行するすべてのプログラムからの標準出力と標準エラーの両方を含む、画面に表示されたすべてのテキストが含まれます。過去にスクロールした可能性のある出力を確認したり、以前に言ったことを確認したりするのは、完全に端末の機能です。

スクロールバックバッファーは、ログ出力の長いページであり、ターミナルウィンドウは、その一部のみを一度に見るウィンドウであると考えることができます。上にスクロールしていない場合、見ているのはバッファの末尾です。通常、端末では、忘れ始める前に追跡する行数の制限が設定されます。

制限が1000行であるとします。セッションの最初の1000行の出力については、バッファーに追加するだけで、セッションの開始まで右にスクロールできます。出力の1001行目を取得するとすぐに、バッファーの最初の行が消去され、スクロールできる最も後ろの行がセッションの2行目になります。バッファーには、画面に表示された最新の1000行の出力が常に含まれます。スクロールして、いつでも以前の出力を確認できます。

  • 「サブルーチン」や「機能」などの「機能」を意味しますか?

    これは「機能」のような「機能」です。ターミナルエミュレータには、画面の内容を記録し、画面内を上下にスクロールできる機能があります。一部のシステムのコンソールは、限定的なスクロールバックもサポートしています。

    screenミックスに投入すると、少し複雑になります。その時点でscreen、スクロールバックバッファー自体をエミュレートしています-だから、(たとえば)X選択だけでなく、プログラム内でスクロールバックバッファーからコピーして貼り付けることができます。

  • このスクロールバックバッファ用のUnix標準またはAPIはありますか?

    簡単な答えはノーです。ターミナルから提供されただけです。一番長い答えは一番下にあります。

  • 端末エミュレーターで起動されたsshで起動されたbashで起動された画面で起動されたvimなど、プログラムの「スタック」で、これらのプログラムのどれがスクロールバックバッファーを制御していますか?

    以下の場合vimbash、それらはすべて(警告、再度、以下)でそれを制御していません。ターミナルは、シェルから開始して、ターミナル内のすべてのプログラムにスクロールバックバッファーを提供します。screen前述のように、スクロールバック自体をシミュレートしています。

  • また、画面を使用してスクロールバックをファイルにダンプしました。このファイルの上部には多くの空白があり、ターミナルエミュレータが表示する「ビュー」は、バッファの最後の数行にすぎないようです。

    これはscreenの内部バッファーです。その時点で画面上にあるのは、一般的にバッファの一番下にあるものです。

  • これが、vimのようなプログラムが、親シェルのスクロールバックバッファに一時的にアクセスするために、ターミナルウィンドウ全体を「クリア」できる理由ですか?

    これがより複雑になる部分の1つです。実質的にすべてのXベースのターミナルエミュレーターはVT100をシミュレートしており、そこで行われていることの1つは「代替画面バッファー」のサポートです。順次出力とのほとんどの端末相互作用に使用される通常のバッファーとは異なり、代替画面バッファーは端末の正確なサイズにすぎません。上下にスクロールすることはありません。表示されているものより大きくないからです。

    そこにあるアイデアは、フルスクリーンアプリケーションが、既に画面に表示されているものに邪魔されることなく、必要なことを実行できるようにし、以前の表示に戻れるようにすることです。そのため、入力するvimと画面全体に表示されますが、画面を離れると、以前の端末出力(過去のすべてのプロンプトとコマンド出力)が再び表示されます。vim起動時に代替画面バッファに切り替え、終了時に通常のバッファに戻ります。

    この代替バッファは、前述の注意事項の1つです。時々、プログラムは実際に、バッファをどうするかを端末に伝える機能を持っています。

    screenこれを行う別のプログラムです。これが、スクリーンセッション中に端末のスクロール機能が通常機能しない理由です。  screenスクロールバックバッファー自体をエミュレートするため、古い機能を使用するには内部機能を使用する必要があります。

  • または、vimは親スクロールバックバッファの上に何らかの方法でオーバーレイされた独自のスクロールバックバッファを使用しますか?

    私はほとんど前の質問でこれに答えましたが、この特定の質問に対する短い答えはvim、ターミナルからスクロールバックなしで独自の一時バッファを取得し、ドキュメントのすべてのスクロールを内部で実行することです。

私が言及したすべての例外:

再び少し複雑になります。アプリケーションはスクロールバックを制御できず、端末によって完全に提供されると言いました。場合によっては、一部の端末では、相互作用が制限されます。プログラムは特定のエスケープシーケンスを出力します(過去に手動で端末の色付けを使用したことがある場合は、それらがどのように見えるかを確認できます)。どのエスケープシーケンスが利用可能かは、termcap(端末能力)データベースに記述されています

一部の端末は、限られたクエリとスクロールバックバッファの操作をサポートします。多くのxterm派生物には、端末にビューをスクロールさせるエスケープシーケンスがあります。多くの端末は、画面の特定の領域を指定してスクロールし、残りのすべてをそのまま残します。これは、スクロールバックバッファーを破損する傾向があります。

ほとんどすべての端末は、画面の周りでカーソルを移動するシーケンスをサポートしています。これにより、ncursesライブラリはディスプレイのすべての異なる部分を更新できます。でサポートさxtermれているVT100シーケンスを見ることができます。これらがスクロールバックバッファーと対話する方法は、特にlessコマンドのように独自のスクロール動作を実装するものの場合、少し奇妙になることがあります。less端末が予期していなかった方法でテキストを上部に再描画したため、スクロールバックで行が重複または欠落する可能性があります。他のプログラムでは、表示全体の複数のコピーでバッファがいっぱいになる場合があります。


1
この素晴らしい答えをありがとうございます!それは非常に完全で、複雑なトピックにもかかわらず理解しやすいです。追加の詳細により、私はより多くを学びたいと思うようになり、どこを見るべきかを示します。
オレグ14

1
一部の端末には無制限のスクロールバックのオプションがあり、これはスクロールバック全体がRAMであることを意味します(したがって、端末でmallocエラーまたはOOMが発生します)、またはディスクに書き込んでディスクからロードしようとしますスクロール?チャットプログラムのようなもの。
CMCDragonkai

通常、クエリのエスケープシーケンスはtermcapにはありません(また、より完全なterminfoにもありません)。
トーマスディッキー

@CMCDragonkai Konsoleは、メモリ内で有限のスクロールバックを保持しますが、暗号化されていないディスクに無制限のスクロールバックを配置します。設定ダイアログで警告が表示されます。VTE(gnome-terminalなど)は、スクロールバック(有限または無限)をディスクに保存し、圧縮および暗号化します。他のエミュレータが何をするのかわかりません。
エグモント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.