启动(n)curses程序时,它将从终端模拟器中删除滚动条,清除屏幕,滚动日志(历史记录)也将消失。退出程序时,屏幕内容重新出现,滚动条返回,滚动缓冲区返回。
ncurses是如何做到的?我已经研究了所有ANSI转义码,我看不到任何可以做这些事情的东西。这背后的技术是什么?
答案 0 :(得分:4)
这在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可以忽略它们。其他一些程序允许抑制该功能,但通常情况下不会这样做。
答案 1 :(得分:2)
该技术称为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|