【发布时间】:2017-01-04 10:29:59
【问题描述】:
当你启动 (n)curses 程序时,它会从你的终端模拟器中移除滚动条,清除屏幕,滚动日志(历史)也会消失。退出程序时,屏幕内容重新出现,滚动条返回,滚动缓冲区返回。
ncurses 是如何做到的?我研究了所有的 ANSI 转义码,我看不到任何可以做这些事情的东西。这背后的技术是什么?
【问题讨论】:
标签: terminal ncurses curses xterm ansi-escape
当你启动 (n)curses 程序时,它会从你的终端模拟器中移除滚动条,清除屏幕,滚动日志(历史)也会消失。退出程序时,屏幕内容重新出现,滚动条返回,滚动缓冲区返回。
ncurses 是如何做到的?我研究了所有的 ANSI 转义码,我看不到任何可以做这些事情的东西。这背后的技术是什么?
【问题讨论】:
标签: terminal ncurses curses xterm ansi-escape
xterm 常见问题解答中详细讨论了这一点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 忽略。其他一些程序允许禁止该功能,但通常不允许。
【讨论】:
这项技术被称为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|
【讨论】: