Files
nvim-config/fnl/config/init.fnl

140 lines
4.7 KiB
Fennel

;; Main Fennel configuration
;; This file is compiled to lua/config/init.lua by nfnl
;; Options
(set vim.opt.number true)
(set vim.opt.relativenumber true)
(set vim.opt.tabstop 2)
(set vim.opt.shiftwidth 2)
(set vim.opt.expandtab true)
(set vim.opt.smartindent true)
(set vim.opt.wrap false)
(set vim.opt.ignorecase true)
(set vim.opt.smartcase true)
(set vim.opt.termguicolors true)
(set vim.opt.signcolumn "yes")
(set vim.opt.updatetime 250)
(set vim.opt.undofile true)
(set vim.opt.clipboard "unnamedplus")
;; Keymaps
(local keymap vim.keymap.set)
;; Window navigation
(keymap :n "<C-h>" "<C-w>h" {:desc "Move to left window"
:silent true})
(keymap :n "<C-j>" "<C-w>j" {:desc "Move to lower window"
:silent true})
(keymap :n "<C-k>" "<C-w>k" {:desc "Move to upper window"
:silent true})
(keymap :n "<C-l>" "<C-w>l" {:desc "Move to right window"
:silent true})
;; Buffer navigation
(keymap :n "<leader>bn" ":bnext<CR>" {:desc "Next buffer"})
(keymap :n "<leader>bp" ":bprevious<CR>" {:desc "Previous buffer"})
(keymap :n "<leader>bd" ":bdelete<CR>" {:desc "Delete buffer"})
;; Clear search highlight
(keymap :n "<Esc>" ":noh<CR>" {:desc "Clear search highlight"})
;; Better escape
(keymap :i "jk" "<Esc>" {:desc "Escape insert mode"})
;; Save file
(keymap :n "<leader>w" ":w<CR>" {:desc "Save file"})
(keymap :n "<leader>fs" ":wa<CR>" {:desc "Save all files" :silent true})
;; Quit
(keymap :n "<leader>q" ":q<CR>" {:desc "Quit"})
;; Autocommands
(local augroup vim.api.nvim_create_augroup)
(local autocmd vim.api.nvim_create_autocmd)
;; Highlight on yank
(let [yank-group (augroup "YankHighlight" {:clear true})]
(autocmd "TextYankPost" {:group yank-group
:callback (fn [] (vim.highlight.on_yank))}))
;; Remove trailing whitespace on save
(let [whitespace-group (augroup "TrimWhitespace" {:clear true})]
(autocmd "BufWritePre" {:group whitespace-group
:pattern "*"
:command "%s/\\s\\+$//e"}))
;; LSP Configuration (Neovim 0.11+ built-in)
;; Configure servers using vim.lsp.config
(vim.lsp.config :clojure_lsp
{:cmd [:clojure-lsp]
:filetypes [:clojure :edn]
:root_markers [:deps.edn :project.clj :build.boot :shadow-cljs.edn :.git]})
(vim.lsp.config :lua_ls
{:cmd [:lua-language-server]
:filetypes [:lua]
:root_markers [:.luarc.json :.luarc.jsonc :.git]
:settings {:Lua {:runtime {:version :LuaJIT}
:workspace {:library (vim.api.nvim_get_runtime_file "" true)}}}})
(vim.lsp.config :fennel_language_server
{:cmd [:fennel-language-server]
:filetypes [:fennel]
:root_markers [:.nfnl.fnl :fnl :.git]
:settings {:fennel {:workspace {:library (vim.api.nvim_get_runtime_file "" true)}
:diagnostics {:globals [:vim]}}}})
;; Enable the configured LSP servers
(vim.lsp.enable [:clojure_lsp :lua_ls :fennel_language_server])
;; LSP keymaps (set on attach)
(autocmd "LspAttach"
{:callback (fn [ev]
(local opts {:buffer ev.buf})
(keymap :n "gd" vim.lsp.buf.definition opts)
(keymap :n "gD" vim.lsp.buf.declaration opts)
(keymap :n "gr" vim.lsp.buf.references opts)
(keymap :n "gi" vim.lsp.buf.implementation opts)
(keymap :n "K" vim.lsp.buf.hover opts)
(keymap :n "<leader>rn" vim.lsp.buf.rename opts)
(keymap :n "<leader>ca" vim.lsp.buf.code_action opts)
(keymap :n "[d" (fn [] (vim.diagnostic.jump {:count -1})) opts)
(keymap :n "]d" (fn [] (vim.diagnostic.jump {:count 1})) opts)
(keymap :n "<leader>e" vim.diagnostic.open_float opts)
(keymap :n "<leader>F" vim.lsp.buf.format opts))})
;; LSP commands (lspconfig-style)
(local usercmd vim.api.nvim_create_user_command)
(usercmd "LspInfo"
(fn [] (vim.cmd "checkhealth vim.lsp"))
{:desc "Show LSP info"})
(usercmd "LspStart"
(fn [opts]
(if (and opts.args (> (length opts.args) 0))
(vim.lsp.enable opts.args)
(vim.lsp.enable [:clojure_lsp :lua_ls :fennel_language_server])))
{:nargs "?"
:complete (fn [] [:clojure_lsp :lua_ls :fennel_language_server])
:desc "Start LSP server"})
(usercmd "LspStop"
(fn []
(each [_ client (ipairs (vim.lsp.get_clients))]
(vim.lsp.stop_client client.id)))
{:desc "Stop all LSP clients"})
(usercmd "LspRestart"
(fn []
(each [_ client (ipairs (vim.lsp.get_clients))]
(vim.lsp.stop_client client.id))
(vim.defer_fn (fn [] (vim.cmd "edit")) 100))
{:desc "Restart LSP clients"})
(usercmd "LspLog"
(fn [] (vim.cmd (.. "edit " (vim.lsp.get_log_path))))
{:desc "Open LSP log file"})
{}