如何获得终端大小更改事件?

how to get a terminal size changed event?

我正在开发一个在 Bash 脚本(在 Linux 机器上)中运行的 Scala 脚本。为了拥有一个复杂的用户界面,我现在总是需要精确的终端尺寸。

那么如何获取终端 window 大小(行、列)的变化事件呢?像 mc (Midnight Commander) 这样的程序似乎 立即 对 window 尺寸变化做出反应。我也想要这个:)

更新:larsksThomas Dickey 的帮助下,我找到了一个解决方案,如下所示:

import sun.misc.{Signal, SignalHandler}

Signal.handle(new Signal("WINCH"), TerminalSizeChangedHandler)

object TerminalSizeChangedHandler extends SignalHandler
{
   override def handle(sig: Signal)
   {
      println("terminal size changed");     
   }    
}

不利的是,它依赖于 sun.misc 类。如果有人向我展示一个没有 sun.misc 的同样简单的解决方案,我会更高兴 :)

当 运行 在 X11 下时,window 尺寸变化应该会导致 SIGWINCH 信号被发送到您的程序。您需要安排使用 Scala 为信号处理提供的任何机制来响应此信号(可能是 like this,但我不知道任何 Scala)。

SIGWINCH 独立于 X11:

  • SIGWINCH 可能首先用于 NeWS,一个 PostScript 渲染系统)和
  • NAWS(Telnet Window 大小选项)是另一个起点。

X10R4(1986 年 12 月)仍然在 xterm 中使用 SIGWINCH。不管它的历史如何,它不仅仅是一个 X11 特性。

在 Java 中,您可以使用 POSIXSignalHandler to catch SIGWINCH. Scala is not identical 到 Java,但这提供了一个起点。例如,有一些 Github 项目可能对阅读有用: