curses如何保留屏幕内容?

时间:2016-08-28 06:15:43

标签: terminal ncurses curses xterm ansi-escape

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

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

2 个答案:

答案 0 :(得分: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可以忽略它们。其他一些程序允许抑制该功能,但通常情况下不会这样做。

答案 1 :(得分: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|