Skip to content

Instantly share code, notes, and snippets.

@exupero
Created September 22, 2017 18:32
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save exupero/1462ec16d8874dee9ee710257eaf3d3c to your computer and use it in GitHub Desktop.
Save exupero/1462ec16d8874dee9ee710257eaf3d3c to your computer and use it in GitHub Desktop.
Clojure code to interact with the system clipboard
(refer-clojure :exclude '[slurp spit])
(import '[java.awt.datatransfer DataFlavor StringSelection Transferable])
(defn clipboard []
(.getSystemClipboard (java.awt.Toolkit/getDefaultToolkit)))
(defn slurp []
(try
(.getTransferData (.getContents (clipboard) nil) (DataFlavor/stringFlavor))
(catch java.lang.NullPointerException e nil)))
(defn spit [text]
(let [selection (StringSelection. text)]
(.setContents (clipboard) selection selection)))
(def html-flavors
(into #{}
(map #(DataFlavor. %))
["text/html;class=java.lang.String"
"text/html;class=java.io.Reader"
"text/html;charset=unicode;class=java.io.InputStream"]))
(defrecord HtmlSelection [html]
Transferable
(isDataFlavorSupported [_ flavor]
(contains? html-flavors flavor))
(getTransferDataFlavors [_]
(into-array DataFlavor html-flavors))
(getTransferData [_ flavor]
(condp = (.getRepresentationClass flavor)
java.lang.String html
java.io.Reader (java.io.StringReader. html)
java.io.InputStream (java.io.StringBufferInputStream html))))
(defn spit-html [html]
(let [selection (HtmlSelection. html)]
(.setContents (clipboard) selection nil)))
@whamtet
Copy link

whamtet commented Nov 2, 2022

Great job @exupero. I was going to write this, great minds think alike!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment