如何在scala中编写带有readline支持的交互式shell?
发布时间:2020-12-16 09:56:32 所属栏目:安全 来源:网络整理
导读:我想在 scala中编写交互式shell,支持readline(Ctrl-l,箭头键,行编辑,历史记录等). 我知道如何在python中做到这一点: # enable support for Ctrl-l,arrow keys,line editing,history,etc.import readlinefinished = Falsewhile not finished: try: line = ra
我想在
scala中编写交互式shell,支持readline(Ctrl-l,箭头键,行编辑,历史记录等).
我知道如何在python中做到这一点: # enable support for Ctrl-l,arrow keys,line editing,history,etc. import readline finished = False while not finished: try: line = raw_input('> ') if line: if line == 'q': finished = True else: print line except KeyboardInterrupt: print 'Ctrl-c'; finished = True except EOFError: print 'Ctrl-d'; finished = True 我想写一个简单的scala程序,具有完全相同的行为.到目前为止,我最接近的解决方案是以下scala: // used to support Ctrl-l,etc. import scala.tools.jline val consoleReader = new jline.console.ConsoleReader() var finished = false while (!finished) { val line = consoleReader.readLine("> ") if (line == null) { println("Ctrl-d") finished = true } else if (line.size > 0) { if (line == "q") { finished = true } else { println(line) } } } 开放式问题是: >如何处理ctrl-c? 解决方法
您可以编写jline事件的层次结构,例如:
sealed trait JLineEvent case class Line(value: String) extends JLineEvent case object EmptyLine extends JLineEvent case object EOF extends JLineEvent 然后你可以将while循环封装在一个函数中,该函数将JLineEvent的函数作为参数: def console( handler: JLineEvent => Boolean ) { val consoleReader = new jline.console.ConsoleReader() var finished = false while (!finished) { val line = consoleReader.readLine("> ") if (line == null) { finished = handler( EOF ) } else if (line.size == 0) { finished = handler( EmptyLine ) } else if (line.size > 0) { finished = handler( Line( line ) ) } } 最后,您可以使用适当的函数调用它: console { case EOF => println("Ctrl-d") true case Line(s) if s == "q" => true case Line(s) => println(line) false case _ => false } 为了捕获ctrl C,也许关闭钩子可以是一个解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |