使用ruby(或其他语言)的全屏终端应用程序

时间:2013-09-15 10:07:35

标签: ruby vim terminal command-line-interface

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

示例:

terminal window with scrollback http://i44.tinypic.com/2pyw3rt.png (带滚动的终端窗口)

maximized vim without scrollback http://i44.tinypic.com/i2osjk.png (最大化的vim没有回滚)

back in shell with scrollback and vim gone http://i41.tinypic.com/2hdqs1i.png (回到shell中,回滚并且vim消失了)

我如何在自己的应用程序中执行此操作,最好是ruby?

1 个答案:

答案 0 :(得分:12)

这是大多数终端通过XTerm control sequence specifications支持的模式。

可以使用这些规格激活的特定屏幕切换模式称为alternate screen buffer

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

激活备用缓冲区的顺序为CSI ? 47 h。 CSI代表控制序列启动器,它通常是ESC + [。因此,通过向终端发送ESC [ ? 47 h(不带空格),它将切换到备用缓冲区。

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

切换回正常屏幕缓冲区的序列是CSI ? 47 l,您可以像运行cat命令并输入密钥ESC [ ? 47 l并按Enter键一样测试。{ / p>

然而,当编写基于复杂终端屏幕的应用程序时,大多数人倾向于使用像 curses ncurses 这样的库,它将为您处理所有终端处理的东西。请参阅以下示例:

Learning Ruby Curses
http://www.ruby-doc.org/stdlib-2.0.0/libdoc/curses/rdoc/Curses.html

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