;; 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}