diff --git a/.hammerspoon/handle-urls.fnl b/.hammerspoon/handle-urls.fnl new file mode 100644 index 0000000..632b4df --- /dev/null +++ b/.hammerspoon/handle-urls.fnl @@ -0,0 +1,63 @@ +;; https://stackoverflow.com/questions/39464668/how-to-get-bundle-id-of-mac-application +;; osascript -e 'id of app "SomeApp"' +;; mdls -name kMDItemCFBundleIdentifier -r SomeApp.app +;; (. (hs.application.infoForBundlePath "/path/to/app") :CFBundleIdentifier) + +(local bundle-ids {:firefox-dev :org.mozilla.firefoxdeveloperedition + :firefox :org.mozilla.firefox + :safari :com.apple.Safari + :zoom :us.zoom.xos}) + +(var handlers []) + +(fn run [bin url] + (let [prog (.. bin " '" url "'") + handle (io.popen prog)] + (handle:read :*a))) + +(fn de-utm [url] + (run "~/.dotfiles/bin/de-utm" url)) + +(fn follow-redirects [url] + (run "curl --location --silent -o /dev/null -w %{url_effective}" url)) + +(fn open-url [app url] + (let [bundle-id (. bundle-ids app)] + (hs.urlevent.openURLWithBundle url bundle-id))) + +(fn open-with [app] + (partial open-url app)) + +(fn url->handler [url] + (accumulate [acc nil _ [pat handler] (ipairs handlers) &until acc] + (if (url:find pat) #(handler url) nil))) + +(fn handle-url [url] + (let [handler (or (url->handler url) #(open-url :default url))] + (handler))) + +(fn setup [{:bundle-ids extra-bundle-ids :handlers extra-handlers}] + (let [default-handlers [["^https://.*%.?zoom.us/j/%d+" (open-with :zoom)] + ["^https://doi.org/" + #(open-url :default (.. "https://sci-hub.st/" $1))]]] + (each [k v (pairs (or extra-bundle-ids {}))] + (tset bundle-ids k v)) + (set handlers (hs.fnutils.concat extra-handlers default-handlers)))) + +(fn start [] + (set hs.urlevent.httpCallback + (fn [scheme host params url] + (let [clean-url (de-utm url)] + (handle-url clean-url))))) + +;; example usage +;; +;; (let [{: setup : start : open-with} (require :handle-urls)] +;; (setup {:bundle-ids {:default :org.mozilla.firefoxdeveloperedition} +;; :handlers [["^https://.*%.?discnw.org/" (open-with :safari)] +;; ["^https://squareup.com/" (open-with :safari)] +;; ["^https://.*%.?bulletin.com/" (open-with :safari)]]}) +;; (start)) + +{: setup : start : open-url : open-with} + diff --git a/.hammerspoon/hotkey.fnl b/.hammerspoon/hotkey.fnl index 59810df..11b7654 100644 --- a/.hammerspoon/hotkey.fnl +++ b/.hammerspoon/hotkey.fnl @@ -1,9 +1,15 @@ +(local mash [:cmd :alt :ctrl]) +(local smash [:shift :cmd :alt :ctrl]) + (fn modal-bind [mods key message bindings] (let [modal (hs.hotkey.modal.new mods key message)] - (tset modal :entered #(hs.timer.doAfter 0.5 #(modal:exit))) - ; (tset modal :exited #(hs.alert :exited)) + (tset modal :entered #(hs.timer.doAfter 1 #(modal:exit))) + ;; (tset modal :exited #(hs.alert :bye)) (each [_ [mods key message f] (ipairs bindings)] - (modal:bind mods key message #(do (f) (modal:exit)))))) + (modal:bind mods key message + #(do + (f) + (modal:exit)))))) -{:mash [:cmd :alt :ctrl] :smash [:cmd :alt :ctrl :shift] : modal-bind} +{: mash : smash : modal-bind} diff --git a/.hammerspoon/init.fnl b/.hammerspoon/init.fnl index fb979f1..23b1db0 100644 --- a/.hammerspoon/init.fnl +++ b/.hammerspoon/init.fnl @@ -1,8 +1,8 @@ +(local {: mash : smash : modal-bind} (require :hotkey)) + (local log (hs.logger.new :log :info)) (set hs.logger.defaultLogLevel :info) -(local {: mash : smash : modal-bind} (require :hotkey)) - (set hs.window.animationDuration 0.0) (hs.loadSpoon :MiroWindowsManager) ;; (set spoon.MiroWindowsManager.fullScreenSizes [1 (/ 4 3) 2]) ; only fullscreen @@ -59,41 +59,7 @@ (hs.eventtap.keyStroke [:cmd] :v) (hs.pasteboard.setContents prev-pasteboard))) -(modal-bind mash "," "," [[mash :l :linkify linkify]]) - -;; https://stackoverflow.com/questions/39464668/how-to-get-bundle-id-of-mac-application -;; osascript -e 'id of app "SomeApp"' -;; mdls -name kMDItemCFBundleIdentifier -r SomeApp.app - -;; fnlfmt: skip -(local bundle-ids {:firefox :org.mozilla.firefoxdeveloperedition - :firefox :org.mozilla.firefox - :safari :com.apple.Safari - :zoom :us.zoom.xos}) - -(fn handle [url orig-url] - (let [open-with (fn [app] - (partial #(hs.urlevent.openURLWithBundle $2 $1) - (. bundle-ids app))) - open-url #((open-with $1) url)] - (if (url:find "^https://.*[.]zoom.us/j/%d+") (open-url :zoom) - (url:find "^https://.*[.]discnw.org/") (open-url :safari) - (url:find "^https://squareup.com/") (open-url :safari) - (url:find "^https://.*[.]bulletin.com/") (open-url :safari) - (string.find orig-url "^https://doi.org/") - ((open-with :firefox) (.. "https://sci-hub.st/" orig-url)) - (string.find orig-url "^https://.*[.]usps.com/") - ((open-with :firefox) orig-url) (open-url :safari)))) - -(set hs.urlevent.httpCallback - (fn [scheme host params url] - (let [run #(: (io.popen (.. $1 " '" $2 "'")) :read :*a) - de-utm (partial run "~/.dotfiles/bin/de-utm") - redirect (partial run "curl -Ls -o /dev/null -w %{url_effective}") - orig-url (de-utm url) - redirected (de-utm (redirect orig-url))] - ;; (hs.urlevent.openURLWithBundle orig-url bundle-ids.firefox)))) - (handle redirected orig-url)))) +(modal-bind mash "," nil [[mash :l nil linkify]]) ;;; Elgato Key Light Air