2016-08-28 93 views
3

當您啓動(n)的詛咒程序,它會從你的終端仿真器中刪除滾動條,清屏,滾動日誌(歷史)也將消失。當您退出程序時,屏幕內容會再次出現,滾動條返回,滾動緩衝區返回。curses如何保留屏幕內容?

如何ncurses的不是嗎?我研究了所有的ANSI轉義代碼,我看不到任何可以做這種事情的東西。這背後的技術是什麼?

回答

2

該技術被稱爲The Alternate Screen Buffer。終端仿真器提供兩種模式:主模式和備用模式。備用屏幕緩衝區沒有向後滾動,當您在這些緩衝區之間切換時,它們中的內容將被保留。要在它們之間切換,請使用smcuprmcup ANSI轉義序列。以二進制形式,他們是:

$ tput smcup|hexdump -C 
00000000 1b 5b 3f 31 30 34 39 68       |.[?1049h| 

$ tput rmcup|hexdump -C 
00000000 1b 5b 3f 31 30 34 39 6c       |.[?1049l| 
4

這在長度在xterm FAQ Why doesn't the screen clear when running vi?討論。

ncurses的因此不會做。這是由終端,鑑於終端描述提供的轉義序列來完成。

該行爲來自替代屏幕緩衝區,它是在x10R4(1986年底)中引入xterm。 xterm的維持兩個緩衝器:

  • 正常屏幕緩衝區(你在VT100窗口中看到),包括回溯區,
  • 備用屏幕緩衝區(不包括回溯區)

xterm(以及使用此功能的程序,例如rxvt)可識別用於在兩個緩衝區之間切換的轉義序列。由於傳統的termcap有對此沒有特徵,開發者所使用的的termcap初始化序列tite(其對應於TERMINFO smcuprmcup)。技術上這些名稱是指光標尋址模式,但沒有人關心(很多)。

通過在運行時刪除termcap tite功能(來自TERMCAP環境變量),可以抑制原始xterm的備用屏幕功能,但該方法無法與使用文件的terminfo一起使用。自1997年以來,xterm已經實現了一套可以被xterm忽略的更新的轉義序列。其他一些程序允許壓縮該功能,但通常情況下,這些程序不會。