2016-07-20 38 views
0

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

回答

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" 

这是一个临时的结合,beaning这*out*将是完整的binding块之外:

user> (println :aaa) 
:aaa 
nil 

你也可以在一个重置了使用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" 

然后,您可以使用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 

就是这样。现在只需粘贴它。应该在Mac上正常工作。

然后,你可以用一个宏观概括它:

(defmacro with-clipboard [& body] 
    `(binding [*out* (java.io.StringWriter.)] 
    (let [result# (do [email protected])] 
     (.. Toolkit 
      (getDefaultToolkit) 
      (getSystemClipboard) 
      (setContents (StringSelection. (str *out*)) nil)) 
     result#))) 

,并使用它像这样:

user> (with-clipboard 
     (println :hello) 
     (println :clipboard) 
     (+ 10 20)) 
;; => 30 

和剪贴板将包含:

:hello 
:clipboard