Выведите "System.out.println" в REPL Emacs Cider (или другой буфер)

Я использую Java библиотека в Clojure, Он выводит много вещей прямо на консоль, используя System.out.println,

Я использую последний Cider с Emacs. Я начинаю Сидр с cider-jack-in, Тем не менее, я вижу эти результаты. Я думал, что они будут скопированы в буфер nrepl-сервера, но это не так.

Я тоже пытался бежать (alter-var-root #'*out* (constantly *out*)) в REPL, но безуспешно.

Чего мне не хватает в том, как это нужно сделать, если это вообще можно сделать.

1 ответ

Вам необходимо заменить java.io.PrintStream назначен на System.out с тем, который будет пересылать все clojure.core/*out* (который является примером java.io.PrintWriter). Для этого вам нужно создать адаптер из PrintStream в PrintWriter, Я не нашел существующего в Java SDK API, но есть в Apache Commons IO (или вы можете реализовать его самостоятельно):

(import (java.io PrintStream)
        (org.apache.commons.io.output WriterOutputStream))

(-> *out*
    (WriterOutputStream.)
    (PrintStream.)
    (System/setOut))

С этого момента, когда вы звоните System.out.println где-нибудь в вашей JVM вывод будет передан clojure.core/*out*,

Другие вопросы по тегам