當您啓動(n)的詛咒程序,它會從你的終端仿真器中刪除滾動條,清屏,滾動日誌(歷史)也將消失。當您退出程序時,屏幕內容會再次出現,滾動條返回,滾動緩衝區返回。curses如何保留屏幕內容?
如何ncurses的不是嗎?我研究了所有的ANSI轉義代碼,我看不到任何可以做這種事情的東西。這背後的技術是什麼?
當您啓動(n)的詛咒程序,它會從你的終端仿真器中刪除滾動條,清屏,滾動日誌(歷史)也將消失。當您退出程序時,屏幕內容會再次出現,滾動條返回,滾動緩衝區返回。curses如何保留屏幕內容?
如何ncurses的不是嗎?我研究了所有的ANSI轉義代碼,我看不到任何可以做這種事情的東西。這背後的技術是什麼?
該技術被稱爲The Alternate Screen Buffer。終端仿真器提供兩種模式:主模式和備用模式。備用屏幕緩衝區沒有向後滾動,當您在這些緩衝區之間切換時,它們中的內容將被保留。要在它們之間切換,請使用smcup
和rmcup
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|
這在長度在xterm FAQ Why doesn't the screen clear when running vi?討論。
ncurses的因此不會做。這是由終端,鑑於終端描述提供的轉義序列來完成。
該行爲來自替代屏幕緩衝區,它是在x10R4(1986年底)中引入xterm。 xterm的維持兩個緩衝器:
xterm(以及使用此功能的程序,例如rxvt)可識別用於在兩個緩衝區之間切換的轉義序列。由於傳統的termcap有對此沒有特徵,開發者所使用的的termcap初始化序列ti
和te
(其對應於TERMINFO smcup
和rmcup
)。技術上這些名稱是指光標尋址模式,但沒有人關心(很多)。
通過在運行時刪除termcap ti
和te
功能(來自TERMCAP
環境變量),可以抑制原始xterm的備用屏幕功能,但該方法無法與使用文件的terminfo一起使用。自1997年以來,xterm已經實現了一套可以被xterm忽略的更新的轉義序列。其他一些程序允許壓縮該功能,但通常情況下,這些程序不會。