this repo has no description
at master 2.9 kB view raw
1; (import-macros logger :nvim.logger) 2 3(fn maybe-join [value] 4 (if (= (type value) :table) 5 (table.concat value ",") 6 value)) 7 8(fn filter [t cb] 9 (collect [k v (pairs t)] 10 (when (cb k v) 11 (values k v)))) 12 13(fn try [value test cb] 14 (if (test value) (cb value) value)) 15 16(fn normalise-map [rhs opts] 17 (if (= (type rhs) :string) 18 (if (and (vim.startswith rhs ":") (not= rhs ":")) 19 (-> rhs 20 (try #(not (. opts :selection)) #(.. :<cmd> (: $1 :sub 2))) 21 (try #(and (not (vim.endswith (: $1 :lower) :<cr>)) (. opts :cr)) 22 #(.. $1 :<cr>))) 23 rhs) 24 rhs)) 25 26(fn plug-map? [rhs] 27 (and (= (type rhs) :string) (vim.startswith (rhs:lower) :<plug>))) 28 29(fn make-map [buffer] 30 (lambda [modes lhs rhs ?opts] 31 (when (= modes "") 32 (error "At least one mode must be specified")) 33 (let [options (vim.tbl_extend :force 34 {:noremap (not (plug-map? rhs)) 35 :selection false 36 :cr true 37 :buffer buffer} 38 (or ?opts {})) 39 map-opts (filter options #(not (or (= $1 :selection) (= $1 :cr)))) 40 normalised-rhs (normalise-map rhs options) 41 modes (icollect [m (modes:gmatch ".")] m)] 42 (vim.keymap.set modes lhs normalised-rhs map-opts)))) 43 44(local api (setmetatable {} 45 {:__index (fn [_ key] 46 (let [func (.. :nvim_ (key:gsub "-" "_"))] 47 (. vim.api func)))})) 48 49(fn ?> [f ...] 50 (let [(ok? val) (f)] 51 (if (and ok? (not= val "")) val (?> ...)))) 52 53(fn set-opt [scope key value] 54 (let [len (length key) 55 opt (if (key:match "[-+^!]$") (key:sub 1 (- len 1)) key) 56 l (lambda [] 57 (vim.split (. scope opt) ",")) 58 val (match (key:sub len) 59 "-" (assert false :not-implemented) 60 "^" (vim.list_extend value (l)) 61 "+" (vim.list_extend (l) value) 62 _ value)] 63 (tset scope opt (maybe-join val)))) 64 65(fn build-opts [table scope] 66 (setmetatable table 67 {:__index scope 68 :__newindex (fn [_ key val] 69 (set-opt scope key val)) 70 :__call (fn [table opts] 71 (each [key value (pairs opts)] 72 (set-opt scope key value)))})) 73 74(local opt (build-opts {:global (build-opts {} vim.go) 75 :window (build-opts {} vim.wo) 76 :buffer (build-opts {} vim.bo)} 77 vim.o)) 78 79;; Exports 80(setmetatable {:map (make-map false) 81 :buf-map (make-map true) 82 : api 83 :fun vim.fn 84 : opt} {:__index vim})