summaryrefslogtreecommitdiff
path: root/fnl/macros.fnlm
blob: edfca30e22074bfe6d0cf5fda3a8634dd7335d8b (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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
;; Fennel macros for compile-time expansion.

(fn autocmd [event opts]
  `(vim.api.nvim_create_autocmd ,event ,opts))

(fn autocmds [...]
  (let [out `(do)]
    (each [_ cmd (ipairs [...])]
      (table.insert out (autocmd (. cmd 1) (. cmd 2))))
    out))

(fn user-cmd [name cmd opts]
  `(vim.api.nvim_create_user_command ,name ,cmd ,opts))

(fn user-cmds [...]
  (let [out `(do)]
    (each [_ cmd (ipairs [...])]
      (table.insert out (user-cmd (. cmd 1) (. cmd 2) (. cmd 3))))
    out))

(fn keymap [mode lhs rhs opts]
  `(vim.keymap.set ,mode ,lhs ,rhs ,opts))

(fn keymaps [...]
  (let [out `(do)]
    (each [_ mapping (ipairs [...])]
      (table.insert out (keymap (. mapping 1) (. mapping 2) (. mapping 3) (. mapping 4))))
    out))

(fn set-opts [opts]
  (let [out `(do)]
    (each [k v (pairs opts)]
      (table.insert out `(tset vim.opt ,k ,v)))
    out))

(fn ts-selects [...]
  "Generate treesitter select keymaps. Each entry: [key query ?group].
   Modes are always [:x :o]. Assumes `select` is in scope."
  (let [out `(do)]
    (each [_ entry (ipairs [...])]
      (let [key (. entry 1)
            query (. entry 2)
            group (or (. entry 3) :textobjects)]
        (table.insert out
          `(vim.keymap.set [:x :o] ,key
             (λ [] (select.select_textobject ,query ,group)) {}))))
    out))

(fn ts-swaps [...]
  "Generate treesitter swap keymaps. Each entry: [key method query].
   Mode is always :n. method is a symbol like swap.swap_next."
  (let [out `(do)]
    (each [_ entry (ipairs [...])]
      (let [key (. entry 1)
            method (. entry 2)
            query (. entry 3)]
        (table.insert out
          `(vim.keymap.set :n ,key (λ [] (,method ,query)) {}))))
    out))

(fn ts-moves [...]
  "Generate treesitter move keymaps. Each entry: [key method query ?group].
   Modes are always [:n :x :o]. method is a symbol like move.goto_next_start."
  (let [out `(do)]
    (each [_ entry (ipairs [...])]
      (let [key (. entry 1)
            method (. entry 2)
            query (. entry 3)
            group (or (. entry 4) :textobjects)]
        (table.insert out
          `(vim.keymap.set [:n :x :o] ,key (λ [] (,method ,query ,group)) {}))))
    out))

{: autocmd : autocmds : user-cmd : user-cmds : keymap : keymaps : set-opts
 : ts-selects : ts-swaps : ts-moves}