Shell的raw模式
发布于
- 修改于
2022/01/05
- 大约需要 1 分钟
- 413 字
前言
之所以想到这个问题是因为看到B站有人做了命令行扫雷。
本来扫雷也没什么难的,我也手痒想试试,但是遇到了一个问题:Scala读输入都是要一行以后回车才能读进去。 这对于命令行游戏来说明显有问题:总不能每个上下左右都加个回车才有反应吧。 于是我便开始搜索这个问题的解。
过程
我首先想到的是用其他语言看看有没有什么库。
我找到的是rust的crossterm这个库。当我用它的read
函数进行读操作的时候,依然需要加上空格才能读进去。
但是仔细一看文档,有这么一句话:
Make sure to enable raw mode in order for keyboard events to work properly
这个raw mode才是我在找的东西。只有在raw mode下,才能够让每一个按键事件直接让程序来处理,
而不是放进buffer等待回车输入。而这个raw mode其实与语言无关,是Shell的模式。因此我们只需要通过stty raw
设置Shell即可。
解
import scala.io._
import scala.sys.process._
@main
def main(): Unit = {
val exit_code: Int = Seq("/bin/sh", "-c", "stty raw < /dev/tty").!
println(Source.stdin.next())
}
编译并运行,我们可以看到即便是上下左右键也能正常显示。