【发布时间】:2013-09-19 14:32:46
【问题描述】:
您是否使用过诸如vim 或htop 之类的cli 工具?所有这些都将在终端内最大化并且没有回滚,但是当您退出时,它们会消失,您可以看到您之前输入的内容。
例子:
(无回滚的最大化 vim)
(返回 shell,回滚和 vim 消失)
如何在我自己的应用程序中执行此操作,最好是 ruby?
【问题讨论】:
标签: ruby vim terminal command-line-interface
您是否使用过诸如vim 或htop 之类的cli 工具?所有这些都将在终端内最大化并且没有回滚,但是当您退出时,它们会消失,您可以看到您之前输入的内容。
例子:
(无回滚的最大化 vim)
(返回 shell,回滚和 vim 消失)
如何在我自己的应用程序中执行此操作,最好是 ruby?
【问题讨论】:
标签: ruby vim terminal command-line-interface
这是大多数终端通过XTerm control sequence specifications支持的模式。
可以使用这些规范激活的特定屏幕切换模式称为alternate screen buffer。
当您向终端发送正确的 XTerm 控制序列时,终端将切换到备用屏幕缓冲区。一旦任何程序退出,它通常会发送命令切换回原始屏幕缓冲区。这样就可以得到应用程序恢复原来终端显示的效果。
激活备用缓冲区的顺序是CSI ? 47 h。 CSI 代表 Control Sequence Initiator,通常是ESC + [。因此,通过将ESC [ ? 47 h(不带空格)发送到终端,它将切换到备用缓冲区。
您可以通过在 shell 中运行 cat 命令、按 ESC 并输入 [?47h 并按 Enter 来测试这一点。您应该会看到屏幕清晰(或切换到其他缓冲区)。
切换回正常屏幕缓冲区的顺序是CSI ? 47 l,您可以通过运行cat 命令并输入键ESC [ ? 47 l 并按回车的相同方式进行测试。
然而,在编写复杂的基于终端屏幕的应用程序时,大多数人倾向于使用像 curses 或 ncurses 这样的库,它们将负责处理所有终端处理内容你。例如,请参阅这些:
Learning Ruby Curses
http://www.ruby-doc.org/stdlib-2.0.0/libdoc/curses/rdoc/Curses.html
我怀疑像 htop 这样的程序也可能使用 curses 或 ncurses。
【讨论】: