2012-11-17 12 views
7

Clojureで端末からスイングではなく1回のキーストロークを読み取るにはどうすればよいですか?Clojureでバッファリングされていないキーボード入力を読み取る

私はJLineライブラリのvariousversionsを含むいくつかのことを試しましたが、動作していません(下記の例を参照)。

私はうれしいことに、Unix専用(Mac、Linux、...)の例を受け入れます。理想的には、stdinとstdoutの両方のバッファリングをオフに切り替える方法を知りたいです。これは、「スタート」が、制御-Cを除くすべての入力に応答しない出力します

;; project.clj dependencies: 
;; [[org.clojure/clojure "1.4.0"] 
;; [jline/jline "2.8"]]) 

(ns slosh.core 
    (:import [jline.console ConsoleReader]) 
    (:gen-class))  

(defn -main [] 
    (println "start") 
    (let [cr (ConsoleReader.)] 
    (.readCharacter cr) 
    (println "done"))) 

はここに近いものです。

答えて

5

私はあなたがこれをどのように実行しているか分かりませんが、lein runを使用している場合、問題が発生します。 lein trampoline runを使用してください。

私はSingle character console input in java/clojureをリンクしますが、私はそれを行うのに十分なインターネットポイントを持っていないようです。

+0

überjarから走っているように、 'lein trampoline run'が実際に動作します。 1つの作品がなぜ作品になるのか、他の作品ではないのか? – JohnJ

+1

'lein run'で使われる' sh'関数は 'out'と' err'をサブプロセスとして実行します(https://github.com/technomancy/leiningen/blob/master/leiningen-coreを参照)。 /src/leiningen/core/eval.clj#L155)。 'trampoline'は、プロジェクトが' in'、 'out'、' err'をシェルと結びつけて独立したプロセスとして実行されます。 – johnwayner

+0

素晴らしいです、ありがとう! – JohnJ

関連する問題