57 lines
1.8 KiB
Clojure
57 lines
1.8 KiB
Clojure
(require '[clojure.string :as str])
|
|
(declare cm)
|
|
|
|
(defn eval-me []
|
|
(js/scittle.core.eval_string (-> cm .-state .-doc .toString)))
|
|
|
|
(def extension
|
|
(.of js/cv.keymap
|
|
(clj->js [{:key "Mod-Enter"
|
|
:run (fn []
|
|
(eval-me))}
|
|
#_{:key (str modifier "-Enter")
|
|
:shift (partial eval-top-level on-result)
|
|
:run (partial eval-at-cursor on-result)}])))
|
|
(def cm
|
|
(let [doc (str/trim "
|
|
(require '[reagent.core :as r]
|
|
'[reagent.dom :as rdom]
|
|
'[re-frame.core :as rf])
|
|
|
|
(rf/reg-event-fx ::click (fn [{:keys [db]} _] {:db (update db :clicks (fnil inc 0))}))
|
|
(rf/reg-sub ::clicks (fn [db] (:clicks db)))
|
|
|
|
(defn my-component []
|
|
(let [clicks (rf/subscribe [::clicks])]
|
|
[:div
|
|
[:p \"Clicks: \" @clicks]
|
|
[:p [:button {:on-click #(rf/dispatch [::click])}
|
|
\"Click me!\"]]]))
|
|
|
|
(rdom/render [my-component] (.getElementById js/document \"reagent\"))
|
|
")]
|
|
(js/cm.EditorView. #js {:doc doc
|
|
:extensions #js [js/cm.basicSetup, (js/lc.clojure), (.highest js/cs.Prec extension)]
|
|
:parent (js/document.querySelector "#app")
|
|
#_#_:dispatch (fn [tr] (-> cm (.update #js [tr])) (eval-me))
|
|
})))
|
|
(set! (.-eval_me js/globalThis) eval-me)
|
|
(set! (.-cm_instance js/globalThis) cm)
|
|
|
|
(defn linux? []
|
|
(some? (re-find #"(Linux)|(X11)" js/navigator.userAgent)))
|
|
|
|
(defn mac? []
|
|
(and (not (linux?))
|
|
(some? (re-find #"(Mac)|(iPhone)|(iPad)|(iPod)" js/navigator.platform))))
|
|
|
|
(let [elt (js/document.getElementById "evalMe")
|
|
txt (.-innerText elt)
|
|
mod-symbol (if (mac?)
|
|
"⌘"
|
|
"⌃")
|
|
txt (str txt " " mod-symbol"-⏎")]
|
|
(set! (.-innerHTML elt) txt))
|
|
|
|
(eval-me)
|