時折、他のソフトウェアの repl に結果を突っ込みたいことがあります。repl で実行された関数の結果をシステムのクリップボードにコピーする便利な方法はありますか? 結果をファイルに出力できることはわかっspit
ています。mac os x を使用しています。
1 に答える
8
*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"
これは一時的なバインディングであり、ブロック*out*
の外側では無傷のBean です。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 ~@body)]
(.. Toolkit
(getDefaultToolkit)
(getSystemClipboard)
(setContents (StringSelection. (str *out*)) nil))
result#)))
次のように使用します。
user> (with-clipboard
(println :hello)
(println :clipboard)
(+ 10 20))
;; => 30
クリップボードには次のものが含まれます。
:hello
:clipboard
于 2016-07-20T16:59:10.517 に答える