Escape-Characters

清除終端回滾緩衝區的最簡單方法+一些更深入的解釋?

  • April 27, 2022

何苦?

清除回滾緩衝區在很多方面都很方便,例如,當我希望執行一些輸出較長的命令,並希望快速滾動到此輸出的開頭時。清除回滾緩衝區後,我可以滾動到頂部,然後就完成了。

一些考慮:

根據人類的說法,有clear命令,

如果可能, clear清除螢幕,包括它的回滾緩衝區(如果定義了擴展的“E3”功能)。

在 gnome-terminalclear清除回滾緩衝區。(不過,什麼是“E3”功能?)

還有reset, 它清除了,但它的作用遠不止於此,而且它真的很慢(在我的系統上它需要超過一秒鐘,這對於人類來說是顯著的延遲被注意到)。

還有echo -ne '\ec'or echo -ne '\033c',它可以完成這項工作。並且確實比reset.

問題是,什麼是\ec序列,它與什麼clearreset做什麼有什麼不同,為什麼沒有單獨的命令呢?

還有 readline 的C-l鍵序列,預設綁定到clear-screen命令(我的意思是,readline 命令,而不是 shell 命令)。這個命令是什麼?它發出哪個轉義序列?它實際上是如何工作的?它執行shell命令嗎?要不然是啥?同樣,在 gnome-terminal 中,它似乎只是通過吐出空白行直到提示出現在終端的頂行。不確定其他終端仿真器。這是非常麻煩的行為。它用大塊的空虛污染回滾,所以你必須向上滾動更多,更多。這就像一個 hack,而不是乾淨的解決方案。

另一個問題是,是否有針對上述\ec序列的 readline 命令?我想將它綁定到,C-l因為我總是想在清除螢幕時清除回滾緩衝區。

另一個問題是如何在終端中輸入這樣的轉義序列來執行所需的操作?然後不必考慮綁定C-l到另一個 readline 命令(如果存在這樣的命令)。我試著打字Esc,然後c,但這不起作用。

更新 這個問題主要在這裡回答:https ://unix.stackexchange.com/a/375784/257159 。這是一個很好的答案,幾乎可以解釋這裡提出的所有問題。

man bash’s readline 部分

  clear-display (M-C-l)
         Clear  the  screen  and,  if possible, the terminal's scrollback buffer, then redraw the current line, leaving the
         current line at the top of the screen.
  clear-screen (C-l)
         Clear the screen, then redraw the current line, leaving the current line at the top of the screen.  With an  argu‐
         ment, refresh the current line without clearing the screen.

所以按 control + alt + L

許多終端仿真器使用與XTerm相同或類似的轉義序列。對於 XTerm,Esc``c定義為“完全復位 (RIS)”。完全重置會清除回滾緩衝區似乎是合理的。


readline我使用綁定到序列本身沒有成功,但一種解決方法是

bind '"\C-l": "\C-a\C-kprintf\ "\\033c"\C-m"'

這有一些警告。首先,它將printf命令放入您的 shell 歷史記錄中,這並不理想。二是不能邊輸入命令邊使用;它覆蓋目前輸入行。

引用自:https://unix.stackexchange.com/questions/410708