【问题标题】:Full screen terminal application with ruby (or other languages)使用 ruby​​(或其他语言)的全屏终端应用程序
【发布时间】:2013-09-19 14:32:46
【问题描述】:

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

例子:

(带回滚的终端窗口)

(无回滚的最大化 vim)

(返回 shell,回滚和 vim 消失)

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

【问题讨论】:

    标签: ruby vim terminal command-line-interface


    【解决方案1】:

    这是大多数终端通过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 并按回车的相同方式进行测试。

    然而,在编写复杂的基于终端屏幕的应用程序时,大多数人倾向于使用像 cursesncurses 这样的库,它们将负责处理所有终端处理内容你。例如,请参阅这些:

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

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

    【讨论】:

    • 完美,谢谢 :) 虽然我花了一段时间才弄清楚切换后端的序列以小“L”而不是“1”结尾;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2019-07-31
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多