Skip to content

Instantly share code, notes, and snippets.

@dominicfreeston
Last active May 12, 2022 21:30
Show Gist options
  • Save dominicfreeston/76d4adc6b3594a345f8d2cf683c51a88 to your computer and use it in GitHub Desktop.
Save dominicfreeston/76d4adc6b3594a345f8d2cf683c51a88 to your computer and use it in GitHub Desktop.
Reload browser on file-change (Ubuntu/xdotool/babashka)
#!/usr/bin/env bb
(require '[babashka.pods :as pods])
(pods/load-pod 'org.babashka/fswatcher "0.0.3")
(require '[pod.babashka.fswatcher :as fw])
(println "select window to reload")
;; This will block the script until the user has selected a window
(def browser-window (:out (shell/sh "xdotool" "selectwindow")))
(println "will reload" (:out (shell/sh "xdotool" "getwindowname" browser-window)))
(defn reload []
(println "reloading...")
(shell/sh "xdotool" "key" "--window" browser-window "F5"))
;; This implements a debounce mechanism where we want to
;; delay triggering the reload until we stop receiving events.
(def reload-op (atom nil))
(defn trigger-reload [_]
(let [[old _] (reset-vals! reload-op (future (Thread/sleep 20) (reload)))]
(when old (future-cancel old))))
(let [folder (first *command-line-args*)]
(fw/watch folder
trigger-reload
{:delay-ms 0 :recursive true})
(println "watching" (str (fs/canonicalize folder))))
@(promise)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment