diff --git a/.github/workflows/build-and-release.yaml b/.github/workflows/build-and-release.yaml index 0123cca..9c27545 100644 --- a/.github/workflows/build-and-release.yaml +++ b/.github/workflows/build-and-release.yaml @@ -39,7 +39,7 @@ jobs: run: | touch gokuw echo '#!/bin/sh' >> gokuw - echo 'watchexec -r -w `[[ -z $GOKU_EDN_CONFIG_FILE ]] && echo ~/.config/karabiner.edn || echo $GOKU_EDN_CONFIG_FILE` goku' >> gokuw + echo 'watchexec -r -e edn -w `[[ -z $GOKU_EDN_CONFIG_FILE ]] && echo ~/.config/karabiner.edn || echo $GOKU_EDN_CONFIG_FILE` goku' >> gokuw chmod +x gokuw - name: Pack run: zip -r goku.zip goku.zip goku gokuw # https://github.com/actions/virtual-environments/issues/2619#issuecomment-778827140 diff --git a/CHANGELOG.org b/CHANGELOG.org index f05b1d6..215aaeb 100644 --- a/CHANGELOG.org +++ b/CHANGELOG.org @@ -3,7 +3,14 @@ All notable changes to this project will be documented in this file. This change ** Unreleased -[Unreleased Commits]: https://github.com/yqrashawn/GokuRakuJoudo/compare/v0.5.3...HEAD +[Unreleased Commits]: https://github.com/yqrashawn/GokuRakuJoudo/compare/v0.5.4...HEAD +** 0.5.4 - 2022-07-12 +*** Changed +- use ~/bin/zsh~ instead of ~/bin/sh~ in launch agent https://github.com/yqrashawn/homebrew-goku/blob/9a4f6cd23f51535e046a33fe260876630fc20292/Formula/goku.rb#L28 +- fix joker PATH +- run through clj-kondo + +[commits in 0.5.4]: https://github.com/yqrashawn/GokuRakuJoudo/compare/v0.5.3...v0.5.4 ** 0.5.3 - 2022-05-16 @@ -61,8 +68,8 @@ All notable changes to this project will be documented in this file. This change - support simultaneous pointing_button #+NAME: sim key in from #+BEGIN_SRC clojure - {:des "sim pkey in from" - :rules [[[{:pkey :button5} {:pkey :button2}] {:pkey :button1}]]} +{:des "sim pkey in from" + :rules [[[{:pkey :button5} {:pkey :button2}] {:pkey :button1}]]} #+END_SRC [commits in 0.3.10]: https://github.com/yqrashawn/GokuRakuJoudo/compare/v0.3.9...v0.3.10 @@ -108,18 +115,18 @@ All notable changes to this project will be documented in this file. This change - ~:applications~ now supports ~file_paths~ [[https://karabiner-elements.pqrs.org/docs/json/complex-modifications-manipulator-definition/conditions/frontmost-application/][karabiner-elements documentation about file_paths]] #+BEGIN_SRC clojure - {... - :applications - {:Chromes ["^org\\.chromium\\.Chromium$" "^com\\.google\\.Chrome\\.canary$" :paths "^/Applications/Google Chrome\\.app"] - ;; same as - :Chromes [:identifiers "^org\\.chromium\\.Chromium$" "^com\\.google\\.Chrome\\.canary$" :paths "^/Applications/Google Chrome\\.app"] - - ;; can specify multiple :paths or :identifiers (can omit keyword :identifiers) - :Chromes [:identifiers "^org\\.chromium\\.Chromium$" "^com\\.google\\.Chrome\\.canary$" - :paths "^/Applications/Google Chrome\\.app" "^/Applications/Google Chrome Canary\\.app"] - - ;; paths only (can't omit keyword :paths) - :Chromes [:paths "^/Applications/.*Chrom.*"]}} +{... + :applications + {:Chromes ["^org\\.chromium\\.Chromium$" "^com\\.google\\.Chrome\\.canary$" :paths "^/Applications/Google Chrome\\.app"] + ;; same as + :Chromes [:identifiers "^org\\.chromium\\.Chromium$" "^com\\.google\\.Chrome\\.canary$" :paths "^/Applications/Google Chrome\\.app"] + + ;; can specify multiple :paths or :identifiers (can omit keyword :identifiers) + :Chromes [:identifiers "^org\\.chromium\\.Chromium$" "^com\\.google\\.Chrome\\.canary$" + :paths "^/Applications/Google Chrome\\.app" "^/Applications/Google Chrome Canary\\.app"] + + ;; paths only (can't omit keyword :paths) + :Chromes [:paths "^/Applications/.*Chrom.*"]}} #+END_SRC [commits in 0.3.4]: https://github.com/yqrashawn/GokuRakuJoudo/compare/v0.3.3...0.3.4 @@ -292,9 +299,9 @@ both stderr and stdout. ;; now we can do it with predefined layer {:layers {:wlayer {:key :w}} - :main [{:des "w layer" - :rules [[:e "open -a Emacs.app" :wlayer] - [:s "open -a Safari.app" :wlayer]]}]} + :main [{:des "w layer" + :rules [[:e "open -a Emacs.app" :wlayer] + [:s "open -a Safari.app" :wlayer]]}]} #+end_src - group rules by conditions diff --git a/src/karabiner_configurator/conditions.clj b/src/karabiner_configurator/conditions.clj index b83722d..6910bf1 100644 --- a/src/karabiner_configurator/conditions.clj +++ b/src/karabiner_configurator/conditions.clj @@ -1,15 +1,15 @@ (ns karabiner-configurator.conditions (:require - [karabiner-configurator.misc :refer :all] - [karabiner-configurator.data :refer :all])) + [karabiner-configurator.data :refer [conf-data simlayers? input-sources? devices?]] + [karabiner-configurator.misc :refer [massert]])) -(def used-simlayers-config nil) +(def used-simlayers-config (atom nil)) (defn update-used-simlayers-config [config] - (def used-simlayers-config config)) + (reset! used-simlayers-config config)) (defn cleanup-used-simlayers-config [] - (def used-simlayers-config nil)) + (reset! used-simlayers-config nil)) (defn is-simple-set-variable? [vec] (and (= 2 (count vec)) (string? (first vec)) (number? (second vec)))) @@ -19,23 +19,23 @@ [] (vec (for [condi condis - :let [validate-condi + :let [_validate-condi (massert (or (and (vector? condi) (is-simple-set-variable? condi)) (keyword? condi)) (str "invalid condition " condi ", must be a keyword or simple condition definition")) - condi!? (if (keyword? condi) (= \! (first (vec (name condi))))) + condi!? (when (keyword? condi) (= \! (first (vec (name condi))))) condi (if condi!? (keyword (subs (name condi) 1)) condi) result nil condi-type (if condi!? "frontmost_application_unless" "frontmost_application_if") - result (if (and (keyword? condi) (nn? (condi (:applications conf-data)))) - (let [this-condi (condi (:applications conf-data)) - this-condi (if (= (first this-condi) :identifiers) this-condi (into [:identifiers] (condi (:applications conf-data)))) + result (if (and (keyword? condi) (some? (condi (:applications @conf-data)))) + (let [this-condi (condi (:applications @conf-data)) + this-condi (if (= (first this-condi) :identifiers) this-condi (into [:identifiers] (condi (:applications @conf-data)))) [identifiers paths] [(into [] (rest (take-while (complement #{:paths}) this-condi))) (into [] (rest (drop-while (complement #{:paths}) this-condi)))] [identifiers paths] [(or identifiers []) (or paths [])] - identifiers? (not (empty? identifiers)) - paths? (not (empty? paths)) + identifiers? (seq identifiers) + paths? (seq paths) rst {:type condi-type} rst (if identifiers? (assoc rst :bundle_identifiers identifiers) rst) rst (if paths? (assoc rst :file_paths paths) rst)] @@ -46,7 +46,7 @@ "device_if") result (if (and (keyword? condi) (devices? condi)) {:identifiers - (vec (condi (:devices conf-data))) + (vec (condi (:devices @conf-data))) :type condi-type} result) condi-type (if condi!? @@ -54,7 +54,7 @@ "input_source_if") result (if (and (keyword? condi) (input-sources? condi)) {:input_sources - [(condi (:input-sources conf-data))] + [(condi (:input-sources @conf-data))] :type condi-type} result) condi-type (if condi!? @@ -62,12 +62,11 @@ "variable_if") result (if (and (keyword? condi) (simlayers? condi)) (do - (if (and from to (not condi!?)) - (do - (update-used-simlayers-config (condi (:simlayers conf-data))) - (update-used-simlayers-config (assoc-in used-simlayers-config [:from :sim] - (vec (conj (:sim (:from used-simlayers-config)) - (keyword (:key_code from)))))))) + (when (and from to (not condi!?)) + (update-used-simlayers-config (condi (:simlayers @conf-data))) + (update-used-simlayers-config (assoc-in @used-simlayers-config [:from :sim] + (vec (conj (:sim (:from @used-simlayers-config)) + (keyword (:key_code from))))))) ;; so that we can filter simlayer conditions in the ;; none sim one and concat it into the sim one @@ -76,8 +75,8 @@ :type condi-type} {:simlayer condi})) result) - result (if (and (keyword? condi) (nn? (or (condi (:layers conf-data)) - (condi layers)))) + result (if (and (keyword? condi) (some? (or (condi (:layers @conf-data)) + (condi layers)))) (with-meta {:name (name condi) :value 1 :type condi-type} @@ -96,6 +95,6 @@ :value 1 :type condi-type} result) - validate-result (massert (nn? result) - (str "invalid condition keyword " condi ", can't find in any predefined conditions"))]] + _validate-result (massert (some? result) + (str "invalid condition keyword " condi ", can't find in any predefined conditions"))]] result)))) diff --git a/src/karabiner_configurator/core.clj b/src/karabiner_configurator/core.clj index d3f49c3..7728152 100644 --- a/src/karabiner_configurator/core.clj +++ b/src/karabiner_configurator/core.clj @@ -1,51 +1,45 @@ (ns karabiner-configurator.core (:require [cheshire.core :as json] - [clojure.string :as string] [clojure.java.shell :as shell] - [karabiner-configurator.modifiers :as modifiers] - [karabiner-configurator.misc :refer :all] - [karabiner-configurator.data :refer :all] - [karabiner-configurator.layers :as layers] + [clojure.string :as string] + [clojure.tools.cli :as cli] + [environ.core :refer [env]] + [karabiner-configurator.data :as d] [karabiner-configurator.froms :as froms] - [karabiner-configurator.tos :as tos] - [karabiner-configurator.rules :as rules] + [karabiner-configurator.layers :as layers] + [karabiner-configurator.misc :refer [load-edn load-json massert]] + [karabiner-configurator.modifiers :as modifiers] [karabiner-configurator.profiles :as profiles] - [clojure.edn :as edn] - [me.raynes.fs :as fs] - [clojure.tools.cli :as cli] - [environ.core :refer [env]]) + [karabiner-configurator.rules :as rules] + [karabiner-configurator.tos :as tos] + [me.raynes.fs :as fs]) (:gen-class)) ;; helper function (defn update-static-conf "Helper function to update conf-data from reading rules" [key conf] - (if (nn? conf) - (assoc-conf-data key conf))) + (when (some? conf) + (d/assoc-conf-data key conf))) (defn check-edn-syntax "Call joker to check syntax of karabiner.edn" [path] - (let [;; intel mac - joker-bin1 "/usr/local/opt/joker/bin/joker" - ;; arm mac - joker-bin2 "/opt/homebrew/opt/joker/bin/joker" - ;; nix - joker-bin3 (str (System/getenv "HOME") "/.nix-profile/bin/joker") - ;; fallback to which joker - joker-bin (cond (fs/exists? joker-bin1) joker-bin1 - (fs/exists? joker-bin2) joker-bin2 - (fs/exists? joker-bin3) joker-bin3 - :else (-> (shell/sh "which" "joker") - :out - (string/trim-newline) - (str "/bin/joker")))] - (shell/sh joker-bin "--lint" path))) + (let [sys-env (into {} (System/getenv))] + (shell/sh "joker" "--lint" path + :env (merge + sys-env + {"PATH" + (str "/etc/profiles/per-user/" (System/getenv "USER") "/bin:" ;; nix profile + "/run/current-system/sw/bin:" ;; nix darwin multiuser + "/opt/homebrew/bin:" ;; arm homebrew + "/usr/local/bin:" ;; homebrew + (get sys-env "PATH"))})))) (defn exit [status & [msg]] - (if msg (println msg)) - (if (not (env :is-dev)) (System/exit status))) + (when msg (println msg)) + (when-not (env :is-dev) (System/exit status))) ;; paths (defn json-config-file-path @@ -73,17 +67,18 @@ (defn parse-edn "Init conf data and return new rules based on karabiner.edn (main section in edn file)" [conf] - (init-conf-data) - (let [{:keys [applications devices keyboard-type input-sources tos froms modifiers layers simlayers raws main simlayer-threshold templates profiles]} conf] + (d/init-conf-data) + (let [{:keys [applications devices keyboard-type input-sources tos froms modifiers layers simlayers ;; raws + main simlayer-threshold templates profiles]} conf] (if (nil? profiles) - (profiles/parse-profiles (:profiles conf-data)) + (profiles/parse-profiles (:profiles d/conf-data)) (profiles/parse-profiles profiles)) (update-static-conf :applications applications) (update-static-conf :devices devices) (update-static-conf :keyboard-type keyboard-type) (update-static-conf :input-sources input-sources) (update-static-conf :templates templates) - (if (number? simlayer-threshold) + (when (number? simlayer-threshold) (update-static-conf :simlayer-threshold simlayer-threshold)) (modifiers/parse-modifiers modifiers) (layers/parse-layers layers) @@ -103,10 +98,10 @@ (:profiles karabiner-config)] {(keyword (:name json-profile)) json-profile}))] - (doseq [[profile-k profile-v] customized-profiles] + (doseq [[profile-k _] customized-profiles] (let [profile-name-str (name profile-k)] (massert - (nn? (profile-k user-profiles)) + (some? (profile-k user-profiles)) (format "Can't find profile named \"%s\" in karabiner.json, please create a profile named \"%s\" using the Karabiner-Elements.app." profile-name-str @@ -143,17 +138,17 @@ "Root function to parse karabiner.edn and update karabiner.json." [path & [dry-run dry-run-all]] (let [edn-syntax-err (:err (check-edn-syntax path))] - (if (> (count edn-syntax-err) 0) - (do (println "Syntax error in config:") - (println edn-syntax-err) - (exit 1)))) + (when (> (count edn-syntax-err) 0) + (println "Syntax error in config:") + (println edn-syntax-err) + (exit 1))) (update-to-karabiner-json (parse-edn (load-edn path)) dry-run dry-run-all)) (defn open-log-file [] (shell/sh "open" (log-file))) ;; cli stuff -(defn help-message [options-summary] +(defn help-message [_] (->> ["GokuRakuJoudo -- karabiner configurator" "" "goku will read config file and update `Goku` profile in karabiner.json" @@ -233,8 +228,9 @@ ;; main (defn -main [& args] - (let [{:keys [action options exit-message ok? config dry-run dry-run-all]} (validate-args args)] - (if exit-message + (let [{:keys [action ;; options + exit-message ok? config dry-run dry-run-all]} (validate-args args)] + (when exit-message (case action "run" (do (parse (or config (edn-config-file-path)) dry-run dry-run-all) (exit (if ok? 0 1) exit-message)) diff --git a/src/karabiner_configurator/data.clj b/src/karabiner_configurator/data.clj index 7550ac9..66b9665 100644 --- a/src/karabiner_configurator/data.clj +++ b/src/karabiner_configurator/data.clj @@ -1,56 +1,57 @@ (ns karabiner-configurator.data (:require - [karabiner-configurator.keys-info :refer :all] - [karabiner-configurator.misc :refer :all])) + [karabiner-configurator.keys-info :refer [keys-info]] + [karabiner-configurator.misc :refer [contains?? massert]])) -(declare rule-id) +(def rule-id (atom nil)) (defn init-rule-id [] - (def rule-id -1)) + (reset! rule-id -1)) -(defn next-rule-id - "return the next rule id +;; (defn next-rule-id +;; "return the next rule id - store each rule in a vector and use the index as their id - the data structure will also store conditions used in the rule - so that we know what condition used in each profile" - [] - (def rule-id (inc rule-id)) - rule-id) +;; store each rule in a vector and use the index as their id +;; the data structure will also store conditions used in the rule +;; so that we know what condition used in each profile" +;; [] +;; (swap! rule-id inc) +;; @rule-id) -(declare conf-data) +(def conf-data (atom {})) +(def user-default-profile-name (atom :Default)) (defn init-conf-data [] (init-rule-id) - (def user-default-profile-name :Default) - (def conf-data {:profiles {:Default {:sim 50 ;; basic.simultaneous_threshold_milliseconds - :delay 500 ;; basic.to_delayed_action_delay_milliseconds - :alone 1000 ;; basic.to_if_alone_timeout_milliseconds - :held 500 ;; basic.to_if_held_down_threshold_milliseconds - :default true}} - :applications {} - :devices {} - :input-sources {} - :modifiers {} - :froms {} - :tos {} - :layers {} - :simlayers {} - :simlayer-threshold 250})) - -(defn applications? [k] (nn? (k (:applications conf-data)))) -(defn devices? [k] (nn? (k (:devices conf-data)))) -(defn input-sources? [k] (nn? (k (:input-sources conf-data)))) -(defn modifiers? [k] (nn? (k (:modifiers conf-data)))) -(defn froms? [k] (nn? (k (:froms conf-data)))) -(defn layers? [k] (nn? (k (:layers conf-data)))) -(defn simlayers? [k] (nn? (k (:simlayers conf-data)))) + (reset! user-default-profile-name :Default) + (reset! conf-data {:profiles {:Default {:sim 50 ;; basic.simultaneous_threshold_milliseconds + :delay 500 ;; basic.to_delayed_action_delay_milliseconds + :alone 1000 ;; basic.to_if_alone_timeout_milliseconds + :held 500 ;; basic.to_if_held_down_threshold_milliseconds + :default true}} + :applications {} + :devices {} + :input-sources {} + :modifiers {} + :froms {} + :tos {} + :layers {} + :simlayers {} + :simlayer-threshold 250})) + +;; (defn applications? [k] (some? (k (:applications @conf-data)))) +(defn devices? [k] (some? (k (:devices @conf-data)))) +(defn input-sources? [k] (some? (k (:input-sources @conf-data)))) +;; (defn modifiers? [k] (some? (k (:modifiers @conf-data)))) +;; (defn froms? [k] (some? (k (:froms @conf-data)))) +;; (defn layers? [k] (some? (k (:layers @conf-data)))) +(defn simlayers? [k] (some? (k (:simlayers @conf-data)))) (defn templates? [k-or-vec] (cond (keyword? k-or-vec) - (contains? (:templates conf-data) k-or-vec) + (contains? (:templates @conf-data) k-or-vec) (vector? k-or-vec) - (contains? (:templates conf-data) (first k-or-vec)))) + (contains? (:templates @conf-data) (first k-or-vec)))) (defn noti? [vec] (and (vector? vec) (let [[k id text] vec] @@ -66,25 +67,19 @@ (= :mouse_motion_to_scroll (:type rule))))) (defn profile? [k] - (and (keyword? k) (k (:profiles conf-data)))) - -(def default-profile {:Default {:sim 50 ;; basic.simultaneous_threshold_milliseconds - :delay 500 ;; basic.to_delayed_action_delay_milliseconds - :alone 1000 ;; basic.to_if_alone_timeout_milliseconds - :held 500 ;; basic.to_if_held_down_threshold_milliseconds - :default true}}) + (and (keyword? k) (k (:profiles @conf-data)))) -(def user-default-profile-name :Default) +;; (def default-profile {:Default {:sim 50 ;; basic.simultaneous_threshold_milliseconds +;; :delay 500 ;; basic.to_delayed_action_delay_milliseconds +;; :alone 1000 ;; basic.to_if_alone_timeout_milliseconds +;; :held 500 ;; basic.to_if_held_down_threshold_milliseconds +;; :default true}}) (defn update-user-default-profile-name [profile-name] (massert (keyword? profile-name) (str "invalid profile name " profile-name ", profile name must be a keyword")) - (def user-default-profile-name profile-name)) - -(defn special-modi-k? - [k] - (and (keyword? k) (or (= \! (first (name k))) (= \# (first (name k)))))) + (reset! user-default-profile-name profile-name)) (defn pkey? [pkeymap] @@ -102,8 +97,8 @@ (defn k? [k] - (if (keyword? k) - (nn? (k keys-info)))) + (when (keyword? k) + (some? (k keys-info)))) (defn modifier-k? [k] @@ -138,43 +133,42 @@ (defn mouse-keyword? [k] - (nn? (k mkey-keyword))) + (some? (k mkey-keyword))) (defn mouse-key-name [k] (massert (mouse-keyword? k) (str "invalid mouse key keyword " k)) (:name (k mkey-keyword))) -(defn special-modi-k? - [k] - (if (keyword? k) +(defn special-modi-k? [k] + (when (keyword? k) (contains?? [\! \#] (first (name k))))) -(defn find-condition-keyword - [kw] - (cond (contains? (:applications conf-data)) - {:name :application - :value (kw (:applications conf-data))} - (contains? (:devices conf-data)) - {:name :devices - :value (kw (:devices conf-data))} - (contains? (:input-sources conf-data)) - {:name :input-sources - :value (kw (:input-sources conf-data))} - (contains? (:simlayers conf-data)) - {:name :simlayers - :value (kw (:simlayers conf-data))})) +;; (defn find-condition-keyword +;; [kw] +;; (cond (contains? @conf-data :applications) +;; {:name :application +;; :value (kw (:applications @conf-data))} +;; (contains? @conf-data :devices) +;; {:name :devices +;; :value (kw (:devices @conf-data))} +;; (contains? @conf-data :input-sources) +;; {:name :input-sources +;; :value (kw (:input-sources @conf-data))} +;; (contains? @conf-data :simlayers) +;; {:name :simlayers +;; :value (kw (:simlayers @conf-data))})) (defn update-conf-data [data] - (def conf-data data)) + (reset! conf-data data)) (defn assoc-conf-data [key data] - (def conf-data (assoc conf-data key data))) + (swap! conf-data assoc key data)) (defn assoc-in-conf-data [keys-vector data] - (def conf-data (assoc-in conf-data keys-vector data))) + (swap! conf-data assoc-in keys-vector data)) -(def output "output data that will convert into json string" []) +;; (def output "output data that will convert into json string" []) diff --git a/src/karabiner_configurator/froms.clj b/src/karabiner_configurator/froms.clj index 8887362..f3b4a55 100644 --- a/src/karabiner_configurator/froms.clj +++ b/src/karabiner_configurator/froms.clj @@ -1,10 +1,9 @@ (ns karabiner-configurator.froms (:require - [karabiner-configurator.misc :refer :all] - [karabiner-configurator.data :refer :all] - [karabiner-configurator.keys :refer :all] - [karabiner-configurator.tos :as tos] - [karabiner-configurator.modifiers :as kmodifier])) + [karabiner-configurator.data :refer [conf-data from-k? k? pkey? update-conf-data]] + [karabiner-configurator.keys :refer [parse-key]] + [karabiner-configurator.misc :refer [contains?? massert]] + [karabiner-configurator.tos :as tos])) ;; this file parse from event definition ;; spec: https://karabiner-elements.pqrs.org/docs/json/complex-modifications-manipulator-definition/from/ @@ -100,8 +99,8 @@ vec)) (defn parse-simo - [sim simo simo-op-value simo-op-keyword result] - (if (and (nn? sim) (nn? simo-op-value)) + [sim _simo simo-op-value simo-op-keyword result] + (if (and (some? sim) (some? simo-op-value)) (do (massert (or (contains?? [true false] simo-op-value) (and (keyword? simo-op-value) (contains?? (:values (simo-op-keyword simo-keywords)) simo-op-value))) @@ -109,7 +108,7 @@ (if (keyword? simo-op-value) ;; there're true false (assoc-in result [:simultaneous_options (:name (simo-op-keyword simo-keywords))] (name simo-op-value)) (assoc-in result [:simultaneous_options (:name (simo-op-keyword simo-keywords))] simo-op-value))) - (if (nn? sim) + (if (some? sim) (assoc-in result [:simultaneous_options (:name (simo-op-keyword simo-keywords))] @@ -120,7 +119,7 @@ [fname finfo prevresult] (let [result prevresult {:keys [sim simo]} finfo - result (if (nn? sim) (assoc result :simultaneous (parse-keycode-or-pkey-vec fname sim)) result) + result (if (some? sim) (assoc result :simultaneous (parse-keycode-or-pkey-vec fname sim)) result) {:keys [interrupt dorder uorder upwhen]} simo result (parse-simo sim simo interrupt :interrupt result) result (parse-simo sim simo dorder :dorder result) @@ -143,7 +142,7 @@ result)) (defn generate [froms] - (assoc conf-data :froms + (assoc @conf-data :froms (into {} ;; fname is the name of the from @@ -155,5 +154,5 @@ (parse-from fname finfo))})))) (defn parse-froms [froms] - (if (nn? froms) + (when (some? froms) (update-conf-data (generate froms)))) diff --git a/src/karabiner_configurator/keys.clj b/src/karabiner_configurator/keys.clj index 39ec11f..451c00c 100644 --- a/src/karabiner_configurator/keys.clj +++ b/src/karabiner_configurator/keys.clj @@ -1,9 +1,9 @@ (ns karabiner-configurator.keys (:require - [karabiner-configurator.misc :refer :all] - [karabiner-configurator.data :refer :all] - [karabiner-configurator.modifiers :as kmodifier] - [clojure.string :refer [includes? join]])) + [clojure.string :refer [includes? join]] + [karabiner-configurator.data :as d] + [karabiner-configurator.misc :refer [contains?? massert]] + [karabiner-configurator.modifiers :as kmodifier])) (def any-key-keywords {:consumer_key_code {} :pointing_button {} @@ -11,21 +11,21 @@ (defn parse-keycode [keycode & [from-to]] (if from-to - (massert (to-k? keycode) (str "invalid key code " keycode " can't be used in from")) - (massert (from-k? keycode) (str "invalid key code " keycode " can't be used in from"))) + (massert (d/to-k? keycode) (str "invalid key code " keycode " can't be used in from")) + (massert (d/from-k? keycode) (str "invalid key code " keycode " can't be used in from"))) keycode) (defn parse-ckey [ckey] - (massert (consumer-k? ckey) (str "invalid consumer key code " ckey)) + (massert (d/consumer-k? ckey) (str "invalid consumer key code " ckey)) ckey) (defn parse-pkey [pkey] - (massert (pointing-k? pkey) (str "invalid pointing key code " pkey)) + (massert (d/pointing-k? pkey) (str "invalid pointing key code " pkey)) pkey) (defn update-mouse-map [[k v]] - [(mouse-key-name k) v]) + [(d/mouse-key-name k) v]) (defn parse-mkey [mkey] @@ -36,26 +36,26 @@ (def special-modi-optional-re #"(^#[#CSTOQWERFP]+)") (def special-modi-optional-both-re #"(#[#CSTOQWERFP]+)") -(defn special-modi-realkey [smodi] - (let [keystr (name smodi) - both (re-find special-modi-re keystr) - mandatory (if both - (re-find special-modi-mandatory-re (first both)) - (re-find special-modi-mandatory-re keystr)) - optional (if both - (re-find special-modi-optional-both-re (first both)) - (re-find special-modi-optional-re keystr)) - validate (massert (or both mandatory optional) - (str "invalid special modifier keyword " smodi)) - mandatory (if mandatory (first mandatory) nil) - optional (if optional (first optional) nil) - realkey (cond both - (keyword (subs keystr (count (first both)))) - (and mandatory (not both)) - (keyword (subs keystr (count mandatory))) - (and optional (not both)) - (keyword (subs keystr (count optional))))] - realkey)) +;; (defn special-modi-realkey [smodi] +;; (let [keystr (name smodi) +;; both (re-find special-modi-re keystr) +;; mandatory (if both +;; (re-find special-modi-mandatory-re (first both)) +;; (re-find special-modi-mandatory-re keystr)) +;; optional (if both +;; (re-find special-modi-optional-both-re (first both)) +;; (re-find special-modi-optional-re keystr)) +;; validate (massert (or both mandatory optional) +;; (str "invalid special modifier keyword " smodi)) +;; mandatory (if mandatory (first mandatory) nil) +;; optional (if optional (first optional) nil) +;; realkey (cond both +;; (keyword (subs keystr (count (first both)))) +;; (and mandatory (not both)) +;; (keyword (subs keystr (count mandatory))) +;; (and optional (not both)) +;; (keyword (subs keystr (count optional))))] +;; realkey)) (defn special-modi-vector-to-modifiers [vec] @@ -123,8 +123,8 @@ optional (if both (re-find special-modi-optional-both-re (first both)) (re-find special-modi-optional-re keystr)) - validate (massert (or both mandatory optional) - (str "invalid special modifier keyword " smodi)) + _validate (massert (or both mandatory optional) + (str "invalid special modifier keyword " smodi)) mandatory (if mandatory (first mandatory) nil) optional (if optional (first optional) nil) realkey (cond both @@ -133,8 +133,8 @@ (keyword (subs keystr (count mandatory))) (and optional (not both)) (keyword (subs keystr (count optional)))) - validate-realkey (massert (k? realkey) - (str "invalid special key keyword " smodi ", no key " realkey)) + _validate-realkey (massert (d/k? realkey) + (str "invalid special key keyword " smodi ", no key " realkey)) result (assoc result :key_code (name realkey)) mandatory (if mandatory (into [] (subs mandatory 1)) nil) optional (if optional (into [] (subs optional 1)) nil) @@ -148,28 +148,28 @@ [kname kinfo & [mandatory-only from-to]] (let [{:keys [key ckey pkey any modi mkey]} kinfo result {} - special-modi? (special-modi-k? key) - _both-special-modi-and-modi? (massert (not (and special-modi? (nn? modi))) (str "can't use special modi and modi togeher, check " kname)) - predefined-modi? (and (keyword? modi) (contains?? (:modifiers conf-data) modi)) + special-modi? (d/special-modi-k? key) + _both-special-modi-and-modi? (massert (not (and special-modi? (some? modi))) (str "can't use special modi and modi togeher, check " kname)) + predefined-modi? (and (keyword? modi) (contains?? (:modifiers @d/conf-data) modi)) _valid-modifier-definition? (massert (or (nil? modi) (map? modi) - (vector? modi) (modifier-k? modi) + (vector? modi) (d/modifier-k? modi) predefined-modi?) (str "invalid modifier definition " modi " in " kname)) - _valid-any-keyword? (if any (massert (any any-key-keywords) (str "invalid :any keyword " (name any) " in " kname))) + _valid-any-keyword? (when any (massert (any any-key-keywords) (str "invalid :any keyword " (name any) " in " kname))) mandatory-only? (true? mandatory-only) result (if special-modi? (parse-special-modi key result mandatory-only) result) - result (if (and (not special-modi?) (nn? modi)) + result (if (and (not special-modi?) (some? modi)) (if (not predefined-modi?) (if mandatory-only? (assoc result :modifiers (:mandatory (kmodifier/parse-single-modifier-definition modi kname))) (assoc result :modifiers (kmodifier/parse-single-modifier-definition modi kname))) (if mandatory-only? - (assoc result :modifiers (:mandatory (modi (:modifiers conf-data)))) - (assoc result :modifiers (modi (:modifiers conf-data))))) + (assoc result :modifiers (:mandatory (modi (:modifiers @d/conf-data)))) + (assoc result :modifiers (modi (:modifiers @d/conf-data))))) result) - result (if (and (not (:key_code result)) (nn? key)) (assoc result :key_code (name (parse-keycode key from-to))) result) - result (if (nn? ckey) (assoc result :consumer_key_code (name (parse-ckey ckey))) result) - result (if (nn? pkey) (assoc result :pointing_button (name (parse-pkey pkey))) result) - result (if (and (nn? any) (any any-key-keywords)) (assoc result :any (name any)) result) - result (if (nn? mkey) (assoc result :mouse_key (parse-mkey mkey)) result)] + result (if (and (not (:key_code result)) (some? key)) (assoc result :key_code (name (parse-keycode key from-to))) result) + result (if (some? ckey) (assoc result :consumer_key_code (name (parse-ckey ckey))) result) + result (if (some? pkey) (assoc result :pointing_button (name (parse-pkey pkey))) result) + result (if (and (some? any) (any any-key-keywords)) (assoc result :any (name any)) result) + result (if (some? mkey) (assoc result :mouse_key (parse-mkey mkey)) result)] result)) diff --git a/src/karabiner_configurator/layers.clj b/src/karabiner_configurator/layers.clj index 874a22a..7fedb20 100644 --- a/src/karabiner_configurator/layers.clj +++ b/src/karabiner_configurator/layers.clj @@ -1,19 +1,19 @@ (ns karabiner-configurator.layers (:require - [karabiner-configurator.conditions :refer :all] + [karabiner-configurator.conditions :refer [is-simple-set-variable? parse-conditions]] + [karabiner-configurator.data :as d] [karabiner-configurator.froms :as froms] - [karabiner-configurator.tos :as tos] - [karabiner-configurator.data :refer :all] - [karabiner-configurator.misc :refer :all])) + [karabiner-configurator.misc :refer [dissoc-in massert]] + [karabiner-configurator.tos :as tos])) (defn generate-simlayers [simlayers] (doseq [[k v] simlayers] - (let [validate-simlayer + (let [_validate-simlayer (massert (and - (nn? v) - (nn? (:key v)) - (k? (:key v))) + (some? v) + (some? (:key v)) + (d/k? (:key v))) (str "invalid simlayer definition " k)) modi (:modi v) modi-mandatory (:mandatory modi) @@ -21,20 +21,20 @@ _ (when modi (massert (or modi-mandatory modi-optional) "expect :mandatory or :optional to be defined")) modi-mandatory (cond (nil? modi-mandatory) nil (vector? modi-mandatory) modi-mandatory :else [modi-mandatory]) modi-optional (cond (nil? modi-optional) nil (vector? modi-optional) modi-optional :else [modi-optional]) - _ (when modi (massert (or (and modi-mandatory (every? modifier-k? modi-mandatory)) - (and modi-optional (every? modifier-k? modi-optional))) + _ (when modi (massert (or (and modi-mandatory (every? d/modifier-k? modi-mandatory)) + (and modi-optional (every? d/modifier-k? modi-optional))) "expect modifier keys in :mandatory or :optional")) condi (:condi v) condi (if (or (keyword? condi) (map? condi)) [condi] condi) - validate-condition + _validate-condition (massert (or (nil? condi) - (and (nn? condi) (vector? condi))) + (and (some? condi) (vector? condi))) (str "invalid condition definition in simlayer " k ", condition must be a vector or map or keyword")) afterup (:afterup v) key (:key v) - result (:simlayers conf-data) + result (:simlayers @d/conf-data) result (assoc result k {:type "basic" - :parameters {:basic.simultaneous_threshold_milliseconds (:simlayer-threshold conf-data)} + :parameters {:basic.simultaneous_threshold_milliseconds (:simlayer-threshold @d/conf-data)} :to [{:set [(name k) 1]}] :from {:sim [key] :simo {:interrupt true @@ -45,32 +45,32 @@ result (if afterup (assoc-in result [k :from :simo :afterup] (into [] (flatten [(get-in result [k :from :simo :afterup]) afterup]))) result) - result (if (nn? condi) + result (if (some? condi) (if (is-simple-set-variable? condi) (assoc-in result [k :conditions] (parse-conditions [condi])) (assoc-in result [k :conditions] (parse-conditions condi))) result)] - (update-conf-data (assoc conf-data :simlayers result))))) + (d/update-conf-data (assoc @d/conf-data :simlayers result))))) (defn generate-layers [layers] (doseq [[k v] layers] - (let [validate-layer + (let [_validate-layer (massert (and - (nn? v) - (nn? (:key v)) - (k? (:key v))) + (some? v) + (some? (:key v)) + (d/k? (:key v))) (str "invalid layer definition " k)) condi (:condi v) condi (if (or (keyword? condi) (map? condi)) [condi] condi) - validate-condition + _validate-condition (massert (or (nil? condi) - (and (nn? condi) (vector? condi))) + (and (some? condi) (vector? condi))) (str "invalid condition definition in layer " k ", condition must be a vector or map or keyword")) afterup (:afterup v) alone (:alone v) key (:key v) - result (:layers conf-data) + result (:layers @d/conf-data) result (assoc result k {:type "basic" :to [{:set [(name k) 1]}] :alone [{:key key}] @@ -91,17 +91,17 @@ result (assoc-in result [k :from] (froms/parse-from (str "auto insert definition of layer" (name k)) (:from (k result)))) result (dissoc-in result [k :afterup]) result (dissoc-in result [k :alone]) - result (if (nn? condi) + result (if (some? condi) (if (is-simple-set-variable? condi) (assoc-in result [k :conditions] (parse-conditions [condi] nil nil layers)) (assoc-in result [k :conditions] (parse-conditions condi nil nil layers))) result)] - (update-conf-data (assoc conf-data :layers result))))) + (d/update-conf-data (assoc @d/conf-data :layers result))))) (defn parse-simlayers [simlayers] - (if (nn? simlayers) + (if (some? simlayers) (generate-simlayers simlayers))) (defn parse-layers [layers] - (if (nn? layers) + (if (some? layers) (generate-layers layers))) diff --git a/src/karabiner_configurator/misc.clj b/src/karabiner_configurator/misc.clj index 68c7257..a057d5c 100644 --- a/src/karabiner_configurator/misc.clj +++ b/src/karabiner_configurator/misc.clj @@ -1,7 +1,7 @@ (ns karabiner-configurator.misc - (:require [clojure.java.io :as io] - [cheshire.core :as json] + (:require [cheshire.core :as json] [clojure.edn :as edn] + [clojure.java.io :as io] [environ.core :refer [env]])) (defn massert @@ -12,14 +12,12 @@ (assert exp error-str) (try (assert exp error-str) - (catch AssertionError e + (catch AssertionError _ (binding [*out* *err*] (println error-str) (println "Failed!")) (System/exit 1)))))) -(def nn? "not nil" (complement nil?)) - (defn which? "Checks if any of elements is included in coll and says which one was found as first. Coll can be map, list, vector and set" @@ -30,7 +28,7 @@ ncoll))) nil rest))) (defn contains?? [coll rest] - (nn? (which? coll rest))) + (some? (which? coll rest))) (defn load-edn "Load edn from an io/reader source (filename or io/resource)." @@ -66,19 +64,19 @@ (catch RuntimeException e (printf "Error parsing edn file '%s': %s\n" source (.getMessage e))))) -(defmacro when-let* - "Multiple binding version of when-let" - [bindings & body] - (if (seq bindings) - `(when-let [~(first bindings) ~(second bindings)] - (when-let* ~(vec (drop 2 bindings)) ~@body)) - `(do ~@body))) +;; (defmacro when-let* +;; "Multiple binding version of when-let" +;; [bindings & body] +;; (if (seq bindings) +;; `(when-let [~(first bindings) ~(second bindings)] +;; (when-let* ~(vec (drop 2 bindings)) ~@body)) +;; `(do ~@body))) (defn dissoc-in "Dissociates an entry from a nested associative structure returning a new nested structure. keys is a sequence of keys. Any empty maps that result will not be present in the new structure." - [m [k & ks :as keys]] + [m [k & ks]] (if ks (if-let [nextmap (get m k)] (let [newmap (dissoc-in nextmap ks)] @@ -86,4 +84,4 @@ (assoc m k newmap) (dissoc m k))) m) - (dissoc m k))) \ No newline at end of file + (dissoc m k))) diff --git a/src/karabiner_configurator/modifiers.clj b/src/karabiner_configurator/modifiers.clj index ab8542b..d7631e2 100644 --- a/src/karabiner_configurator/modifiers.clj +++ b/src/karabiner_configurator/modifiers.clj @@ -1,6 +1,6 @@ (ns karabiner-configurator.modifiers - (:require [karabiner-configurator.misc :refer :all] - [karabiner-configurator.data :refer :all])) + (:require [karabiner-configurator.data :as d] + [karabiner-configurator.misc :refer [massert]])) ;; this file parses modifier definitions ;; spec https://pqrs.org/osx/karabiner/json.html#from-event-definition-modifiers @@ -12,12 +12,12 @@ (defn parse-modifier-arr-or-keyword [modi modifier-name] (cond (keyword? modi) - (do (massert (modifier-k? modi) (str "invalid modifier " modi " in " modifier-name)) + (do (massert (d/modifier-k? modi) (str "invalid modifier " modi " in " modifier-name)) [(name modi)]) (vector? modi) (mapv (fn [vec] - (massert (modifier-k? vec) (str "invalid modifier " vec " in " modifier-name)) + (massert (d/modifier-k? vec) (str "invalid modifier " vec " in " modifier-name)) (name vec)) modi))) (defn parse-vector-modifiers @@ -25,7 +25,7 @@ {:mandatory (mapv (fn [modifier-key] - (massert (modifier-k? modifier-key) + (massert (d/modifier-k? modifier-key) (str "invliad modifer key: " modifier-key " in " modifier-name)) (name modifier-key)) modifier-info)}) @@ -34,12 +34,12 @@ [modifier-name modifier-info] (let [{:keys [mandatory optional]} modifier-info result {} - result (if (nn? mandatory) + result (if (some? mandatory) (assoc result :mandatory (parse-modifier-arr-or-keyword mandatory modifier-name)) result) - result (if (nn? optional) + result (if (some? optional) (assoc result :optional (parse-modifier-arr-or-keyword optional modifier-name)) result)] @@ -47,7 +47,7 @@ (defn parse-keyword-modifiers [modifier-name modifier-info] - (massert (modifier-k? modifier-info) (str "invalid modifier " modifier-info " in " modifier-name)) + (massert (d/modifier-k? modifier-info) (str "invalid modifier " modifier-info " in " modifier-name)) {:mandatory [(name modifier-info)]}) (defn parse-single-modifier-definition @@ -55,7 +55,7 @@ used both in here and parsing froms, tos as well" [modifier-info & modifier-name] (let [modifier-name (first modifier-name) - mname (if (nn? modifier-name) + mname (if (some? modifier-name) modifier-name :anonymous-modifier)] (cond (vector? modifier-info) @@ -67,7 +67,7 @@ (defn generate [modifiers] - (assoc conf-data :modifiers + (assoc @d/conf-data :modifiers (into {} (for [[modifier-name modifier-info] modifiers] @@ -77,5 +77,5 @@ (defn parse-modifiers "parse modifires to string" [modifiers] - (if (nn? modifiers) - (update-conf-data (generate modifiers)))) + (when (some? modifiers) + (d/update-conf-data (generate modifiers)))) diff --git a/src/karabiner_configurator/profiles.clj b/src/karabiner_configurator/profiles.clj index 78113fe..6b517c3 100644 --- a/src/karabiner_configurator/profiles.clj +++ b/src/karabiner_configurator/profiles.clj @@ -1,7 +1,7 @@ (ns karabiner-configurator.profiles (:require - [karabiner-configurator.misc :refer :all] - [karabiner-configurator.data :refer :all])) + [karabiner-configurator.data :as d] + [karabiner-configurator.misc :refer [massert]])) (defn parse-profiles "Parse profiles and save it in conf data for later use." @@ -9,16 +9,18 @@ (massert (map? profiles) "Invalid profiles. Must be a map") (massert (= (count (filter #(:default (second %)) profiles)) 1) "There should be one and only one default profile") - (let [user-default-profile (update-user-default-profile-name - (first (first (filter #(:default (second %)) profiles))))] + (let [_user-default-profile (d/update-user-default-profile-name + (first (first (filter #(:default (second %)) profiles))))] (doseq [profile profiles - :let [[name {:keys [held sim delay alone default]}] profile]] - (assoc-in-conf-data [:profiles name] {:complex_modifications - {:parameters - {:basic.simultaneous_threshold_milliseconds sim - :basic.to_delayed_action_delay_milliseconds delay - :basic.to_if_alone_timeout_milliseconds alone - :basic.to_if_held_down_threshold_milliseconds held}}})))) + :let [[name {:keys [held sim delay alone]}] profile]] + (d/assoc-in-conf-data + [:profiles name] + {:complex_modifications + {:parameters + {:basic.simultaneous_threshold_milliseconds sim + :basic.to_delayed_action_delay_milliseconds delay + :basic.to_if_alone_timeout_milliseconds alone + :basic.to_if_held_down_threshold_milliseconds held}}})))) (defn parse-rules "Parse generated rules into profiles" [rules] @@ -27,6 +29,6 @@ (for [[profile-name profile-complex-modification] rules] {profile-name (assoc-in (profile-name - (:profiles conf-data)) + (:profiles @d/conf-data)) [:complex_modifications :rules] - profile-complex-modification)}))) \ No newline at end of file + profile-complex-modification)}))) diff --git a/src/karabiner_configurator/rules.clj b/src/karabiner_configurator/rules.clj index 831eaa4..0f645a5 100644 --- a/src/karabiner_configurator/rules.clj +++ b/src/karabiner_configurator/rules.clj @@ -1,12 +1,10 @@ (ns karabiner-configurator.rules (:require [karabiner-configurator.conditions :as conditions] - [karabiner-configurator.keys :as keys] + [karabiner-configurator.data :as d :refer [pkey? k? special-modi-k? conf-data pointing-k? consumer-k? noti? templates? devices? assoc-conf-data update-conf-data profile? raw-rule?]] [karabiner-configurator.froms :as froms] - [karabiner-configurator.tos :as tos] - [karabiner-configurator.conditions :as condis] - [karabiner-configurator.data :refer :all] - [karabiner-configurator.misc :refer :all])) + [karabiner-configurator.misc :refer [massert contains??]] + [karabiner-configurator.tos :as tos])) ;; <from> section ;; :a | normal key or predefined froms @@ -18,27 +16,27 @@ "generate normal from key config" [des from] (let [result nil - validate-from (massert (or (and (vector? from) (>= (count from) 2) (not-any? #(not (or (pkey? %) (k? %))) from)) - (and (keyword? from) (or (k? from) (special-modi-k? from) (contains? (:froms conf-data) from))) - (map? from)) - (str "invalid <from> in main section's " des)) + _validate-from (massert (or (and (vector? from) (>= (count from) 2) (not-any? #(not (or (pkey? %) (k? %))) from)) + (and (keyword? from) (or (k? from) (special-modi-k? from) (contains? (:froms @conf-data) from))) + (map? from)) + (str "invalid <from> in main section's " des)) result (if (vector? from) {:from (froms/parse-from des {:sim from})} result) result (if (and (nil? result) (keyword? from) (or (k? from) (special-modi-k? from))) {:from (froms/parse-from des {:key from})} result) - result (if (and (nil? result) (contains? (:froms conf-data) from)) - {:from (from (:froms conf-data))} + result (if (and (nil? result) (contains? (:froms @conf-data) from)) + {:from (from (:froms @conf-data))} result) result (if (and (map? from) (nil? result)) {:from (froms/parse-from des from)} result)] - (massert (nn? result) (str "something wrong while parsing main rule " des)) + (massert (some? result) (str "something wrong while parsing main rule " des)) result)) (defn parse-simple-set-variable - [des vec & [from-condition?]] + [des vec & [_from-condition?]] (first (tos/parse-to des [{:set vec}]))) (defn rule-parse-keyword [des to] @@ -48,8 +46,8 @@ (first (tos/parse-to des [{:ckey to}])) (or (special-modi-k? to) (k? to)) (first (tos/parse-to des [{:key to}])) - (contains? (:tos conf-data) to) - (to (:tos conf-data)) + (contains? (:tos @conf-data) to) + (to (:tos @conf-data)) :else (massert false (str "code shouldn't be here, something wrong while parsing <to> in main section's " @@ -61,7 +59,7 @@ (first (tos/parse-to des [{:noti {:id id :text text}}])))) (defn to-key-vector - [des to prevresult] + [des to _prevresult] (cond (conditions/is-simple-set-variable? to) [(parse-simple-set-variable des to)] (noti? to) @@ -71,7 +69,7 @@ (flatten (for [v to] ;; this for only return flatten vector (do - (massert (or (contains? (:tos conf-data) v) + (massert (or (contains? (:tos @conf-data) v) (k? v) (noti? v) (special-modi-k? v) @@ -122,19 +120,19 @@ (let [result nil _validate-to (massert (or (and (keyword? to) (or (k? to) (special-modi-k? to) - (contains? (:input-sources conf-data) to) - (contains? (:tos conf-data) to))) + (contains? (:input-sources @conf-data) to) + (contains? (:tos @conf-data) to))) (string? to) (vector? to) (map? to)) (str "invalid <to> in main section's " des)) - result (if (contains? (:input-sources conf-data) to) + result (if (contains? (:input-sources @conf-data) to) (vec (tos/parse-to des [{:input to}])) result) - result (if (and (keyword? to) (not (contains? (:input-sources conf-data) to))) + result (if (and (keyword? to) (not (contains? (:input-sources @conf-data) to))) (rule-parse-keyword des to) result) - result (if (nn? result) + result (if (some? result) (cond (vector? result) result :else @@ -142,7 +140,7 @@ result) to (if (vector? to) (process-to-shell-template-vector to) to) result (cond (and (vector? to) (templates? to)) - ;; (tos/parse-to des [{:shell (apply format (flatten [((first to) (:templates conf-data)) [rest to]]))}]) + ;; (tos/parse-to des [{:shell (apply format (flatten [((first to) (:templates @conf-data)) [rest to]]))}]) (tos/parse-to des [{:shell to}]) (vector? to) (to-key-vector des to result) @@ -155,22 +153,22 @@ (defn merge-multiple-device-conditions [device-vec] - (assoc-conf-data :devices (dissoc (:devices conf-data) :temp-device)) + (assoc-conf-data :devices (dissoc (:devices @conf-data) :temp-device)) (let [devices-list (for [item device-vec :when (and (keyword? item) (devices? item)) - :let [this-device-vec (item (:devices conf-data)) + :let [this-device-vec (item (:devices @conf-data)) temp-device-vec (if (devices? :temp-device) - (vec (concat (:temp-device (:devices conf-data)) this-device-vec)) + (vec (concat (:temp-device (:devices @conf-data)) this-device-vec)) this-device-vec) - update-temp-device-into-conf-data (update-conf-data (assoc-in conf-data [:devices :temp-device] temp-device-vec))]] + _update-temp-device-into-conf-data (update-conf-data (assoc-in @conf-data [:devices :temp-device] temp-device-vec))]] item) use-temp-device? (pos? (count devices-list)) new-conditions (if use-temp-device? (conj (vec (reduce #(remove #{%2} %1) device-vec devices-list)) :temp-device) device-vec)] new-conditions)) -(def profile-layer-condis {}) +(def profile-layer-condis (atom {})) ;; <conditions> ;; :chrome @@ -179,7 +177,7 @@ ;; ["vi-mode" 0] ;; [:vi-mode ["w mode" 1] :!chrome] (defn conditions-key - [des conditions prev-result profiles] + [_des conditions prev-result profiles] (let [conditions (merge-multiple-device-conditions conditions) result-condi (if (conditions/is-simple-set-variable? conditions) @@ -189,9 +187,9 @@ (when (pos? (count layer-condis)) (doseq [profile profiles] (doseq [layer-condi layer-condis] - (when (not (contains?? (profile profile-layer-condis) (keyword (:name layer-condi)))) - (def profile-layer-condis - (assoc profile-layer-condis profile (conj (or (profile profile-layer-condis) []) (keyword (:name layer-condi))))))))) + (when (not (contains?? (profile @profile-layer-condis) (keyword (:name layer-condi)))) + (reset! profile-layer-condis + (assoc @profile-layer-condis profile (conj (or (profile @profile-layer-condis) []) (keyword (:name layer-condi))))))))) result-condi)) ;; <other options> section @@ -240,8 +238,8 @@ (assoc result :conditions (:conditions (conditions-key des (vec (flatten [conditions])) result profiles)))) result) result (assoc result :type "basic") - result (if conditions/used-simlayers-config - (let [insert-simlayer conditions/used-simlayers-config + result (if @conditions/used-simlayers-config + (let [insert-simlayer @conditions/used-simlayers-config insert-simlayer (assoc insert-simlayer :from (froms/parse-from des (:from insert-simlayer))) insert-simlayer (assoc insert-simlayer :to @@ -279,100 +277,98 @@ (with-meta result {:profiles profiles}))] result)) -(def current-in-rules-conditions nil) +(def current-in-rules-conditions (atom nil)) (defn define-current-in-rule-conditions "record current in rule conditions and used in following rules" [condis] (if (nil? condis) - (def current-in-rules-conditions nil) + (reset! current-in-rules-conditions nil) (if (not (vector? condis)) - (def current-in-rules-conditions [condis]) - (def current-in-rules-conditions (pop (vec (reverse condis))))))) + (reset! current-in-rules-conditions [condis]) + (reset! current-in-rules-conditions (pop (vec (reverse condis))))))) (defn add-current-in-rule-conditions "add current in rule conditions into following rules" [rule] (let [[from to conditions other-options] rule ;; check condition format vector-conditions? (vector? conditions) - simple-set-variable? (and vector-conditions? (condis/is-simple-set-variable? conditions)) + simple-set-variable? (and vector-conditions? (conditions/is-simple-set-variable? conditions)) keyword-conditions? (keyword? conditions) ;; add current in rule conditions conditions (cond (or simple-set-variable? keyword-conditions?) - (conj current-in-rules-conditions conditions) + (conj @current-in-rules-conditions conditions) vector-conditions? - (vec (concat current-in-rules-conditions conditions)) + (vec (concat @current-in-rules-conditions conditions)) :else - current-in-rules-conditions)] + @current-in-rules-conditions)] ;; return results - (cond (nn? other-options) [from to conditions other-options] - (nn? conditions) [from to conditions] + (cond (some? other-options) [from to conditions other-options] + (some? conditions) [from to conditions] :else [from to]))) -(def current-in-rules-profiles nil) +(def current-in-rules-profiles (atom nil)) (defn define-current-in-rule-profiles "record current in rule profiles and used in following rules" [profiles] (if (nil? profiles) - (def current-in-rules-profiles nil) + (reset! current-in-rules-profiles nil) (if (not (vector? profiles)) - (def current-in-rules-profiles [profiles]) + (reset! current-in-rules-profiles [profiles]) (let [profiles (pop (vec (reverse profiles))) - assert-profiles (massert (= (count (filter profile? profiles)) (count profiles)) (str "invalid profile in " profiles))] - (def current-in-rules-profiles profiles))))) + _assert-profiles (massert (= (count (filter profile? profiles)) (count profiles)) (str "invalid profile in " profiles))] + (reset! current-in-rules-profiles profiles))))) (defn add-current-in-rule-profiles "add current in rule profiles into following rules" [rule] (let [[from to conditions other-options] rule] - [from to conditions other-options current-in-rules-profiles])) + [from to conditions other-options @current-in-rules-profiles])) -(def all-the-rules - "all rules defined in edn config file, use index of vector as rule id +#_(def all-the-rules + "all rules defined in edn config file, use index of vector as rule id [{:condis [:Emacs :Browsers :q-mode]}]" - []) + []) -(defn store-and-add-id-to-rule - "store rule into vector of maps and add id to rule for later use" - [rule] - (let [[from to condition other-options] rule])) +#_(defn store-and-add-id-to-rule + "store rule into vector of maps and add id to rule for later use" + [rule] + (let [[from to condition other-options] rule])) (def multi-profile-rules "{:profile-1 {:description \"some manipulators\" :manipulators [rule1 rule2]}}" - {}) + (atom {})) (defn add-rule-into-multi-profile-rules "update mtuli-profile-rules depends on rules' profiles" [des parsed-rules] (doseq [parsed-rule parsed-rules] (doseq [profile (-> parsed-rule meta :profiles)] - (if (nil? (profile multi-profile-rules)) - ;; (def multi-profile-rules (assoc multi-profile-rules profile [{:description des :manipulators []}])) - (def multi-profile-rules (assoc multi-profile-rules profile [{:description des :manipulators []}]))) - (let [target-des (vec (keep-indexed #(if (= des (:description %2)) [%1 %2]) (profile multi-profile-rules))) - target-des (filter nn? target-des) - ;; target-des (filter #(= des (:description %)) (profile multi-profile-rules)) + (when (nil? (profile @multi-profile-rules)) + ;; (reset! multi-profile-rules (assoc @multi-profile-rules profile [{:description des :manipulators []}])) + (reset! multi-profile-rules (assoc @multi-profile-rules profile [{:description des :manipulators []}]))) + (let [target-des (vec (keep-indexed #(when (= des (:description %2)) [%1 %2]) (profile @multi-profile-rules))) + target-des (filter some? target-des) + ;; target-des (filter #(= des (:description %)) (profile @multi-profile-rules)) target-des (and (pos? (count target-des)) (first target-des))] (if target-des - ;; TODO: change it to the clojure way (don't use mutable data) - (def multi-profile-rules - (assoc-in multi-profile-rules - [profile (first target-des)] - {:description des - :manipulators (conj - (:manipulators (second target-des)) - parsed-rule)})) - ;; TODO: change it to the clojure way (don't use mutable data) - (def multi-profile-rules - (assoc multi-profile-rules - profile - (conj (profile multi-profile-rules) - {:description des - :manipulators [parsed-rule]})))))))) + (reset! multi-profile-rules + (assoc-in @multi-profile-rules + [profile (first target-des)] + {:description des + :manipulators (conj + (:manipulators (second target-des)) + parsed-rule)})) + (reset! multi-profile-rules + (assoc @multi-profile-rules + profile + (conj (profile @multi-profile-rules) + {:description des + :manipulators [parsed-rule]})))))))) (defn generate-one-rules "generate on rules (one object with des and manipulators in karabiner.json)" [des rules] @@ -391,7 +387,7 @@ ;; TODO: change it to the clojure way (don't use mutable data) (do (define-current-in-rule-conditions rule) nil) (if (and - (nn? current-in-rules-conditions) + (some? @current-in-rules-conditions) (not (profile? rule)) (and (vector? rule) (not (or (= (first rule) :profiles) (= (first rule) :profile))))) @@ -401,36 +397,36 @@ result-rules (vec (for [rule result-rules - :when (nn? rule)] + :when (some? rule)] ;; a rule is a keyword of profile name or a vector [:profile :profile-name] (if (or (and (keyword? rule) (profile? rule)) (and (vector? rule) (or (= (first rule) :profiles) (= (first rule) :profile)))) (do (define-current-in-rule-profiles rule) nil) - (if (nn? current-in-rules-profiles) + (if (some? @current-in-rules-profiles) (add-current-in-rule-profiles rule) rule)))) _cleanup-cirp (define-current-in-rule-profiles nil)] ;; parse rule (for [rule result-rules - :when (nn? rule)] + :when (some? rule)] (let [[from to condition other-options profiles] rule - profiles (if (nn? profiles) profiles [user-default-profile-name]) + profiles (if (some? profiles) profiles [@d/user-default-profile-name]) ;; a rule must have a from event defination and to event defination ;; from event defination is defined in <from> section ;; to event defination can be defined in <to> section or <other-options> section (as :alone :delayed :afterup) _validate-rule (massert - (and (nn? from) + (and (some? from) (or - (nn? (:type from)) - (nn? other-options) - (nn? to))) + (some? (:type from)) + (some? other-options) + (some? to))) (str "invalid rule: " des ", <from> or <to>/<other-options> is nil" from "\n" to "\n" other-options))] (cond - (nn? (:type from)) (parse-raw-rule from profiles) + (some? (:type from)) (parse-raw-rule from profiles) (and (nil? other-options) (nil? condition)) (parse-rule des from to nil nil profiles) - (and (nil? other-options) (nn? condition)) (parse-rule des from to condition nil profiles) - (nn? other-options) (parse-rule des from to condition other-options profiles))))))))) + (and (nil? other-options) (some? condition)) (parse-rule des from to condition nil profiles) + (some? other-options) (parse-rule des from to condition other-options profiles))))))))) (defn generate "parse mains and generate all rules for converting to json" @@ -438,34 +434,34 @@ (let [;; user-result (do ;; (doseq [{:keys [des rules]} mains] ;; (generate-one-rules des rules)) - ;; multi-profile-rules) + ;; @multi-profile-rules) _update-multi-profile-rules (doseq [{:keys [des rules]} mains] - (massert (nn? des) "missing description key :des in one rule, please check your config file") + (massert (some? des) "missing description key :des in one rule, please check your config file") (generate-one-rules des rules)) _update-profile-layer-condis - (doseq [[profile condis] profile-layer-condis] + (doseq [[profile condis] @profile-layer-condis] ;; TODO: change it to the clojure way (don't use mutable data) - (def profile-layer-condis (assoc profile-layer-condis profile (vec (for [condi condis] (condi (:layers conf-data))))))) + (reset! profile-layer-condis (assoc @profile-layer-condis profile (vec (for [condi condis] (condi (:layers @conf-data))))))) - _add-layer-result (doseq [[profile condis] profile-layer-condis] - (when (profile multi-profile-rules) + _add-layer-result (doseq [[profile condis] @profile-layer-condis] + (when (profile @multi-profile-rules) ;; TODO: change it to the clojure way (don't use mutable data) - (def multi-profile-rules - (assoc multi-profile-rules - profile - (vec (cons - {:description "Auto generated layer conditions" - :manipulators (into - condis - (:manipulators (profile multi-profile-rules)))} - (profile multi-profile-rules)))))))] - multi-profile-rules)) + (reset! multi-profile-rules + (assoc @multi-profile-rules + profile + (vec (cons + {:description "Auto generated layer conditions" + :manipulators (into + condis + (:manipulators (profile @multi-profile-rules)))} + (profile @multi-profile-rules)))))))] + @multi-profile-rules)) (defn parse-mains "parse main section to final edn format, ready to convert to json" [mains] ;; TODO: change it to the clojure way (don't use mutable data) - (def multi-profile-rules {}) - (def profile-layer-condis {}) + (reset! multi-profile-rules {}) + (reset! profile-layer-condis {}) (generate mains)) diff --git a/src/karabiner_configurator/tos.clj b/src/karabiner_configurator/tos.clj index 32b9455..d5162de 100644 --- a/src/karabiner_configurator/tos.clj +++ b/src/karabiner_configurator/tos.clj @@ -1,8 +1,7 @@ (ns karabiner-configurator.tos - (:require [karabiner-configurator.misc :refer :all] - [karabiner-configurator.data :refer :all] - [karabiner-configurator.keys :refer :all] - [karabiner-configurator.modifiers :as kmodifier])) + (:require [karabiner-configurator.data :refer [conf-data update-conf-data]] + [karabiner-configurator.keys :refer [parse-key]] + [karabiner-configurator.misc :refer [massert]])) ;; parse tos definition ;; spec https://karabiner-elements.pqrs.org/docs/json/complex-modifications-manipulator-definition/to/ @@ -66,21 +65,21 @@ (mapv (fn [{:keys [set input shell lazy repeat halt hold_down_ms select_input_source noti] :as tinfo}] (let [result (parse-key tname tinfo true true) - validate-shell (massert (or (and (vector? shell) (contains? (:templates conf-data) (first shell))) (string? shell) (nil? shell)) - (str "invalid `shell` in to definition " tname " " shell ", should be string or keyword")) - validate-input (massert (or (nil? input) (and (keyword? input) (contains? (:input-sources conf-data) input))) - (str "invalid `input` in to definition " tname " " input ", should be a keyword")) - validate-set (massert (or (vector? set) (nil? set)) - (str "invalid `set` in to definition " tname " " set ", should be a vector")) - validate-noti (massert (or (nil? noti) (and (map? noti) - (or (keyword? (get noti :id)) - (string? (get noti :id))) - (or (nil? (get noti :text)) - (keyword? (get noti :text)) - (string? (get noti :text))))) - (str "invalid `noti`, must be a map with at least :id, :id must be string or keyword")) + _validate-shell (massert (or (and (vector? shell) (contains? (:templates @conf-data) (first shell))) (string? shell) (nil? shell)) + (str "invalid `shell` in to definition " tname " " shell ", should be string or keyword")) + _validate-input (massert (or (nil? input) (and (keyword? input) (contains? (:input-sources @conf-data) input))) + (str "invalid `input` in to definition " tname " " input ", should be a keyword")) + _validate-set (massert (or (vector? set) (nil? set)) + (str "invalid `set` in to definition " tname " " set ", should be a vector")) + _validate-noti (massert (or (nil? noti) (and (map? noti) + (or (keyword? (get noti :id)) + (string? (get noti :id))) + (or (nil? (get noti :text)) + (keyword? (get noti :text)) + (string? (get noti :text))))) + (str "invalid `noti`, must be a map with at least :id, :id must be string or keyword")) result (if (keyword? input) - (assoc result :select_input_source (input (:input-sources conf-data))) + (assoc result :select_input_source (input (:input-sources @conf-data))) result) result (if (string? shell) (assoc result :shell_command shell) @@ -91,7 +90,7 @@ format (flatten [((first shell) - (:templates conf-data)) + (:templates @conf-data)) (rest shell) ;; optional arguments "" "" "" "" "" ""]))) @@ -120,7 +119,7 @@ tinfos)) (defn generate [tos] - (assoc conf-data :tos + (assoc @conf-data :tos (into {} (for [[tname tinfo] tos] @@ -133,5 +132,5 @@ (parse-to tname tinfo)))})))) (defn parse-tos [tos] - (if (nn? tos) + (when (some? tos) (update-conf-data (generate tos)))) diff --git a/test/karabiner_configurator/core_test.clj b/test/karabiner_configurator/core_test.clj index 3692c74..8358971 100644 --- a/test/karabiner_configurator/core_test.clj +++ b/test/karabiner_configurator/core_test.clj @@ -1,8 +1,8 @@ (ns karabiner-configurator.core-test (:require [clojure.test :as t] [karabiner-configurator.core :as sut] - [karabiner-configurator.data :refer :all] - [karabiner-configurator.misc :refer :all])) + [karabiner-configurator.data :refer [init-conf-data]] + [karabiner-configurator.misc :refer [load-edn load-result-edn]])) (def vi-mode-example (load-edn "resources/configurations/edn/vi_mode.edn")) (def launch-mode-example (load-edn "resources/configurations/edn/launch_mode.edn")) @@ -16,4 +16,4 @@ (t/is (= (sut/parse-edn vi-mode-example) vi-mode-result))) (init-conf-data) (t/testing "generate launch-mode config" - (t/is (= (sut/parse-edn launch-mode-example) launch-mode-result)))) \ No newline at end of file + (t/is (= (sut/parse-edn launch-mode-example) launch-mode-result)))) diff --git a/test/karabiner_configurator/froms_test.clj b/test/karabiner_configurator/froms_test.clj index e135c1f..f79254e 100644 --- a/test/karabiner_configurator/froms_test.clj +++ b/test/karabiner_configurator/froms_test.clj @@ -1,7 +1,7 @@ (ns karabiner-configurator.froms-test (:require [clojure.test :as t] - [karabiner-configurator.data :refer :all] + [karabiner-configurator.data :refer [conf-data init-conf-data update-conf-data]] [karabiner-configurator.froms :as sut])) (def example-froms @@ -78,7 +78,7 @@ (t/deftest convert-froms (init-conf-data) - (update-conf-data (assoc conf-data :modifiers {:1 {:mandatory ["left_command", "right_shift"] - :optional ["any"]}})) + (update-conf-data (assoc @conf-data :modifiers {:1 {:mandatory ["left_command", "right_shift"] + :optional ["any"]}})) (t/testing - (t/is (= (:froms (sut/generate example-froms)) (:froms result))))) + (t/is (= (:froms (sut/generate example-froms)) (:froms result))))) diff --git a/test/karabiner_configurator/layers_test.clj b/test/karabiner_configurator/layers_test.clj index d4e109f..418e75d 100644 --- a/test/karabiner_configurator/layers_test.clj +++ b/test/karabiner_configurator/layers_test.clj @@ -1,7 +1,7 @@ (ns karabiner-configurator.layers-test - (:require [karabiner-configurator.layers :as sut] - [karabiner-configurator.data :refer :all] - [clojure.test :as t])) + (:require [clojure.test :as t] + [karabiner-configurator.data :refer [conf-data init-conf-data update-conf-data]] + [karabiner-configurator.layers :as sut])) (def layers-example {:tab-mode {:key :tab :afterup [{:set ["chunkwm-move-mode" 0]} {:set ["chunkwm-scale-mode" 0]}]} @@ -144,25 +144,25 @@ (t/deftest convert-simlayers (init-conf-data) - (update-conf-data (assoc conf-data :devices {:hhkb-bt [{:vendor_id 1278 :product_id 51966}] - :hhkb [{:vendor_id 2131 :product_id 256}]})) - (update-conf-data (assoc conf-data :applications {:chrome ["^com\\.google\\.Chrome$"] - :chrom-canary ["^com\\.google\\.Chrome\\.canary$"] - :chromes ["^com\\.google\\.Chrome$" "^com\\.google\\.Chrome\\.canary$"]})) + (update-conf-data (assoc @conf-data :devices {:hhkb-bt [{:vendor_id 1278 :product_id 51966}] + :hhkb [{:vendor_id 2131 :product_id 256}]})) + (update-conf-data (assoc @conf-data :applications {:chrome ["^com\\.google\\.Chrome$"] + :chrom-canary ["^com\\.google\\.Chrome\\.canary$"] + :chromes ["^com\\.google\\.Chrome$" "^com\\.google\\.Chrome\\.canary$"]})) ;; (t/testing ;; (t/is (= (sut/generate-layers layers-example) layer-result)) ;; (t/is (= (sut/generate-simlayers simlayers-example) simlayer-result))) (t/testing "testing simlayers" (sut/generate-simlayers simlayers-example) - (t/is (= conf-data simlayer-result)))) + (t/is (= @conf-data simlayer-result)))) (t/deftest convert-layers (init-conf-data) - (update-conf-data (assoc conf-data :devices {:hhkb-bt [{:vendor_id 1278 :product_id 51966}] - :hhkb [{:vendor_id 2131 :product_id 256}]})) - (update-conf-data (assoc conf-data :applications {:chrome ["^com\\.google\\.Chrome$"] - :chrom-canary ["^com\\.google\\.Chrome\\.canary$"] - :chromes ["^com\\.google\\.Chrome$" "^com\\.google\\.Chrome\\.canary$"]})) + (update-conf-data (assoc @conf-data :devices {:hhkb-bt [{:vendor_id 1278 :product_id 51966}] + :hhkb [{:vendor_id 2131 :product_id 256}]})) + (update-conf-data (assoc @conf-data :applications {:chrome ["^com\\.google\\.Chrome$"] + :chrom-canary ["^com\\.google\\.Chrome\\.canary$"] + :chromes ["^com\\.google\\.Chrome$" "^com\\.google\\.Chrome\\.canary$"]})) (t/testing "testing layers" (sut/generate-layers layers-example) - (t/is (= conf-data layer-result)))) \ No newline at end of file + (t/is (= @conf-data layer-result)))) diff --git a/test/karabiner_configurator/modifiers_test.clj b/test/karabiner_configurator/modifiers_test.clj index 9438968..1b6f652 100644 --- a/test/karabiner_configurator/modifiers_test.clj +++ b/test/karabiner_configurator/modifiers_test.clj @@ -1,7 +1,7 @@ (ns karabiner-configurator.modifiers-test - (:require [karabiner-configurator.modifiers :as sut] - [karabiner-configurator.data :refer :all] - [clojure.test :refer :all])) + (:require [clojure.test :refer [deftest is testing]] + [karabiner-configurator.data :refer [init-conf-data]] + [karabiner-configurator.modifiers :as sut])) (def example-modifers {:modifiers {:111 [:left_command :left_control] :222 {:mandatory [:left_command :left_shift]} @@ -26,4 +26,4 @@ (deftest convert-modifiers (init-conf-data) (testing "FIXME, convert-modifiers fail." - (is (= (sut/generate (:modifiers example-modifers)) result)))) \ No newline at end of file + (is (= (sut/generate (:modifiers example-modifers)) result)))) diff --git a/test/karabiner_configurator/rules_test.clj b/test/karabiner_configurator/rules_test.clj index 68a69ec..1a7bb7c 100644 --- a/test/karabiner_configurator/rules_test.clj +++ b/test/karabiner_configurator/rules_test.clj @@ -1,7 +1,7 @@ (ns karabiner-configurator.rules-test - (:require [karabiner-configurator.rules :as sut] - [karabiner-configurator.data :refer :all] - [clojure.test :as t])) + (:require [clojure.test :as t] + [karabiner-configurator.data :refer [init-conf-data update-conf-data]] + [karabiner-configurator.rules :as sut])) (def example-mains [{:des "a to 1" :rules [[:condi :chunkwm-move-mode] [:profiles :Default :test-profile-2] diff --git a/test/karabiner_configurator/tos_test.clj b/test/karabiner_configurator/tos_test.clj index 0fdd734..18a2e90 100644 --- a/test/karabiner_configurator/tos_test.clj +++ b/test/karabiner_configurator/tos_test.clj @@ -1,11 +1,10 @@ (ns karabiner-configurator.tos-test - (:require [karabiner-configurator.tos :as sut] - [karabiner-configurator.data :refer :all] - [clojure.test :as t])) + (:require [clojure.test :as t] + [karabiner-configurator.data :refer [init-conf-data assoc-conf-data]] + [karabiner-configurator.tos :as sut])) (def tos-example - { - :1 {:key :d} + {:1 {:key :d} :2 {:key :d :modi :1} :3 {:key :d :modi :left_command} :4 {:key :d :modi [:left_command :right_shift]} @@ -81,7 +80,7 @@ :key_code "d"}] :6 [{:modifiers ["left_command" "right_shift"] :key_code "d"}] - :19 [{ :select_input_source { :input_source_id "^com\\.apple\\.keylayout\\.ABC$" } }]} + :19 [{:select_input_source {:input_source_id "^com\\.apple\\.keylayout\\.ABC$"}}]} :input-sources {:squirrel {:input_mode_id "com.googlecode.rimeime.inputmethod.Squirrel" :input_source_id "com.googlecode.rimeime.inputmethod.Squirrel.Rime" :language "zh-Hans"} @@ -99,15 +98,15 @@ (t/deftest convert-tos (init-conf-data) - (update-conf-data (assoc conf-data :templates {:launch "osascript -e 'tell application \"Alfred 3\" to run trigger \"launch%s\" in workflow \"yqrashawn.workflow.launcher\" with argument \"\"'"})) - (update-conf-data (assoc conf-data :modifiers {:1 {:mandatory ["left_command", "right_shift"]}})) - (update-conf-data (assoc conf-data :input-sources {:squirrel {:input_mode_id "com.googlecode.rimeime.inputmethod.Squirrel" - :input_source_id "com.googlecode.rimeime.inputmethod.Squirrel.Rime" - :language "zh-Hans"} - :us {:input_mode_id "" - :input_source_id "com.apple.keylayout.US" - :language "en"}})) + (assoc-conf-data :templates {:launch "osascript -e 'tell application \"Alfred 3\" to run trigger \"launch%s\" in workflow \"yqrashawn.workflow.launcher\" with argument \"\"'"}) + (assoc-conf-data :modifiers {:1 {:mandatory ["left_command", "right_shift"]}}) + (assoc-conf-data :input-sources {:squirrel {:input_mode_id "com.googlecode.rimeime.inputmethod.Squirrel" + :input_source_id "com.googlecode.rimeime.inputmethod.Squirrel.Rime" + :language "zh-Hans"} + :us {:input_mode_id "" + :input_source_id "com.apple.keylayout.US" + :language "en"}}) (t/testing - (t/is (= (:tos (sut/generate tos-example)) (:tos result))))) + (t/is (= (:tos (sut/generate tos-example)) (:tos result))))) ;; (sut/generate tos-example)