症状
理由はよく分かんないけど、Clojure から使っている Java のライブラリの中で System.out.print() とかしてる部分があってそれが表示されなかった。
別に Java で書いたからダメって事ではなくて
(.print System/out "aaa")
とかやっても出ない。
対処法(とりあえず理由はおいといて)
(let [print-stream
(fn print-stream
[type]
(let [printer (case type
:out '*out*
:err '*err*)]
(java.io.PrintStream. (proxy [java.io.OutputStream] []
(close [] (.flush ^java.io.OutputStream this))
(write
([bytes]
(.write @(resolve printer) (String. bytes)))
([bytes ^Integer off ^Integer len]
(let [byte-range (byte-array
(take len (drop off bytes)))]
(.write @(resolve printer) (String. byte-range)))))
(flush []
(.flush @(resolve printer))))
true)))]
(System/setOut (print-stream :out))
(System/setOut (print-stream :err)))
とかを、どこの namespace でもいいのでevalする
ほぼ https://github.com/clojure-emacs/cider-nrepl/blob/master/src/cider/nrepl/middleware/out.clj のまるパクりです。
途中まで調べた事
上に
(.print System/out "aaa")
が表示されないと書いたけど、Emacs から cider-jack-in するとダメだけど
java -cp ~/.m2/repository/org/clojure/clojure/1.8.0/clojure-1.8.0.jar clojure.main
と、シンプルな構成で起動すると問題なかったので、nrepl あたりで問題が出てそう。
多分、System.out.print() とかで表示されてないというのは、nrepl の サーバの System.out に出てるんだろうけど、それが nrepl のクライアントに来てないのかと思う。
でも、cider.el
の変数 cider-jack-in-nrepl-middlewares
で、その辺り設定していると思うんだけど、特にイジってなくて ("cider.nrepl/cider-middleware")
で、いいのかなと思う。
直接、問題の箇所っぽい cider.nrepl.middleware.out/wrap-out
だけを指定しても変わんないし。