exe*_*ook 4 curses terminal ncurses xterm ansi-escape
当您启动 (n)curses 程序时,它将从终端模拟器中删除滚动条,清除屏幕,滚动日志(历史记录)也将消失。当退出程序时,屏幕内容重新出现,滚动条返回,滚动缓冲区返回。
ncurses是怎么做到的?我研究了所有 ANSI 转义码,我看不出有什么可以做这样的事情。这背后的技术是什么?
xterm FAQ 中对此进行了详细讨论为什么运行 vi 时屏幕不清晰?。
ncurses本身不这样做。这是由终端根据终端描述中提供的转义序列来完成的。
该行为来自备用屏幕缓冲区,它是在 X10R4(1986 年底)中随 xterm 引入的。xterm 维护两个缓冲区:
xterm(以及使用此功能的程序,例如 rxvt)识别用于在两个缓冲区之间切换的转义序列。由于传统的 termcap 没有此功能,因此开发人员使用 termcap 初始化序列ti和te(对应于 terminfosmcup和rmcup)。从技术上讲,这些名称指的是游标寻址模式,但没有人(太)关心。
原始 xterm 的备用屏幕功能可以通过在运行时删除 termcapti和te功能(从TERMCAP环境变量中)来抑制,但该方法无法与使用文件的 terminfo 一起使用。自 1997 年以来,xterm 实现了一组更新的转义序列,这些序列可以被 xterm 忽略。其他一些程序允许抑制该功能,但通常情况下,这些程序不会。
该技术称为“备用屏幕缓冲区”。终端仿真器提供两种模式:主要模式和备用模式。备用屏幕缓冲区没有回滚功能,当您在这些缓冲区之间切换时,其中的内容将被保留。要在它们之间切换,请使用smcupANSIrmcup转义序列。以二进制形式来说,它们是:
$ 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|
Run Code Online (Sandbox Code Playgroud)