2016-07-20 8 views
0

他のソフトウェアのreplで結果を突き出したいことがあります。システムクリップボードへのreplで実行される関数の結果をコピーする便利な方法はありますか?私はspitの結果をファイルに出力することができます。私はMac OS Xを使用しています。leiningenのコピー結果をクリップボードにコピー

答えて

6

*out*特別な変数を常に新しい場所を指すように再バインドすることができます。たとえば、あなたは、文字列にすべての出力を収集することができます:

user> (println :aaa) 
:aaa 
nil 

はまた、あなたが上にをリセットできます。

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

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

user> (str result) 
":aaa\n:bbb\n" 

これは*out*bindingブロック外無傷であろうとbeaning、一時的な結合でありますスレッドレベル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で正しく動作するはずです。

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

とクリップボードが含まれています:

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

をし、このようにそれを使用します。

次に、あなただけのマクロでそれを一般化することができます

:hello 
:clipboard 
関連する問題