summaryrefslogtreecommitdiff
path: root/fnl/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'fnl/plugins')
-rw-r--r--fnl/plugins/alpha.fnl47
-rw-r--r--fnl/plugins/autopairs.fnl20
-rw-r--r--fnl/plugins/better-escape.fnl8
-rw-r--r--fnl/plugins/bqf.fnl3
-rw-r--r--fnl/plugins/bufdel.fnl3
-rw-r--r--fnl/plugins/cmp.fnl65
-rw-r--r--fnl/plugins/colorizer.fnl3
-rw-r--r--fnl/plugins/colorscheme.fnl11
-rw-r--r--fnl/plugins/comment.fnl20
-rw-r--r--fnl/plugins/diffview.fnl5
-rw-r--r--fnl/plugins/gitsigns.fnl48
-rw-r--r--fnl/plugins/harpoon.fnl25
-rw-r--r--fnl/plugins/hotpot.fnl2
-rw-r--r--fnl/plugins/init.fnl10
-rw-r--r--fnl/plugins/lazy.fnl27
-rw-r--r--fnl/plugins/leap.fnl17
-rw-r--r--fnl/plugins/lir.fnl52
-rw-r--r--fnl/plugins/lsp/diagnostics.fnl33
-rw-r--r--fnl/plugins/lsp/init.fnl5
-rw-r--r--fnl/plugins/lsp/keymaps.fnl23
-rw-r--r--fnl/plugins/lsp/lspconfig.fnl42
-rw-r--r--fnl/plugins/lsp/mason.fnl11
-rw-r--r--fnl/plugins/lsp/null-ls.fnl43
-rw-r--r--fnl/plugins/lsp/servers.fnl29
-rw-r--r--fnl/plugins/lualine.fnl87
-rw-r--r--fnl/plugins/minibar.fnl30
-rw-r--r--fnl/plugins/neogit.fnl6
-rw-r--r--fnl/plugins/orgmode.fnl24
-rw-r--r--fnl/plugins/persistence.fnl5
-rw-r--r--fnl/plugins/project.fnl16
-rw-r--r--fnl/plugins/spectre.fnl54
-rw-r--r--fnl/plugins/stay-in-place.fnl3
-rw-r--r--fnl/plugins/surround.fnl3
-rw-r--r--fnl/plugins/symbols-outline.fnl3
-rw-r--r--fnl/plugins/telescope.fnl94
-rw-r--r--fnl/plugins/toggleterm.fnl5
-rw-r--r--fnl/plugins/treesitter.fnl39
-rw-r--r--fnl/plugins/trim.fnl3
-rw-r--r--fnl/plugins/trouble.fnl81
-rw-r--r--fnl/plugins/undotree.fnl3
-rw-r--r--fnl/plugins/vim-slash.fnl6
-rw-r--r--fnl/plugins/which-key.fnl173
-rw-r--r--fnl/plugins/window-picker.fnl19
-rw-r--r--fnl/plugins/zen.fnl11
44 files changed, 1217 insertions, 0 deletions
diff --git a/fnl/plugins/alpha.fnl b/fnl/plugins/alpha.fnl
new file mode 100644
index 0000000..87c45e0
--- /dev/null
+++ b/fnl/plugins/alpha.fnl
@@ -0,0 +1,47 @@
+;; A customizable greeter.
+
+(local ascii-art [" ##############..... ############## "
+ " ##############......############## "
+ " ##########..........########## "
+ " ##########........########## "
+ " ##########.......########## "
+ " ##########.....##########.. "
+ " ##########....##########..... "
+ " ..##########..##########......... "
+ " ....##########.#########............. "
+ " ..################JJJ............ "
+ " ################............. "
+ " ##############.JJJ.JJJJJJJJJJ "
+ " ############...JJ...JJ..JJ JJ "
+ " ##########....JJ...JJ..JJ JJ "
+ " ########......JJJ..JJJ JJJ JJJ "
+ " ###### ......... "
+ " ..... "
+ " . "])
+
+(fn setup []
+ (let [alpha (require :alpha)]
+ (let [dashboard (require :alpha.themes.dashboard)]
+ (set dashboard.section.header.val ascii-art)
+ (set dashboard.section.buttons.val
+ [(dashboard.button :e " New file" ":ene <BAR> startinsert <CR>")
+ (dashboard.button :f " Find file"
+ ":Telescope find_files theme=dropdown<CR>")
+ (dashboard.button :t " Find text"
+ ":Telescope live_grep theme=dropdown<CR>")
+ (dashboard.button :p " Find project"
+ ":Telescope projects theme=dropdown<CR>")
+ (dashboard.button :r " Recently used files"
+ ":Telescope oldfiles theme=dropdown<CR>")
+ (dashboard.button :c " Configuration"
+ ":e ~/.config/nvim/init.lua <CR>")
+ (dashboard.button :q " Quit Neovim" ":qa<CR>")])
+ (set dashboard.section.header.opts.hl :AlphaHeader)
+ (set dashboard.section.buttons.opts.hl :AlphaButtons)
+ (set dashboard.opts.opts.noautocmd true)
+ (alpha.setup dashboard.opts))))
+
+{1 :goolord/alpha-nvim
+ :event :VimEnter
+ :config (fn []
+ (setup))}
diff --git a/fnl/plugins/autopairs.fnl b/fnl/plugins/autopairs.fnl
new file mode 100644
index 0000000..d1aabf6
--- /dev/null
+++ b/fnl/plugins/autopairs.fnl
@@ -0,0 +1,20 @@
+;; Autopairs for brackets and quote symbols.
+
+{1 :windwp/nvim-autopairs
+ :event :InsertEnter
+ :opts {:check_ts true
+ :ts_config {:lua [:string :source]
+ :javascript [:string :template_string]
+ :java false}
+ :disable_filetype [:TelescopePrompt :spectre_panel]
+ :fast_warp {:map :<M-e>
+ :chars ["{" "[" "(" "\"" "'"]
+ :pattern (string.gsub "[%'%\"%)%>%]%)%}%,]" "%s+" "")
+ :check_comma true
+ :highlight :PmenuSel
+ :highlight_grey :LineNr
+ :offset 0
+ :end_key "$"
+ :keys :qwertyuiopzxcvbnmasdfghjkl
+ :highlight :PmenuSel
+ :highlight_grey :LineNr}}}
diff --git a/fnl/plugins/better-escape.fnl b/fnl/plugins/better-escape.fnl
new file mode 100644
index 0000000..cde61bc
--- /dev/null
+++ b/fnl/plugins/better-escape.fnl
@@ -0,0 +1,8 @@
+;; Better escape without nasty delay.
+
+{1 :max397574/better-escape.nvim
+ :event :BufReadPost
+ :opts {:mapping [:kk :jj]
+ :timeout vim.o.timeoutlen
+ :clear_empty_lines false
+ :keys :<Esc>}}
diff --git a/fnl/plugins/bqf.fnl b/fnl/plugins/bqf.fnl
new file mode 100644
index 0000000..e2b0791
--- /dev/null
+++ b/fnl/plugins/bqf.fnl
@@ -0,0 +1,3 @@
+;; Make Neovim's quickfix window better.
+
+{1 :kevinhwang91/nvim-bqf :event :BufReadPost :config true}
diff --git a/fnl/plugins/bufdel.fnl b/fnl/plugins/bufdel.fnl
new file mode 100644
index 0000000..4719a53
--- /dev/null
+++ b/fnl/plugins/bufdel.fnl
@@ -0,0 +1,3 @@
+;; Delete buffers.
+
+{1 :ojroques/nvim-bufdel :cmd :BufDel}
diff --git a/fnl/plugins/cmp.fnl b/fnl/plugins/cmp.fnl
new file mode 100644
index 0000000..a062d92
--- /dev/null
+++ b/fnl/plugins/cmp.fnl
@@ -0,0 +1,65 @@
+;; Configuration for completion plugin.
+
+(fn setup []
+ (let [cmp (require :cmp)
+ lspkind (require :lspkind)
+ luasnip (require :luasnip)
+ luasnip-vscode (require :luasnip.loaders.from_vscode)]
+ (luasnip-vscode.lazy_load)
+ (lspkind.init)
+ (cmp.setup {:snippet {:expand (fn [args]
+ (luasnip.lsp_expand args.body))}
+ :completion {:completopt "menu,menuone,noinsert"}
+ :mapping (cmp.mapping.preset.insert {:<C-k> (cmp.mapping.select_prev_item)
+ :<C-j> (cmp.mapping.select_next_item)
+ :<C-b> (cmp.mapping (cmp.mapping.scroll_docs -1)
+ [:i
+ :c])
+ :<C-f> (cmp.mapping (cmp.mapping.scroll_docs 1)
+ [:i
+ :c])
+ :<C-space> (cmp.mapping (cmp.mapping.complete)
+ [:i
+ :c])
+ :<C-e> (cmp.mapping {:i (cmp.mapping.abort)
+ :c (cmp.mapping.close)})
+ :<CR> (cmp.mapping.confirm {:select true})
+ :<CR> (cmp.mapping.confirm {:select true})})
+ :sources [{:name :nvim_lsp}
+ {:name :nvim_lua}
+ {:name :luasnip}
+ {:name :spell}
+ {:name :orgmode}
+ {:name :buffer :keyword_length 4}
+ {:name :path :keyword_length 6}]
+ :formatting {:format (lspkind.cmp_format {:with_text true
+ :menu {:buffer ""
+ :nvim_lsp ""
+ :nvim_lua ""
+ :path ""
+ :luasnip ""}})}
+ :window {:documentation {:border ["╭"
+ "─"
+ "╮"
+ "│"
+ "╯"
+ "─"
+ "╰"
+ "│"]}}
+ :confirm_opts {:behavior cmp.ConfirmBehavior.Replace
+ :select false}
+ :experimental {:ghost_text false :native_menu false}})))
+
+{1 :hrsh7th/nvim-cmp
+ :dependencies [:hrsh7th/cmp-buffer
+ :onsails/lspkind-nvim
+ :hrsh7th/cmp-nvim-lsp
+ :hrsh7th/cmp-cmdline
+ :L3MON4D3/LuaSnip
+ :rafamadriz/friendly-snippets
+ :hrsh7th/cmp-path
+ :saadparwaiz1/cmp_luasnip
+ :f3fora/cmp-spell]
+ :event :InsertEnter
+ :config (fn []
+ (setup))}
diff --git a/fnl/plugins/colorizer.fnl b/fnl/plugins/colorizer.fnl
new file mode 100644
index 0000000..553024b
--- /dev/null
+++ b/fnl/plugins/colorizer.fnl
@@ -0,0 +1,3 @@
+;; Display colors of hex numbers.
+
+{1 :norcalli/nvim-colorizer.lua :cmd :ColorizerToggle :config true}
diff --git a/fnl/plugins/colorscheme.fnl b/fnl/plugins/colorscheme.fnl
new file mode 100644
index 0000000..bc708ab
--- /dev/null
+++ b/fnl/plugins/colorscheme.fnl
@@ -0,0 +1,11 @@
+;; Load neovim colorscheme.
+
+{1 :aktersnurra/no-clown-fiesta.nvim
+ ;; :lazy false
+ ;; :priority 1000
+ :opts {:styles {:type {:bold true}}}
+ :config (lambda [_ opts]
+ (let [plugin (require :no-clown-fiesta)]
+ (plugin.setup opts)
+ (plugin.load)))
+ }
diff --git a/fnl/plugins/comment.fnl b/fnl/plugins/comment.fnl
new file mode 100644
index 0000000..63401a0
--- /dev/null
+++ b/fnl/plugins/comment.fnl
@@ -0,0 +1,20 @@
+;; Language aware commenting.
+
+{1 :numToStr/Comment.nvim
+ :event :BufReadPost
+ :opts {:toggler {;; Line-comment toggle keymap
+ :line :mcc
+ ;; Block-comment toggle keymap
+ :block :mbc}
+ ;; LHS of operator-pending mappings in NORMAL and VISUAL mode
+ :opleader {;; Line-comment keymap
+ :line :mc
+ ;; Block-comment keymap
+ :block :mb}
+ ;; LHS of extra mappings
+ :extra {;; Add comment on the line above
+ :above :mcO
+ ;; Add comment on the line below
+ :below :mco
+ ;; Add comment at the end of line
+ :eol :mcA}}}
diff --git a/fnl/plugins/diffview.fnl b/fnl/plugins/diffview.fnl
new file mode 100644
index 0000000..9978c2e
--- /dev/null
+++ b/fnl/plugins/diffview.fnl
@@ -0,0 +1,5 @@
+;; Inspect commits.
+
+{1 :sindrets/diffview.nvim
+ :cmd [:DiffviewFileHistory :DiffviewOpen]
+ :config true}
diff --git a/fnl/plugins/gitsigns.fnl b/fnl/plugins/gitsigns.fnl
new file mode 100644
index 0000000..1ef8cbc
--- /dev/null
+++ b/fnl/plugins/gitsigns.fnl
@@ -0,0 +1,48 @@
+;; Add git signs to source files.
+
+(local signs {:add {:hl :GitSignsAdd
+ :text "|"
+ :numhl :GitSignsAddNr
+ :linehl :GitSignsAddLn}
+ :change {:hl :GitSignsChange
+ :text "|"
+ :numhl :GitSignsChangeNr
+ :linehl :GitSignsChangeLn}
+ :delete {:hl :GitSignsDelete
+ :text "_"
+ :numhl :GitSignsDeleteNr
+ :linehl :GitSignsDeleteLn}
+ :topdelete {:hl :GitSignsDelete
+ :text "‾"
+ :numhl :GitSignsDeleteNr
+ :linehl :GitSignsDeleteLn}
+ :changedelete {:hl :GitSignsChange
+ :text "~"
+ :numhl :GitSignsChangeNr
+ :linehl :GitSignsChangeLn}})
+
+(local opts {: signs
+ :signcolumn true
+ :numhl false
+ :linehl false
+ :word_diff false
+ :watch_gitdir {:interval 1000 :follow_files true}
+ :attach_to_untracked true
+ :current_line_blame false
+ :current_line_blame_opts {:virt_text true
+ :virt_text_pos :eol
+ :delay 1000
+ :ignore_whitespace false}
+ :current_line_blame_formatter_opts {:relative_time false}
+ :sign_priority 6
+ :update_debounce 100
+ :status_formatter nil
+ :max_file_length 40000
+ :preview_config {:border :single
+ :style :minimal
+ :relative :cursor
+ :row 0
+ :col 1}
+ :yadm {:enable false}})
+
+{1 :lewis6991/gitsigns.nvim :event :BufReadPost : opts}
diff --git a/fnl/plugins/harpoon.fnl b/fnl/plugins/harpoon.fnl
new file mode 100644
index 0000000..7674f0b
--- /dev/null
+++ b/fnl/plugins/harpoon.fnl
@@ -0,0 +1,25 @@
+;; Harpoon files for navigation.
+
+(fn telescope-ext [ext fun opts]
+ (let [telescope (require :telescope)
+ themes (require :telescope.themes)
+ theme (. opts :theme)]
+ ((. (. (. telescope :extensions) ext) fun) ((. themes theme) opts))))
+
+(fn setup []
+ (vim.keymap.set :n :<tab>
+ (fn []
+ (telescope-ext :harpoon :marks
+ {:theme :get_dropdown
+ :previewer false
+ :initial_mode :normal
+ :prompt_title :Harpoon}))
+ {})
+ (vim.keymap.set :n :<s-tab>
+ "<cmd>Telescope buffers theme=dropdown previewer=false initial_mode=normal<cr>"
+ {}))
+
+{1 :ThePrimeagen/harpoon
+ :event :BufReadPost
+ :config (fn []
+ (setup))}
diff --git a/fnl/plugins/hotpot.fnl b/fnl/plugins/hotpot.fnl
new file mode 100644
index 0000000..9c2dbce
--- /dev/null
+++ b/fnl/plugins/hotpot.fnl
@@ -0,0 +1,2 @@
+;; Transpiler for fnl.
+{1 :rktjmp/hotpot.nvim}
diff --git a/fnl/plugins/init.fnl b/fnl/plugins/init.fnl
new file mode 100644
index 0000000..9fea347
--- /dev/null
+++ b/fnl/plugins/init.fnl
@@ -0,0 +1,10 @@
+(let [plugins (require :plugins.lsp)
+ path (.. (vim.fn.stdpath :config) :/fnl/plugins)]
+ (if (vim.loop.fs_stat path)
+ (do
+ (each [fname (vim.fs.dir path)]
+ (let [fname (fname:match "^(.*)%.fnl$")]
+ (if (and (not= fname nil) (not= fname :init) (not= fname :lazy))
+ (table.insert plugins (require (.. :plugins. fname))))))
+ ))
+ plugins)
diff --git a/fnl/plugins/lazy.fnl b/fnl/plugins/lazy.fnl
new file mode 100644
index 0000000..faa53c2
--- /dev/null
+++ b/fnl/plugins/lazy.fnl
@@ -0,0 +1,27 @@
+;; Lazy opts.
+
+{:install {:colorscheme [:no-clown-fiesta]}
+ :performance {:rtp {:disabled_plugins [:gzip
+ :matchit
+ :matchparen
+ :netrwPlugin
+ :tarPlugin
+ :tohtml
+ :tutor
+ :zipPlugin]}}
+ :ui {:icons {:cmd " "
+ :config " "
+ :event " "
+ :ft " "
+ :init " "
+ :import " "
+ :keys " "
+ :lazy "鈴 "
+ :loaded "● "
+ :not_loaded "○ "
+ :plugin " "
+ :runtime " "
+ :source " "
+ :start " "
+ :task " "
+ :list ["● " " " " " "‒ "]}}}
diff --git a/fnl/plugins/leap.fnl b/fnl/plugins/leap.fnl
new file mode 100644
index 0000000..6c2eb53
--- /dev/null
+++ b/fnl/plugins/leap.fnl
@@ -0,0 +1,17 @@
+;; Leap through text.
+
+(fn setup []
+ (let [leap (require :leap)]
+ (leap.setup {})
+ (leap.set_default_keymaps)))
+
+{1 :ggandor/leap.nvim
+ :dependencies {1 :ggandor/flit.nvim
+ :event :BufReadPost
+ :opts {:keys {:f :f :F :F :t :t :T :T}
+ :labeled_modes :v
+ :multiline true
+ :opts {}}}
+ :event :BufReadPost
+ :config (fn []
+ (setup))}
diff --git a/fnl/plugins/lir.fnl b/fnl/plugins/lir.fnl
new file mode 100644
index 0000000..b23d439
--- /dev/null
+++ b/fnl/plugins/lir.fnl
@@ -0,0 +1,52 @@
+;; Simple file manager.
+
+(fn opts [actions mark-actions clipboard-actions]
+ {:show_hidden_files false
+ :devicons_enable true
+ :mappings {:l actions.edit
+ :<C-s> actions.split
+ :v actions.vsplit
+ :<C-t> actions.tabedit
+ :h actions.up
+ :q actions.quit
+ :A actions.mkdir
+ :a actions.newfile
+ :r actions.rename
+ "@" actions.cd
+ :Y actions.yank_path
+ :i actions.toggle_show_hidden
+ :d actions.delete
+ :J (fn []
+ (mark-actions.toggle_mark)
+ (vim.cmd "normal! j"))
+ :c clipboard-actions.copy
+ :x clipboard-actions.cut
+ :p clipboard-actions.paste}
+ :float {:winblend 0
+ :curdir_window {:enable false :highlight_dirname true}
+ :win_opts (fn []
+ (let [width (math.floor (* vim.o.columns 0.7))
+ height (math.floor (* vim.o.lines 0.7))]
+ {:border :rounded : width : height}))}
+ :hide_cursor false
+ :on_init (fn []
+ (vim.api.nvim_buf_set_keymap 0 :x :J
+ ":<C-u>lua require(\"lir.mark.actions\").toggle_mark(\"v\")<CR>"
+ {:noremap true :silent true}))})
+
+(fn setup []
+ (let [actions (require :lir.actions)
+ clipboard-actions (require :lir.clipboard.actions)
+ mark-actions (require :lir.mark.actions)
+ lir (require :lir)]
+ (tset vim.g :loaded_netrw 1)
+ (tset vim.g :loaded_netrwPlugin 1)
+ (lir.setup (opts actions mark-actions clipboard-actions))
+ (vim.keymap.set :n "-" ":lua require'lir.float'.toggle()<cr>"
+ {:noremap true :silent true})))
+
+{1 :tamago324/lir.nvim
+ :keys "-"
+ :config (fn []
+ (setup))
+ :dependencies [:kyazdani42/nvim-web-devicons]}
diff --git a/fnl/plugins/lsp/diagnostics.fnl b/fnl/plugins/lsp/diagnostics.fnl
new file mode 100644
index 0000000..1ac2e42
--- /dev/null
+++ b/fnl/plugins/lsp/diagnostics.fnl
@@ -0,0 +1,33 @@
+;; Handlers for the requests and responses from and to the lsp server.
+
+(local signs [{:name :DiagnosticSignError :text ""}
+ {:name :DiagnosticSignWarn :text ""}
+ {:name :DiagnosticSignHint :text ""}
+ {:name :DiagnosticSignInfo :text ""}])
+
+(fn apply-signs []
+ (each [_ sign (ipairs signs)]
+ (vim.fn.sign_define sign.name {:texthl sign.name :text sign.text :numhl ""})))
+
+(local config {:virtual_text false
+ :signs {:active signs}
+ :update_in_insert false
+ :underline true
+ :severity_sort true
+ :float {:focusable false
+ :style :minimal
+ :border :rounded
+ :source :always
+ :header ""
+ :prefix ""}})
+
+(fn setup []
+ (apply-signs)
+ (vim.diagnostic.config config)
+ (set vim.lsp.handlers.textDocument/hover
+ (vim.lsp.with {:border :rounded :width 60}))
+ (set vim.lsp.handlers.textDocument/signatureHelp
+ (vim.lsp.with vim.lsp.handlers.signature_help
+ {:border :rounded :width 60})))
+
+{: setup}
diff --git a/fnl/plugins/lsp/init.fnl b/fnl/plugins/lsp/init.fnl
new file mode 100644
index 0000000..bef4141
--- /dev/null
+++ b/fnl/plugins/lsp/init.fnl
@@ -0,0 +1,5 @@
+;; Lsp plugins.
+
+[(require :plugins.lsp.lspconfig)
+ (require :plugins.lsp.mason)
+ (require :plugins.lsp.null-ls)]
diff --git a/fnl/plugins/lsp/keymaps.fnl b/fnl/plugins/lsp/keymaps.fnl
new file mode 100644
index 0000000..a7fac89
--- /dev/null
+++ b/fnl/plugins/lsp/keymaps.fnl
@@ -0,0 +1,23 @@
+;; Key mappings for lsp.
+
+(fn on-attach [bufnr] (let [opts {:noremap true :silent true}]
+ (vim.api.nvim_buf_set_keymap bufnr :n :gD
+ "<cmd>lua vim.lsp.buf.declaration()<CR>"
+ opts)
+ (vim.api.nvim_buf_set_keymap bufnr :n :gd
+ "<cmd>lua vim.lsp.buf.definition()<CR>"
+ opts)
+ (vim.api.nvim_buf_set_keymap bufnr :n :gI
+ "<cmd>lua vim.lsp.buf.implementation()<CR>"
+ opts)
+ (vim.api.nvim_buf_set_keymap bufnr :n :gr
+ "<cmd>lua vim.lsp.buf.references()<CR>"
+ opts)
+ (vim.api.nvim_buf_set_keymap bufnr :n :gl
+ "<cmd>lua vim.diagnostic.open_float()<CR>"
+ opts)
+ (vim.api.nvim_buf_set_keymap bufnr :n :gs
+ "<cmd>lua vim.lsp.buf.signature_help()<CR>"
+ opts)))
+
+{: on-attach}
diff --git a/fnl/plugins/lsp/lspconfig.fnl b/fnl/plugins/lsp/lspconfig.fnl
new file mode 100644
index 0000000..b2ee792
--- /dev/null
+++ b/fnl/plugins/lsp/lspconfig.fnl
@@ -0,0 +1,42 @@
+;; Setup of lsps.
+
+(fn on-attach []
+ (vim.api.nvim_create_autocmd :LspAttach
+ {:callback (fn [args]
+ (let [keymaps (require :plugins.lsp.keymaps)
+ bufnr (. args :buf)]
+ (keymaps.on-attach bufnr)))}))
+
+(fn capabilities []
+ (let [cmp-lsp (require :cmp_nvim_lsp)]
+ (cmp-lsp.default_capabilities (vim.lsp.protocol.make_client_capabilities))))
+
+(fn mason-opts [servers]
+ {:ensure_installed (vim.tbl_keys servers) :automatic_installation true})
+
+(fn setup []
+
+ (let [diagnostics (require :plugins.lsp.diagnostics)
+ lspconfig (require :lspconfig)
+ mason-lspconfig (require :mason-lspconfig)
+ servers (require :plugins.lsp.servers)]
+ (diagnostics.setup)
+ (on-attach)
+ (mason-lspconfig.setup (mason-opts servers))
+ (mason-lspconfig.setup_handlers [(fn [server-name]
+ (let [server-config (. lspconfig
+ server-name)
+ opts (or (. servers server-name)
+ {})]
+ (tset opts :capabilities
+ (capabilities))
+ (server-config.setup opts)))])))
+
+{1 :neovim/nvim-lspconfig
+ :event :BufReadPre
+ :dependencies [:mason.nvim
+ :williamboman/mason-lspconfig.nvim
+ :b0o/SchemaStore.nvim
+ :hrsh7th/cmp-nvim-lsp]
+ :config (fn []
+ (setup))}
diff --git a/fnl/plugins/lsp/mason.fnl b/fnl/plugins/lsp/mason.fnl
new file mode 100644
index 0000000..bf57de5
--- /dev/null
+++ b/fnl/plugins/lsp/mason.fnl
@@ -0,0 +1,11 @@
+;; Mason manages external tooling, e.g. lsp, formatters, and linters.
+
+(local opts {:ui {:icons {:package_installed " "
+ :package_pending " "
+ :package_uninstalled " "}}
+ :max_concurrent_installers 10})
+
+{1 :williamboman/mason.nvim
+ :cmd :Mason
+ :keys [{1 :<leader>m 2 :<cmd>Mason<cr> :desc :Mason}]
+ : opts}
diff --git a/fnl/plugins/lsp/null-ls.fnl b/fnl/plugins/lsp/null-ls.fnl
new file mode 100644
index 0000000..13dd493
--- /dev/null
+++ b/fnl/plugins/lsp/null-ls.fnl
@@ -0,0 +1,43 @@
+;; Adds LSP diagnostics and formatting.
+
+(local mason-opts {:ensure_installed nil
+ :automatic_installation true
+ :automatic_setup false})
+
+(fn setup []
+ (let [null-ls (require :null-ls)
+ mason-null-ls (require :mason-null-ls)]
+ (let [formatting null-ls.builtins.formatting
+ diagnostics null-ls.builtins.diagnostics]
+ (null-ls.setup {:debug false
+ :sources [diagnostics.codespell
+ diagnostics.cpplint
+ diagnostics.gitlint
+ diagnostics.hadolint
+ diagnostics.jsonlint
+ diagnostics.misspell
+ diagnostics.ruff
+ diagnostics.selene
+ diagnostics.shellcheck
+ diagnostics.sqlfluff
+ diagnostics.write_good
+ diagnostics.yamllint
+ formatting.fnlfmt
+ formatting.markdownlint
+ formatting.prettierd
+ formatting.ruff
+ formatting.rustfmt
+ formatting.shellharden
+ formatting.shfmt
+ formatting.sqlfluff
+ formatting.stylua
+ formatting.terraform_fmt]}))
+ (mason-null-ls.setup mason-opts)))
+
+{1 :jose-elias-alvarez/null-ls.nvim
+ :dependencies [:mason.nvim
+ :jayp0521/mason-null-ls.nvim
+ :nvim-lua/plenary.nvim]
+ :event :BufReadPre
+ :config (fn []
+ (setup))}
diff --git a/fnl/plugins/lsp/servers.fnl b/fnl/plugins/lsp/servers.fnl
new file mode 100644
index 0000000..2403c1a
--- /dev/null
+++ b/fnl/plugins/lsp/servers.fnl
@@ -0,0 +1,29 @@
+;; List of lsp that should be automatically installed and supported.
+
+{:bashls {}
+ :clangd {}
+ :cssls {}
+ :dockerls {}
+ :hls {}
+ :html {}
+ :jsonls {:init_options {:providerFormatter false}
+ :settings {:json {:schemas (let [schemastore (require :schemastore)]
+ (schemastore.json.schemas))}}
+ :setup {:commands {:Format [(fn []
+ (vim.lsp.buf.range_formatting [] [0 0]
+ [(vim.fn.line "$"
+ 0)]))]}}}
+ :pyright {}
+ :rust_analyzer {:settings {:rust-analyzer {:lens {:enable true}
+ :checkOnSave {:command :clippy}}}}
+ :sqls {}
+ :sumneko_lua {:settings {:Lua {:completion {:callSnippet :Replace}
+ :workspace {:checkThirdParty false}
+ :runtime {:version :LuaJIT
+ :path (vim.split package.path ";")}}}}
+ :taplo {}
+ :terraformls {}
+ :texlab {}
+ :tflint {}
+ :yamlls {}
+ :zk {}}
diff --git a/fnl/plugins/lualine.fnl b/fnl/plugins/lualine.fnl
new file mode 100644
index 0000000..7373704
--- /dev/null
+++ b/fnl/plugins/lualine.fnl
@@ -0,0 +1,87 @@
+;; Statusbar.
+
+(local disable [:neogitstatus
+ :netrw
+ :lir
+ :lazy
+ :alpha
+ :Outline
+ :NeogitStatus
+ :NeogitCommitMessage])
+
+(local ignore [:help :packer :spectre_panel :TelescopePrompt])
+
+(fn active-clients []
+ (let [clients (vim.lsp.buf_get_clients)
+ client_names []]
+ (each [_ client (pairs clients)]
+ (if (not= client.name :null-ls)
+ (table.insert client_names client.name)))
+ (if (> (length client_names) 0)
+ (table.concat client_names ", ")
+ "")))
+
+(fn hide-in-width []
+ (> (vim.fn.winwidth 0) 80))
+
+(local diagnostics {1 :diagnostics
+ :sources [:nvim_diagnostic]
+ :sections [:error :warn]
+ :symbols {:error " " :warn " "}
+ :colored false
+ :disabled_buftypes [:nvim-tree]
+ :padding 0
+ :update_in_insert false
+ :always_visible true})
+
+(local diff {1 :diff
+ :colored false
+ :disabled_buftypes [:nvim-tree]
+ :cond hide-in-width})
+
+(local branch {1 "b:gitsigns_head"
+ :icon " "
+ :disabled_buftypes [:nvim-tree]
+ :cond hide-in-width})
+
+(local filetype {1 :filetype
+ :icon_only true
+ :disabled_buftypes [:nvim-tree]
+ :colored false
+ :cond hide_in_width})
+
+(local language-server {1 active-clients
+ :disabled_buftypes [:nvim-tree]
+ :cond hide_in_width})
+
+(local lsp-progress
+ {1 :lsp_progress
+ :display_components [[:title :percentage :message]]
+ :timer {:progress_enddelay 500 :lsp_client_name_enddelay 500}})
+
+(local opts {:options {:icons_enabled true
+ :theme :auto
+ :component_separators ""
+ :section_separators {:left "" :right ""}
+ :disabled_filetypes disable
+ :ignore_focus ignore
+ :always_divide_middle true
+ :globalstatus true}
+ :sections {:lualine_a [:mode]
+ :lualine_b [branch diff]
+ :lualine_c {}
+ :lualine_x [lsp_progress language-server diagnostics]
+ :lualine_y [filetype]
+ :lualine_z [:location :progress]}
+ :inactive_sections {:lualine_a [:mode]
+ :lualine_b {}
+ :lualine_c {}
+ :lualine_x {}
+ :lualine_y {}
+ :lualine_z [:location :progress]}
+ :extensions []})
+
+{1 :nvim-lualine/lualine.nvim
+ :event :BufReadPost
+ : opts
+ :dependencies [:kyazdani42/nvim-web-devicons :arkav/lualine-lsp-progress]}
diff --git a/fnl/plugins/minibar.fnl b/fnl/plugins/minibar.fnl
new file mode 100644
index 0000000..0dff6d6
--- /dev/null
+++ b/fnl/plugins/minibar.fnl
@@ -0,0 +1,30 @@
+;; Show the filename in the top left corner.
+
+{1 :aktersnurra/minibar.nvim
+ :event :BufReadPre
+ :opts {:ignore-filetypes [:help
+ :harpoon
+ :startify
+ :dashboard
+ :lir
+ :alpha
+ :packer
+ :neogitstatus
+ :Trouble
+ :org
+ :lazy
+ :netrw
+ :Outline
+ :NeogitStatus
+ :NeogitCommitMessage
+ :NeogitNotification
+ :NeogitCommitView
+ :spectre_panel
+ ""]
+ :events [:CursorMoved
+ :TermOpen
+ :DirChanged
+ :BufWinEnter
+ :BufFilePost
+ :InsertEnter
+ :BufWritePost]}}
diff --git a/fnl/plugins/neogit.fnl b/fnl/plugins/neogit.fnl
new file mode 100644
index 0000000..b7c1633
--- /dev/null
+++ b/fnl/plugins/neogit.fnl
@@ -0,0 +1,6 @@
+;; Git ui.
+
+{1 :TimUntersberger/neogit
+ :cmd :Neogit
+ :dependencies [:nvim-lua/plenary.nvim]
+ :config true}
diff --git a/fnl/plugins/orgmode.fnl b/fnl/plugins/orgmode.fnl
new file mode 100644
index 0000000..99e55be
--- /dev/null
+++ b/fnl/plugins/orgmode.fnl
@@ -0,0 +1,24 @@
+;; Orgmode for nvim.
+
+(local templates
+ {:t {:description :Task :template "* TODO %?\n %u\n DEADLINE: %T\n"}
+ :m {:description :Meeting :template "* Meeting %?"}
+ :n {:description :Note :template "* NOTE %? :NOTE:\n %u\n"}})
+
+(local opts {:org_agenda_files ["~/.local/share/org/**/*"]
+ :org_hide_emphasis_markers true
+ :org_agenda_start_on_weekday false
+ :org_default_notes_file "~/.local/share/org/refile.org"
+ :org_agenda_templates templates})
+
+(fn setup []
+ (let [orgmode (require :orgmode)]
+ (tset vim.opt :conceallevel 2)
+ (tset vim.opt :concealcursor :nc)
+ (orgmode.setup_ts_grammar)
+ (orgmode.setup opts)))
+
+{1 :nvim-orgmode/orgmode
+ :event :BufReadPost
+ :config (fn []
+ (setup))}
diff --git a/fnl/plugins/persistence.fnl b/fnl/plugins/persistence.fnl
new file mode 100644
index 0000000..4cde73e
--- /dev/null
+++ b/fnl/plugins/persistence.fnl
@@ -0,0 +1,5 @@
+;; Session manager.
+
+{1 :folke/persistence.nvim
+ :event :VeryLazy
+ :opts {:options [:buffers :curdir :tabpages :winsize :help]}}
diff --git a/fnl/plugins/project.fnl b/fnl/plugins/project.fnl
new file mode 100644
index 0000000..4361e06
--- /dev/null
+++ b/fnl/plugins/project.fnl
@@ -0,0 +1,16 @@
+;; Provides project management.
+
+{1 :ahmedkhalf/project.nvim
+ :cmd :Telescope
+ :opts {:active true
+ :on_config_done nil
+ :manual_mode false
+ :detection_methods [:patterns]
+ :patterns [:git :_darcs :.hg :.bzr :.svn :Makefile :package.json]
+ :show_hidden false
+ :silent_chdir true
+ :ignore_lsp {}
+ :datapath (vim.fn.stdpath :data)}
+ :config (lambda [_ opts]
+ (let [project (require :project_nvim)]
+ (project.setup opts)))}
diff --git a/fnl/plugins/spectre.fnl b/fnl/plugins/spectre.fnl
new file mode 100644
index 0000000..92a33ba
--- /dev/null
+++ b/fnl/plugins/spectre.fnl
@@ -0,0 +1,54 @@
+;; Find and replace.
+
+(local opts {:color_devicons true
+ :highlight {:ui :String :search :DiffChange :replace :DiffDelete}
+ :mapping {:toggle_line {:map :t
+ :cmd "<cmd>lua require('spectre').toggle_line()<CR>"
+ :desc "toggle current item"}
+ :enter_file {:map :<cr>
+ :cmd "<cmd>lua require('spectre.actions').select_entry()<CR>"
+ :desc "goto current file"}
+ :send_to_qf {:map :Q
+ :cmd "<cmd>lua require('spectre.actions').send_to_qf()<CR>"
+ :desc "send all item to quickfix"}
+ :replace_cmd {:map :c
+ :cmd "<cmd>lua require('spectre.actions').replace_cmd()<CR>"
+ :desc "input replace vim command"}
+ :show_option_menu {:map :o
+ :cmd "<cmd>lua require('spectre').show_options()<CR>"
+ :desc "show option"}
+ :run_replace {:map :R
+ :cmd "<cmd>lua require('spectre.actions').run_replace()<CR>"
+ :desc "replace all"}
+ :change_view_mode {:map :m
+ :cmd "<cmd>lua require('spectre').change_view()<CR>"
+ :desc "change result view mode"}
+ :toggle_ignore_case {:map :I
+ :cmd "<cmd>lua require('spectre').change_options('ignore-case')<CR>"
+ :desc "toggle ignore case"}
+ :toggle_ignore_hidden {:map :H
+ :cmd "<cmd>lua require('spectre').change_options('hidden')<CR>"
+ :desc "toggle search hidden"}}
+ :find_engine {:rg {:cmd :rg
+ :args [:--color=never
+ :--no-heading
+ :--with-filename
+ :--line-number
+ :--column]
+ :options {:ignore-case {:value :--ignore-case
+ :icon "[I]"
+ :desc "ignore case"}
+ :hidden {:value :--hidden
+ :desc "hidden file"
+ :icon "[H]"}}}}
+ :replace_engine {:sed {:cmd :sed :args nil}
+ :options {:ignore-case {:value :--ignore-case
+ :icon "[I]"
+ :desc "ignore case"}}}
+ :default {:find {:cmd :rg :options [:ignore-case]}
+ :replace {:cmd :sed}}
+ :replace_vim_cmd :cdo
+ :is_open_target_win true
+ :is_insert_mode false})
+
+{1 :windwp/nvim-spectre :event :BufReadPost : opts}
diff --git a/fnl/plugins/stay-in-place.fnl b/fnl/plugins/stay-in-place.fnl
new file mode 100644
index 0000000..b264a05
--- /dev/null
+++ b/fnl/plugins/stay-in-place.fnl
@@ -0,0 +1,3 @@
+;; Keep cursor at character when indenting.
+
+{1 :gbprod/stay-in-place.nvim :event :BufReadPost :config true}
diff --git a/fnl/plugins/surround.fnl b/fnl/plugins/surround.fnl
new file mode 100644
index 0000000..e8fda32
--- /dev/null
+++ b/fnl/plugins/surround.fnl
@@ -0,0 +1,3 @@
+;; Surround selections.
+
+{1 :kylechui/nvim-surround :event :InsertEnter :config true}
diff --git a/fnl/plugins/symbols-outline.fnl b/fnl/plugins/symbols-outline.fnl
new file mode 100644
index 0000000..4195de0
--- /dev/null
+++ b/fnl/plugins/symbols-outline.fnl
@@ -0,0 +1,3 @@
+;; List tree of symbols.
+
+{1 :simrat39/symbols-outline.nvim :cmd :SymbolsOutline :config true}
diff --git a/fnl/plugins/telescope.fnl b/fnl/plugins/telescope.fnl
new file mode 100644
index 0000000..7f782e1
--- /dev/null
+++ b/fnl/plugins/telescope.fnl
@@ -0,0 +1,94 @@
+;; Telescope a highly extendable fuzzy finder over lists.
+
+(fn setup []
+ (let [telescope (require :telescope)
+ actions (require :telescope.actions)]
+ (telescope.setup {:defaults {:prompt_prefix "  "
+ :selection_caret "> "
+ :path_display [:smart]
+ :color_devicons false
+ :vimgrep_arguments [:rg
+ :--color=never
+ :--no-heading
+ :--with-filename
+ :--line-number
+ :--column
+ :--smart-case
+ :--hidden]
+ :mappings {:i {:<C-n> actions.cycle_history_next
+ :<C-p> actions.cycle_history_prev
+ :<C-j> actions.move_selection_next
+ :<C-k> actions.move_selection_previous
+ :<C-c> actions.close
+ :<Down> actions.move_selection_next
+ :<Up> actions.move_selection_previous
+ :<CR> actions.select_default
+ :<C-x> actions.select_horizontal
+ :<C-v> actions.select_vertical
+ :<C-t> actions.select_tab
+ :<C-u> actions.preview_scrolling_up
+ :<C-d> actions.preview_scrolling_down
+ :<PageUp> actions.results_scrolling_up
+ :<PageDown> actions.results_scrolling_down
+ :<Tab> (+ actions.toggle_selection
+ actions.move_selection_worse)
+ :<S-Tab> (+ actions.toggle_selection
+ actions.move_selection_better)
+ :<C-q> (+ actions.send_to_qflist
+ actions.open_qflist)
+ :<M-q> (+ actions.send_selected_to_qflist
+ actions.open_qflist)
+ :<C-l> actions.complete_tag
+ :<C-_> actions.which_key}
+ :n {:<esc> actions.close
+ :<CR> actions.select_default
+ :<C-x> actions.select_horizontal
+ :<C-v> actions.select_vertical
+ :<C-t> actions.select_tab
+ :<Tab> (+ actions.toggle_selection
+ actions.move_selection_worse)
+ :<S-Tab> (+ actions.toggle_selection
+ actions.move_selection_better)
+ :<C-q> (+ actions.send_to_qflist
+ actions.open_qflist)
+ :<M-q> (+ actions.send_selected_to_qflist
+ actions.open_qflist)
+ :j actions.move_selection_next
+ :k actions.move_selection_previous
+ :H actions.move_to_top
+ :M actions.move_to_middle
+ :L actions.move_to_bottom
+ :<Down> actions.move_selection_next
+ :<Up> actions.move_selection_previous
+ :gg actions.move_to_top
+ :G actions.move_to_bottom
+ :q actions.close
+ :<C-u> actions.preview_scrolling_up
+ :<C-d> actions.preview_scrolling_down
+ :<PageUp> actions.results_scrolling_up
+ :<PageDown> actions.results_scrolling_down
+ :dd actions.delete_buffer
+ :? actions.which_key}}}
+ :extensions {:fzf {:fuzzy true
+ :override_generic_sorter true
+ :override_file_sorter true
+ :case_mode :smart_case}}})
+ (telescope.load_extension :fzf)
+ (telescope.load_extension :frecency)
+ (telescope.load_extension :orgmode)
+ (telescope.load_extension :projects)
+ (telescope.load_extension :harpoon)))
+
+{1 :nvim-telescope/telescope.nvim
+ :cmd :Telescope
+ :dependencies [:nvim-lua/popup.nvim
+ :nvim-telescope/telescope-frecency.nvim
+ {1 :nvim-telescope/telescope-fzf-native.nvim :build :make}
+ :tami5/sqlite.lua
+ :ahmedkhalf/project.nvim
+ :nvim-lua/plenary.nvim
+ :nvim-telescope/telescope-fzf-native.nvim
+ :nvim-telescope/telescope-frecency.nvim
+ :joaomsa/telescope-orgmode.nvim]
+ :config (fn []
+ (setup))}
diff --git a/fnl/plugins/toggleterm.fnl b/fnl/plugins/toggleterm.fnl
new file mode 100644
index 0000000..d75aea1
--- /dev/null
+++ b/fnl/plugins/toggleterm.fnl
@@ -0,0 +1,5 @@
+;; Terminal inside nvim.
+
+{1 :akinsho/toggleterm.nvim
+ :cmd :ToggleTerm
+ :opts {:size 16 :shade_terminals false}}
diff --git a/fnl/plugins/treesitter.fnl b/fnl/plugins/treesitter.fnl
new file mode 100644
index 0000000..1d96a13
--- /dev/null
+++ b/fnl/plugins/treesitter.fnl
@@ -0,0 +1,39 @@
+;; Treesitter is a tool for building syntax trees for source files.
+;; In the neovim context it helps with better coloring.
+
+(local opts {:ensure_installed [:c
+ :rust
+ :lua
+ :hcl
+ :org
+ :haskell
+ :python
+ :fennel
+ :make
+ :go
+ :ocaml
+ :erlang
+ :vim
+ :yaml
+ :html
+ :toml
+ :dockerfile
+ :markdown
+ :latex]
+ :sync_install false
+ :ignore_install [""]
+ :autopairs {:enable true}
+ :highlight {:enable true :disable [:org]}
+ :context_commentstring {:enable true :enable_autocmd false}
+ :indent {:enable true :disable [:yaml :python :css]}
+ :playground {:enable true}})
+
+(fn setup []
+ (let [treesitter (require :nvim-treesitter.configs)]
+ (treesitter.setup opts)))
+
+{1 :nvim-treesitter/nvim-treesitter
+ :build ":TSUpdate"
+ :event :BufReadPost
+ :config (fn []
+ (setup))}
diff --git a/fnl/plugins/trim.fnl b/fnl/plugins/trim.fnl
new file mode 100644
index 0000000..7f224bc
--- /dev/null
+++ b/fnl/plugins/trim.fnl
@@ -0,0 +1,3 @@
+;; Trim whitespaces on save.
+
+{1 :cappyzawa/trim.nvim :event :BufFilePre :opts {:disable [:python]}}
diff --git a/fnl/plugins/trouble.fnl b/fnl/plugins/trouble.fnl
new file mode 100644
index 0000000..3f736bb
--- /dev/null
+++ b/fnl/plugins/trouble.fnl
@@ -0,0 +1,81 @@
+;; Pretty diagnostics.
+
+(local opts {:position :bottom
+ ;; position of the list can be: bottom, top, left, right
+ :height 10
+ ;; height of the trouble list when position is top or bottom
+ :width 50
+ ;; width of the list when position is left or right
+ :icons true
+ ;; use devicons for filenames
+ :mode :workspace_diagnostics
+ ;; "workspace_diagnostics", "document_diagnostics", "quickfix", "lsp_references", "loclist"
+ :fold_open ""
+ ;; icon used for open folds
+ :fold_closed ""
+ ;; icon used for closed folds
+ :group true
+ ;; group results by file
+ :padding true
+ ;; add an extra new line on top of the list
+ :action_keys {;; key mappings for actions in the trouble list
+ ;; map to {} to remove a mapping for example:
+ ;; close {}
+ :close :q
+ ;; close the list
+ :cancel :<esc>
+ ;; cancel the preview and get back to your last window / buffer / cursor
+ :refresh :r
+ ;; manually refresh
+ :jump [:<cr> :<tab>]
+ ;; jump to the diagnostic or open / close folds
+ :open_split [:<c-x>]
+ ;; open buffer in new split
+ :open_vsplit [:<c-v>]
+ ;; open buffer in new vsplit
+ :open_tab [:<c-t>]
+ ;; open buffer in new tab
+ :jump_close [:o]
+ ;; jump to the diagnostic and close the list
+ :toggle_mode :m
+ ;; toggle between "workspace" and "document" diagnostics mode
+ :toggle_preview :P
+ ;; toggle auto_preview
+ :hover :K
+ ;; opens a small popup with the full multiline message
+ :preview :p
+ ;; preview the diagnostic location
+ :close_folds [:zM :zm]
+ ;; close all folds
+ :open_folds [:zR :zr]
+ ;; open all folds
+ :toggle_fold [:zA :za]
+ ;; toggle fold of current file
+ :previous :k
+ ;; previous item
+ :next :j
+ ;; next item
+ }
+ :indent_lines true
+ ;; add an indent guide below the fold icons
+ :auto_open false
+ ;; automatically open the list when you have diagnostics
+ :auto_close false
+ ;; automatically close the list when you have no diagnostics
+ :auto_preview true
+ ;; automatically preview the location of the diagnostic. <esc> to close preview and go back to last window
+ :auto_fold false
+ ;; automatically fold a file trouble list at creation
+ :auto_jump [:lsp_definitions]
+ ;; for the given modes, automatically jump if there is only a single result
+ :signs {;; icons / text used for a diagnostic
+ :error ""
+ :warning ""
+ :hint ""
+ :information ""
+ :other "﫠"}
+ :use_diagnostic_signs false
+ ;; enabling this will use the signs defined in your lsp client
+ })
+
+{1 :folke/trouble.nvim :cmd :TroubleToggle : opts}
diff --git a/fnl/plugins/undotree.fnl b/fnl/plugins/undotree.fnl
new file mode 100644
index 0000000..9aa8114
--- /dev/null
+++ b/fnl/plugins/undotree.fnl
@@ -0,0 +1,3 @@
+;; Tree of undo history.
+
+{1 :mbbill/undotree :cmd :UndotreeToggle}
diff --git a/fnl/plugins/vim-slash.fnl b/fnl/plugins/vim-slash.fnl
new file mode 100644
index 0000000..6f50ae4
--- /dev/null
+++ b/fnl/plugins/vim-slash.fnl
@@ -0,0 +1,6 @@
+;; Provides a set of mappings for enhancing in-buffer search experience.
+
+{1 :junegunn/vim-slash
+ :event :BufReadPost
+ :config (fn []
+ (vim.cmd "noremap <plug>(slash-after) zz"))}
diff --git a/fnl/plugins/which-key.fnl b/fnl/plugins/which-key.fnl
new file mode 100644
index 0000000..e31507b
--- /dev/null
+++ b/fnl/plugins/which-key.fnl
@@ -0,0 +1,173 @@
+;; Which-key provides a pop-up menu for some key mappings.
+
+(local opts {:plugins {:marks true
+ :registers true
+ :spelling {:enabled true :suggestions 20}
+ :presets {:operators false
+ :motions false
+ :text_objects false
+ :windows true
+ :nav true
+ :z true
+ :g true}}
+ :icons {:breadcrumb "»" :separator "" :group "+"}
+ :popup_mappings {:scroll_down :<c-d> :scroll_up :<c-u>}
+ :window {:border :rounded :position :bottom :winblend 0}
+ :layout {:height {:min 4 :max 25}
+ :width {:min 20 :max 50}
+ :spacing 3
+ :align :left}
+ :ignore_missing true
+ :hidden [:<silent> :<cmd> :<Cmd> :<CR> :call :lua "^:" "^ "]
+ :show_help true
+ :triggers :auto
+ :disable {:filetypes [:netrw]}
+ :triggers_blacklist {:i [:j :k] :v [:j :k]}})
+
+(local mopts {:mode :n
+ :prefix :m
+ :buffer nil
+ :silent true
+ :noremap true
+ :nowait true})
+
+(local mmappings {:a [:<cmd>HarpoonAdd<cr> :Harpoon]
+ :d [:<cmd>DiffviewFileHistory<cr> :DiffviewFileHistory]
+ :f [:<cmd>FindFiles<cr> "Find files"]
+ :g ["<cmd>Telescope live_grep theme=dropdown<cr>"
+ "Find text"]
+ :n [:<cmd>Neogit<cr> :Neogit]
+ :p [:<cmd>SaveSession<cr> "Save Session"]
+ :q ["<cmd>Gitsigns diffthis HEAD<cr>" "Gitsigns diff"]
+ :r [:<cmd>HarpoonUI<cr> "Harpoon UI"]
+ :s [:<cmd>HarpoonPrev<cr> "Harpoon Prev"]
+ :t [:<cmd>HarpoonNext<cr> "Harpoon Next"]
+ :v ["<cmd>lua vim.lsp.buf.rename()<cr>" :Rename]
+ :x ["<cmd>DiffviewOpen -uno<cr>" :DiffviewOpen]
+ :z [:<cmd>DiffviewClose<cr> :DiffviewClose]})
+
+(local nopts {:mode :n
+ :prefix :<leader>
+ :buffer nil
+ :silent true
+ :noremap true
+ :nowait true})
+
+(local find
+ {:name :find
+ :C ["<cmd>Telescope commands theme=dropdown<cr>" :Commands]
+ :H ["<cmd>Telescope highlights<cr>" :Highlights]
+ :R ["<cmd>Telescope registers theme=dropdown<cr>" :Registers]
+ :S ["<cmd>Telescope grep_string theme=dropdown<cr>" "Find String"]
+ :b ["<cmd>Telescope git_branches theme=dropdown<cr>" "Checkout branch"]
+ :c ["<cmd>Telescope colorscheme theme=dropdown<cr>" :Colorscheme]
+ :f [:<cmd>FindFiles<cr> "Find files"]
+ :h ["<cmd>Telescope help_tags theme=dropdown<cr>" :Help]
+ :k ["<cmd>Telescope keymaps theme=dropdown<cr>" :Keymaps]
+ :l ["<cmd>Telescope resume theme=dropdown<cr>" "Last Search"]
+ :p ["<cmd>Telescope projects theme=dropdown<cr>" "Find project"]
+ :r ["<cmd>Telescope oldfiles theme=dropdown<cr>" "Recent File"]
+ :s [:<cmd>SearchSession<cr> "Find Session"]
+ :t ["<cmd>Telescope live_grep theme=dropdown<cr>" "Find text"]})
+
+(local diagnostics {:name :diagnostics
+ :t [:<cmd>TroubleToggle<cr> :Trouble]
+ :g ["<cmd>Telescope diagnostics theme=dropdown<cr>"
+ "Telescope diagnostics"]})
+
+(local git {:name :git
+ :R ["<cmd>lua require 'gitsigns'.reset_buffer()<cr>"
+ "Reset Buffer"]
+ :b ["<cmd>Telescope git_branches theme=dropdown<cr>"
+ "Checkout branch"]
+ :c ["<cmd>Telescope git_commits theme=dropdown<cr>"
+ "Checkout commit"]
+ :d ["<cmd>Gitsigns diffthis HEAD<cr>" :Diff]
+ :j ["<cmd>lua require 'gitsigns'.next_hunk()<cr>" "Next Hunk"]
+ :k ["<cmd>lua require 'gitsigns'.prev_hunk()<cr>" "Prev Hunk"]
+ :l ["<cmd>lua require 'gitsigns'.blame_line()<cr>" :Blame]
+ :o ["<cmd>Telescope git_status theme=dropdown<cr>"
+ "Open changed file"]
+ :p ["<cmd>lua require 'gitsigns'.preview_hunk()<cr>"
+ "Preview Hunk"]
+ :r ["<cmd>lua require 'gitsigns'.reset_hunk()<cr>" "Reset Hunk"]
+ :s ["<cmd>lua require 'gitsigns'.stage_hunk()<cr>" "Stage Hunk"]
+ :u ["<cmd>lua require 'gitsigns'.undo_stage_hunk()<cr>"
+ "Undo Stage Hunk"]})
+
+(local lsp
+ {:name :lsp
+ :S ["<cmd>Telescope lsp_dynamic_workspace_symbols<cr>"
+ "Workspace Symbols"]
+ :a ["<cmd>lua vim.lsp.buf.code_action()<cr>" "Code Action"]
+ :f ["<cmd>lua vim.lsp.buf.format { async = true }<cr>" :Format]
+ :i [:<cmd>LspInfo<cr> :Info]
+ :l ["<cmd>lua vim.lsp.codelens.run()<cr>" "CodeLens Action"]
+ :r ["<cmd>lua vim.lsp.buf.rename()<cr>" :Rename]
+ :s ["<cmd>Telescope lsp_document_symbols<cr>" "Document Symbols"]})
+
+(local replace {:name :replace
+ :m [:<cmd>ReplaceInBuf<cr> "Replace in Buffer"]
+ :n [:<cmd>Replace<cr> :Replace]
+ :e [:<cmd>ReplaceWord<cr> "Replace Word"]})
+
+(local session
+ {:name :session
+ :m [:<cmd>RestoreSession<cr> "Restore session"]
+ :n [:<cmd>RestoreLastSession<cr> "Restore last session"]
+ :e [:<cmd>IgnoreSession<cr> "Ignore current session"]})
+
+(local treesitter
+ {:name :Treesitter :p [:<cmd>TSPlaygroundToggle<cr> :Playground]})
+
+(local nmappings {:a ["<cmd>Telescope lsp_document_symbols theme=dropdown<cr>"
+ "Document Symbols"]
+ :T treesitter
+ :<BS> [:<cmd>BufDel<CR> "Close Buffer"]
+ :j diagnostics
+ :f find
+ :g git
+ :h [:<cmd>ColorizerToggle<cr> :Colorizer]
+ :l lsp
+ :m [:<cmd>Mason<cr> :Mason]
+ :n [:<cmd>SymbolsOutline<cr> "Symbols outline"]
+ :r replace
+ :s session
+ :t [:<cmd>ToggleTerm<cr> :Terminal]
+ :u [:<cmd>UndotreeToggle<cr> :Undotree]
+ :y ["<cmd>Lazy home<cr>" :Home]
+ :z [:<cmd>ZenMode<cr> "Zen Mode"]})
+
+(local vopts {:mode :v
+ :prefix :<leader>
+ :buffer nil
+ :silent true
+ :noremap true
+ :nowait true})
+
+(local vmappings {:n [:<esc><cmd>CommentVisual<cr> :Comment]})
+
+(local gopts {:mode :n
+ :prefix :g
+ :buffer nil
+ :silent true
+ :noremap true
+ :nowait true})
+
+(local gmappings {:a [:<cmd>OrgAgendaPrompt<cr> "Open agenda prompt"]
+ :c [:<cmd>OrgCapturePrompt<cr> "Open capture prompt"]
+ :m ["<cmd>Telescope orgmode search_headings theme=dropdown<cr>"
+ "Search headings"]})
+
+(fn setup []
+ (let [which-key (require :which-key)]
+ (which-key.setup opts)
+ (which-key.register mmappings mopts)
+ (which-key.register nmappings nopts)
+ (which-key.register vmappings vopts)
+ (which-key.register gmappings gopts)))
+
+{1 :folke/which-key.nvim
+ :event :VeryLazy
+ :config (fn []
+ (setup))}
diff --git a/fnl/plugins/window-picker.fnl b/fnl/plugins/window-picker.fnl
new file mode 100644
index 0000000..2820409
--- /dev/null
+++ b/fnl/plugins/window-picker.fnl
@@ -0,0 +1,19 @@
+;; Trim whitespaces on save.
+
+(fn pick-window [opts]
+ (let [window-picker (require :window-picker)]
+ (let [win (window-picker.pick_window)]
+ (if (not= win nil)
+ (vim.api.nvim_set_current_win win)))))
+
+{1 :s1n7ax/nvim-window-picker
+ :event :BufReadPost
+ :opts {:other_win_hl_color "#171717"
+ :fg_color "#E1E1E1"
+ :selection_chars :MNEIOARSTG}
+ :config (lambda [_ opts]
+ (let [window-picker (require :window-picker)]
+ (window-picker.setup opts)
+ (vim.keymap.set :n :<C-s>
+ (fn []
+ (pick-window)) {})))}
diff --git a/fnl/plugins/zen.fnl b/fnl/plugins/zen.fnl
new file mode 100644
index 0000000..6e9bee7
--- /dev/null
+++ b/fnl/plugins/zen.fnl
@@ -0,0 +1,11 @@
+;; Zen mode.
+
+{1 :folke/zen-mode.nvim
+ :cmd :ZenMode
+ :opts {:window {:backdrop 1
+ :height 1
+ :width 120
+ :options {:signcolumn :no :number false :relativenumber false}}
+ :plugins {:gitsigns {:enabled false}
+ :tmux {:enabled true}
+ :twilight {:enabled true}}}}