2011-10-27 11 views
5

私は、readline(Ctrl-l、矢印キー、行編集、履歴など)をサポートして、インタラクティブなシェルをscalaで書いています。readlineをサポートしているインタラクティブシェルをscalaで書くには?

私は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のプログラムを書きたいです。今まで私の最も近いソリューションは、以下のスカラ座である:

// used to support Ctrl-l, arrow keys, line editing, history, 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キーを処理するための方法を
  • Pythonと同様に例外を使用することは可能ですか?
  • はこの最適な解決策ですか、それとも改善することができますか?

答えて

7

あなたは、たとえば、jlineイベントの階層構造を記述することができます。

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)) 
    } 
    } 

sealed trait JLineEvent 
case class Line(value: String) extends JLineEvent 
case object EmptyLine extends JLineEvent 
case object EOF extends JLineEvent 

を次に、パラメータとしてJLineEventの機能を取る関数でwhileループをカプセル化することができます

最後に、適切な関数で呼び出すことができます。

console { 
    case EOF => 
      println("Ctrl-d") 
      true 
    case Line(s) if s == "q" => 
      true 
    case Line(s) => 
      println(line) 
      false 
    case _ => 
      false 
} 

ctrl+Cをキャッチするために、おそらくシャットダウンフックが解決策になります。

関連する問題