2

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

4

1 に答える 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 に答える