8

你曾经使用过 cli 工具,比如vimorhtop吗?所有这些都将在终端内最大化并且没有回滚,但是当您退出时,它们会消失,您可以看到您之前输入的内容。

例子:

带回滚的终端窗口 (带回滚的终端窗口)

没有回滚的最大化vim

(没有回滚的最大化 vim)

回到 shell,回滚和 vim 不见了

(回到 shell 中,回滚和 vim 不见了)

我怎样才能在我自己的应用程序中做到这一点,最好是红宝石?

4

1 回答 1

14

这是大多数终端通过XTerm 控制序列规范支持的模式。

可以使用这些规范激活的特定屏幕切换模式称为备用屏幕缓冲区

当您向终端发送正确的 XTerm 控制序列时,终端将切换到备用屏幕缓冲区。一旦任何程序退出,它通常会发送命令切换回原始屏幕缓冲区。这样您就可以获得应用程序恢复原始终端显示的效果。

激活备用缓冲区的顺序是CSI ? 47 h。CSI 代表 Control Sequence Initiator,通常是ESC + [. 因此,通过向ESC [ ? 47 h终端发送(不带空格),它将切换到备用缓冲区。

您可以通过cat在 shell 中运行命令、按 ESC 并键入 [?47h 并按 Enter 来测试它。您应该看到屏幕清晰(或切换到另一个缓冲区)。

切换回正常屏幕缓冲区的顺序是CSI ? 47 l,您可以以与运行cat命令并键入键ESC [ ? 47 l 并按 Enter 键相同的方式进行测试。

然而,在编写基于终端屏幕的复杂应用程序时,大多数人倾向于使用像cursesncurses这样的库,它会为您处理所有终端处理的东西。例如,请参阅这些:

学习 Ruby 诅咒
http://www.ruby-doc.org/stdlib-2.0.0/libdoc/curses/rdoc/Curses.html

我怀疑像 htop 这样的程序也可能使用 curses 或 ncurses。

于 2013-09-15T12:10:22.660 回答