Terminal 诅咒如何保存屏幕内容?

Terminal 诅咒如何保存屏幕内容?,terminal,ncurses,curses,xterm,ansi-escape,Terminal,Ncurses,Curses,Xterm,Ansi Escape,启动(n)curses程序时,它将从终端仿真器中删除滚动条,清除屏幕,滚动日志(历史记录)也将消失。退出程序时,屏幕内容重新出现,滚动条返回,滚动缓冲区返回 这是怎么回事?我已经研究了所有的ANSI转义码,我看不到任何东西可以做这样的事情。这背后的技术是什么?这项技术被称为。终端仿真器提供两种模式:主模式和备用模式。备用屏幕缓冲区没有向后滚动,当您在这些缓冲区之间切换时,其中的内容将保留。要在它们之间切换,请使用smcup和rmcupANSI转义序列。以二进制形式,它们是: $ tput smc

启动(n)curses程序时,它将从终端仿真器中删除滚动条,清除屏幕,滚动日志(历史记录)也将消失。退出程序时,屏幕内容重新出现,滚动条返回,滚动缓冲区返回

这是怎么回事?我已经研究了所有的ANSI转义码,我看不到任何东西可以做这样的事情。这背后的技术是什么?

这项技术被称为。终端仿真器提供两种模式:主模式和备用模式。备用屏幕缓冲区没有向后滚动,当您在这些缓冲区之间切换时,其中的内容将保留。要在它们之间切换,请使用
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常见问题解答中详细讨论了这一点

这样的课程不能做到这一点。根据终端说明中提供的转义序列,这由终端完成

该行为来自备用屏幕缓冲区,该缓冲区是在X10R4(1986年底)中随xterm引入的。xterm维护两个缓冲区:

  • 正常屏幕缓冲区(您在VT100窗口中看到的),包括回滚区域,以及
  • 备用屏幕缓冲区(不包括回滚区域)
xterm(以及使用此功能的程序,如rxvt)识别两个缓冲区之间切换的转义序列。由于传统的termcap没有这方面的功能,开发人员使用termcap初始化序列
ti
te
(对应于terminfo
smcup
rmcup
)。从技术上讲,这些名称指的是光标寻址模式,但没有人在意(太多)

通过在运行时删除termcap
ti
te
功能(从
termcap
环境变量),可以抑制原始xterm的备用屏幕功能,但这种方法无法与使用文件的terminfo一起使用。自1997年以来,xterm实现了一组新的转义序列,可以被xterm忽略。其他一些程序允许抑制该特征,但通常不允许