回滾和回滾緩衝區到底是什麼?
什麼是和之類的程序中的“回滾”和“回滾緩衝區”,它們與 tty、正在執行的程序和 stdin/stdout/stderr 有什麼關係
bash
?screen
這是迄今為止我發現的“回滾”的唯一定義(在archlinux wiki中):
Scrollback 是在文本控制台中實現的功能,允許使用者返回查看已滾動到螢幕外的文本行。這是通過在影片適配器和顯示設備之間為此目的創建的緩衝區來實現的;回滾緩衝區。
但是,這對我提出了更多問題:
- 它是指“子程序”中的“功能”還是“功能”中的“功能”?
- 這個回滾緩衝區是否有 Unix 標准或 API?
- 在程序的“堆棧”中,例如在終端模擬器
vim
中啟動screen
的啟動bash
中ssh
啟動,這些程序中的哪些控制回滾緩衝區?我還曾經
screen
將回滾轉儲到文件中。該文件頂部有很多空白,看來我的終端仿真器向我顯示的“視圖”只是緩衝區的底部幾行。
- 這就是為什麼像這樣的程序
vim
可以“清除”我的整個終端視窗,因為它可以臨時訪問父 shell 的回滾緩衝區嗎?- 還是
vim
使用它自己的回滾緩衝區,它以某種方式覆蓋在父回滾緩衝區之上?
這是一個有點複雜的問題。我將嘗試依次回答您的問題,但首先是一般性描述:
回滾緩衝區由您的終端模擬器(
xterm
、Konsole、GNOME 終端)實現。它包含螢幕上顯示的所有文本,包括您在終端中執行的每個程序的標準輸出和標準錯誤。它完全是終端功能,可讓您查看可能已經滾動過去的過去輸出或檢查之前所說的內容。您可以將回滾緩衝區視為記錄輸出的一長頁,將終端視窗視為隨時查看其中一部分的視窗。如果您沒有向上滾動任何內容,那麼您正在查看的是緩衝區的尾部。通常會在終端中配置一個限制,即它在開始忘記之前跟踪的行數。
假設限制為 1000 行。對於會話中的前一千行輸出,您只需附加到緩衝區,您可以向上滾動到會話的開頭。一旦獲得第 1001 行輸出,緩衝區中的第一行就會被擦除,您可以滾動的最遠位置將是會話的第二行。緩衝區將始終包含螢幕上顯示的最近一千行輸出,您可以隨時向上滾動以查看較早的輸出。
- 它是指“子程序”中的“功能”還是“功能”中的“功能”?
這是“功能”中的“功能”。終端模擬器具有記錄螢幕內容並讓您在其中上下滾動的功能。某些系統上的控制台還支持有限的回滾。
一旦你投入其中,它就會變得更加複雜
screen
。那時,screen
正在模擬回滾緩衝區本身 - 這就是為什麼您可以在程序中從它複製和粘貼,而不僅僅是(比如說)X 選擇。
- 這個回滾緩衝區是否有 Unix 標准或 API?
簡短的回答是否定的,它只是由您的終端提供的。我們將在底部找到更長的答案。
- 在程序“堆棧”中,例如 vim 在 screen 中啟動 在 bash 中啟動 在 ssh 中啟動 在終端仿真器中啟動,這些程序中的哪些正在控制回滾緩衝區?
在 and 的情況下
vim
,bash
他們根本沒有控制它(再次警告,如下)。您的終端從您的 shell 開始為其中的所有程序提供回滾緩衝區。screen
,如上所述,正在模擬回滾本身。
- 我還使用螢幕將回滾轉儲到文件中。該文件頂部有很多空白,看來我的終端仿真器向我顯示的“視圖”只是緩衝區的底部幾行。
這是
screen
的內部緩衝區。當時螢幕上的內容通常是緩衝區最底部的內容。
- 這就是為什麼像 vim 這樣的程序可以“清除”我的整個終端視窗,因為它可以臨時訪問父 shell 的回滾緩衝區嗎?
這是它變得更加複雜的一部分。幾乎所有基於 X 的終端仿真器都在模擬 VT100,它們在那裡做的一件事就是支持“備用螢幕緩衝區”。與用於大多數終端與順序輸出互動的普通緩衝區不同,備用螢幕緩衝區只是終端的確切大小。它沒有向上或向下滾動,因為它不比顯示的大。
這個想法是允許全屏應用程序做它需要做的事情,而不會受到螢幕上已有的任何東西的干擾,然後讓你回到原來的顯示狀態。這就是為什麼當你輸入
vim
它時它會填滿整個螢幕,但當你離開它時,你之前的終端輸出——你過去的所有提示和命令輸出——又回來了。vim
啟動時切換到備用螢幕緩衝區,退出時切換回正常緩衝區。這個備用緩衝區是我上面提到的警告之一。有時,程序確實有能力告訴終端如何處理緩衝區。
screen
是另一個執行此操作的程序,這就是為什麼您的終端的滾動功能通常在您處於螢幕會話時不起作用的原因 -screen
模擬回滾緩衝區本身,因此您必須使用其內部功能來獲取舊輸出。
- 或者 vim 是否使用它自己的回滾緩衝區,它以某種方式覆蓋在父回滾緩衝區之上?
我在上一個問題中主要回答了這個問題,但對這個特定問題的簡短回答是,它
vim
確實從終端獲得了自己的臨時緩衝區,沒有回滾,然後在內部執行所有自己的文件滾動。我提到的所有這些例外:
它再次變得稍微複雜一些。我說過應用程序對回滾沒有任何控制權,它完全由終端提供。在某些情況下,對於某些終端,互動有限。該程序會列印出某些轉義序列——如果你過去曾經手動使用過終端著色,你會看到它們的樣子——終端可以解釋這些並改變它的行為,甚至將資訊發送回程序。termcap(終端能力)數據庫中描述了哪些轉義序列可用。
一些終端確實支持對回滾緩衝區的有限查詢和操作。許多
xterm
衍生產品具有引導終端滾動其視圖的轉義序列。許多終端還支持指定螢幕的特定區域進行滾動,其餘部分保持不變。這往往會破壞回滾緩衝區。幾乎所有終端都支持在螢幕上移動游標的序列,這就是
ncurses
庫能夠更新顯示的所有不同部分的方式。您可以查看支持的 VT100 序列xterm
。這些與回滾緩衝區互動的方式有時可能有點奇怪,特別是在實現自己的滾動行為的情況下,比如less
命令。您最終可能會在回滾中出現重複或缺失的行,因為less
以終端未預料到的方式在頂部重新繪製文本。其他程序有時最終會用整個顯示的多個副本填充您的緩衝區。