summaryrefslogtreecommitdiff
path: root/fnl/conf/macros.fnl
blob: 9ce8b26478e5db74b8ae9478bdd9f11c8146f167 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
(fn by-two [l]
  (fn iter [t i]
    (let [k (. l (- i 1))
          v (. l i)]
      (when (and (not= k nil) (not= v nil))
        (values (+ i 2) [k v]))))

  (values iter l 2))

(fn decode-opt-value [v]
  (fn symbol-luatype [s]
    (let [t (tostring s)]
      (match t
        :on true
        :off false
        _ t)))

  (if (sym? v) (symbol-luatype v) v))

(fn opt-template [o]
  (fn remove/append [target value mode]
    `(let [target# (. vim :opt ,target)
           value# ,value]
       ,(match mode
          :append `(target#:append value#)
          :remove `(target#:remove value#))))

  (fn [v]
    (match (string.sub o 1 1)
      "-" (remove/append (string.sub o 2) v :remove)
      "+" (remove/append (string.sub o 2) v :append)
      _ `(tset (. vim :opt) ,o ,v))))

(fn settings [...]
  `,(icollect [_ [o v] (by-two [...])]
      ((opt-template (tostring o)) (decode-opt-value v))))

(fn globals [...]
  (local globa (icollect [_ [k v] (by-two [...])]
                 [(tostring k) v]))
  `(let [l# ,globa]
     (each [a# b# (ipairs l#)]
       (tset (. vim :g) (. b# 1) (. b# 2)))))

{: settings : globals}