将leiningen repl的结果复制到剪贴板中

sum*_*mek 0 macos clojure leiningen nrepl

偶尔我想在其他软件的repl中戳一个结果.有没有一种方便的方法将repl中运行的函数的结果复制到系统剪贴板?我知道我可以spit将结果输出到文件中.我正在使用mac os x.

lee*_*ski 6

您可以随时重新绑定*out*特殊变量,以指向新位置.例如,您可以将所有输出收集到字符串:

user> (def result (java.io.StringWriter.))
#'user/result

user> (binding [*out* result]
        (println :aaa)
        (println :bbb))
nil

user> (str result)
":aaa\n:bbb\n"
Run Code Online (Sandbox Code Playgroud)

这是一个暂时的约束,*out*binding街区之外完好无损:

user> (println :aaa)
:aaa
nil
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下命令重置线程级别的输出set!:

user> (def result (java.io.StringWriter.))
#'user/result

user> (set! *out* result)
#object[java.io.StringWriter 0x66c129d9 ""]

user> (println :aaa)
nil

user> (println :bbb)
nil

user> (str result)
":aaa\n:bbb\n"
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用java.awt类将此字符串放入剪贴板:

user> (import 'java.awt.Toolkit)
java.awt.Toolkit

user> (import 'java.awt.datatransfer.StringSelection)
java.awt.datatransfer.StringSelection

user> (.. Toolkit
          (getDefaultToolkit)
          (getSystemClipboard)
          (setContents (StringSelection. (str result)) nil))
nil
Run Code Online (Sandbox Code Playgroud)

而已.现在只需粘贴它.应该在mac上正常工作.

然后你可以用宏来概括它:

(defmacro with-clipboard [& body]
  `(binding [*out* (java.io.StringWriter.)]
     (let [result# (do ~@body)]
       (.. Toolkit
           (getDefaultToolkit)
           (getSystemClipboard)
           (setContents (StringSelection. (str *out*)) nil))
       result#)))
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

user> (with-clipboard
        (println :hello)
        (println :clipboard)
        (+ 10 20))
;; => 30
Run Code Online (Sandbox Code Playgroud)

和剪贴板将包含:

:hello
:clipboard
Run Code Online (Sandbox Code Playgroud)