this repo has no description
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})