如何获得终端大小更改事件?
how to get a terminal size changed event?
我正在开发一个在 Bash 脚本(在 Linux 机器上)中运行的 Scala 脚本。为了拥有一个复杂的用户界面,我现在总是需要精确的终端尺寸。
那么如何获取终端 window 大小(行、列)的变化事件呢?像 mc (Midnight Commander) 这样的程序似乎 立即 对 window 尺寸变化做出反应。我也想要这个:)
更新:
在 larsks 和 Thomas 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:
X10R4(1986 年 12 月)仍然在 xterm 中使用 SIGWINCH
。不管它的历史如何,它不仅仅是一个 X11 特性。
在 Java 中,您可以使用 POSIXSignalHandler to catch SIGWINCH
. Scala is not identical 到 Java,但这提供了一个起点。例如,有一些 Github 项目可能对阅读有用:
我正在开发一个在 Bash 脚本(在 Linux 机器上)中运行的 Scala 脚本。为了拥有一个复杂的用户界面,我现在总是需要精确的终端尺寸。
那么如何获取终端 window 大小(行、列)的变化事件呢?像 mc (Midnight Commander) 这样的程序似乎 立即 对 window 尺寸变化做出反应。我也想要这个:)
更新: 在 larsks 和 Thomas 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:
X10R4(1986 年 12 月)仍然在 xterm 中使用 SIGWINCH
。不管它的历史如何,它不仅仅是一个 X11 特性。
在 Java 中,您可以使用 POSIXSignalHandler to catch SIGWINCH
. Scala is not identical 到 Java,但这提供了一个起点。例如,有一些 Github 项目可能对阅读有用: