これは少し複雑な質問です。私はあなたの質問に順番に答えようとしますが、最初に一般的な説明をします。
スクロールバックバッファーは、ターミナルエミュレーター(xterm
、Konsole、GNOMEターミナル)によって実装されます。これには、端末で実行するすべてのプログラムからの標準出力と標準エラーの両方を含む、画面に表示されたすべてのテキストが含まれます。過去にスクロールした可能性のある出力を確認したり、以前に言ったことを確認したりするのは、完全に端末の機能です。
スクロールバックバッファーは、ログ出力の長いページであり、ターミナルウィンドウは、その一部のみを一度に見るウィンドウであると考えることができます。上にスクロールしていない場合、見ているのはバッファの末尾です。通常、端末では、忘れ始める前に追跡する行数の制限が設定されます。
制限が1000行であるとします。セッションの最初の1000行の出力については、バッファーに追加するだけで、セッションの開始まで右にスクロールできます。出力の1001行目を取得するとすぐに、バッファーの最初の行が消去され、スクロールできる最も後ろの行がセッションの2行目になります。バッファーには、画面に表示された最新の1000行の出力が常に含まれます。スクロールして、いつでも以前の出力を確認できます。
「サブルーチン」や「機能」などの「機能」を意味しますか?
これは「機能」のような「機能」です。ターミナルエミュレータには、画面の内容を記録し、画面内を上下にスクロールできる機能があります。一部のシステムのコンソールは、限定的なスクロールバックもサポートしています。
screen
ミックスに投入すると、少し複雑になります。その時点でscreen
、スクロールバックバッファー自体をエミュレートしています-だから、(たとえば)X選択だけでなく、プログラム内でスクロールバックバッファーからコピーして貼り付けることができます。
このスクロールバックバッファ用のUnix標準またはAPIはありますか?
簡単な答えはノーです。ターミナルから提供されただけです。一番長い答えは一番下にあります。
端末エミュレーターで起動されたsshで起動されたbashで起動された画面で起動されたvimなど、プログラムの「スタック」で、これらのプログラムのどれがスクロールバックバッファーを制御していますか?
以下の場合vim
とbash
、それらはすべて(警告、再度、以下)でそれを制御していません。ターミナルは、シェルから開始して、ターミナル内のすべてのプログラムにスクロールバックバッファーを提供します。screen
前述のように、スクロールバック自体をシミュレートしています。
また、画面を使用してスクロールバックをファイルにダンプしました。このファイルの上部には多くの空白があり、ターミナルエミュレータが表示する「ビュー」は、バッファの最後の数行にすぎないようです。
これはscreen
の内部バッファーです。その時点で画面上にあるのは、一般的にバッファの一番下にあるものです。
これが、vimのようなプログラムが、親シェルのスクロールバックバッファに一時的にアクセスするために、ターミナルウィンドウ全体を「クリア」できる理由ですか?
これがより複雑になる部分の1つです。実質的にすべてのXベースのターミナルエミュレーターはVT100をシミュレートしており、そこで行われていることの1つは「代替画面バッファー」のサポートです。順次出力とのほとんどの端末相互作用に使用される通常のバッファーとは異なり、代替画面バッファーは端末の正確なサイズにすぎません。上下にスクロールすることはありません。表示されているものより大きくないからです。
そこにあるアイデアは、フルスクリーンアプリケーションが、既に画面に表示されているものに邪魔されることなく、必要なことを実行できるようにし、以前の表示に戻れるようにすることです。そのため、入力するvim
と画面全体に表示されますが、画面を離れると、以前の端末出力(過去のすべてのプロンプトとコマンド出力)が再び表示されます。vim
起動時に代替画面バッファに切り替え、終了時に通常のバッファに戻ります。
この代替バッファは、前述の注意事項の1つです。時々、プログラムは実際に、バッファをどうするかを端末に伝える機能を持っています。
screen
これを行う別のプログラムです。これが、スクリーンセッション中に端末のスクロール機能が通常機能しない理由です。 screen
スクロールバックバッファー自体をエミュレートするため、古い機能を使用するには内部機能を使用する必要があります。
または、vimは親スクロールバックバッファの上に何らかの方法でオーバーレイされた独自のスクロールバックバッファを使用しますか?
私はほとんど前の質問でこれに答えましたが、この特定の質問に対する短い答えはvim
、ターミナルからスクロールバックなしで独自の一時バッファを取得し、ドキュメントのすべてのスクロールを内部で実行することです。
私が言及したすべての例外:
再び少し複雑になります。アプリケーションはスクロールバックを制御できず、端末によって完全に提供されると言いました。場合によっては、一部の端末では、相互作用が制限されます。プログラムは特定のエスケープシーケンスを出力します(過去に手動で端末の色付けを使用したことがある場合は、それらがどのように見えるかを確認できます)。どのエスケープシーケンスが利用可能かは、termcap(端末能力)データベースに記述されています。
一部の端末は、限られたクエリとスクロールバックバッファの操作をサポートします。多くのxterm
派生物には、端末にビューをスクロールさせるエスケープシーケンスがあります。多くの端末は、画面の特定の領域を指定してスクロールし、残りのすべてをそのまま残します。これは、スクロールバックバッファーを破損する傾向があります。
ほとんどすべての端末は、画面の周りでカーソルを移動するシーケンスをサポートしています。これにより、ncurses
ライブラリはディスプレイのすべての異なる部分を更新できます。でサポートさxterm
れているVT100シーケンスを見ることができます。これらがスクロールバックバッファーと対話する方法は、特にless
コマンドのように独自のスクロール動作を実装するものの場合、少し奇妙になることがあります。less
端末が予期していなかった方法でテキストを上部に再描画したため、スクロールバックで行が重複または欠落する可能性があります。他のプログラムでは、表示全体の複数のコピーでバッファがいっぱいになる場合があります。