【问题标题】:How curses preserves screen contents?curses 如何保存屏幕内容?
【发布时间】:2017-01-04 10:29:59
【问题描述】:

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

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

【问题讨论】:

    标签: terminal ncurses curses xterm ansi-escape


    【解决方案1】:

    xterm 常见问题解答中详细讨论了这一点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 忽略。其他一些程序允许禁止该功能,但通常不允许。

    【讨论】:

      【解决方案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|
      

      【讨论】:

        猜你喜欢
        • 2019-03-07
        • 2014-01-12
        • 2017-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-22
        • 2010-09-24
        • 1970-01-01
        相关资源
        最近更新 更多