Bash 如何更改终端大小事件?

Bash 如何更改终端大小事件?,bash,scala,terminal,Bash,Scala,Terminal,我正在开发一个Scala脚本,它在Bash脚本中运行(在Linux机器上)。为了拥有一个复杂的用户界面,我现在需要始终知道确切的终端大小 那么,如何获取终端窗口大小(行、列)更改事件?像mc(Midnight Commander)这样的程序似乎会立即对窗口大小的变化做出反应。我也想要这个:) 更新: 在larsks和Thomas Dickey的帮助下,我找到了一个解决方案,如下所示: import sun.misc.{Signal, SignalHandler} Signal.handle(n

我正在开发一个Scala脚本,它在Bash脚本中运行(在Linux机器上)。为了拥有一个复杂的用户界面,我现在需要始终知道确切的终端大小

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

更新: 在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下运行时,窗口大小的更改会导致向程序发送一个
SIGWINCH
信号。您需要安排使用Scala为信号处理提供的任何机制来响应此信号(可能是某种机制,但我不知道任何Scala)。

SIGWINCH
独立于X11产生:

  • SIGWINCH
    可能最早用于PostScript渲染系统),以及
  • (Telnet窗口大小选项)是另一个起点
尽管如此,X10R4(1986年12月)在xterm中使用了
SIGWINCH
。不管它的历史如何,它不仅仅是一个X11特性

在Java中,您可以用来捕获
SIGWINCH
。Scala是Java的基础,但这提供了一个起点。例如,有几个Github项目可能对阅读以下内容很有用:


由于scala是java,我想让您看看Bash中的导出后列,我可以在scala中使用sys.env(“列”)。但该值仅反映VM启动时的情况。这没有帮助。那么像mc(Midnight Commander)这样的程序是如何做到这一点的呢?我对“Midnight Commander”一窍不通,你知道这个程序是否在Java上运行吗?如果是的话,看看他们是怎么做的(如果你能找到他们的代码)。如果是在C/C++中,您也许可以使用他们的技术和JNI来使用他们自己的方法。谢谢!这很有帮助。但是,POSIXSignalHandler不是我的选项,因为它不是标准JVM的一部分。国际刑警组织的“signals.scala”看起来很有希望,但不知什么原因,它对我来说并不是现成的。欣喜若狂可能是有用的;然而,我需要调查,因为没有它的库,它就无法工作。。。