From 170c4bc3b45ddaf581f6a1bb6142de9be6fafa35 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 7 May 2026 21:07:39 -0400 Subject: [PATCH] fix LSPs, add c# support --- CLAUDE.md | 2 +- fnl/config/init.fnl | 32 ++++++++++++++++++++++++-------- fnl/plugins/init.fnl | 24 +++++++++++++++++------- lazy-lock.json | 21 +++++++++++---------- lua/bootstrap.lua | 12 +++++++++--- 5 files changed, 62 insertions(+), 29 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 7ce3794..286acf5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -54,7 +54,7 @@ Mason auto-installs: clojure-lsp, clj-kondo, fennel-ls, lua-language-server Uses Neovim 0.11+ built-in LSP (`vim.lsp.config` / `vim.lsp.enable`), NOT nvim-lspconfig: - **clojure_lsp** - .clj/.edn files - **lua_ls** - .lua files -- **fennel_language_server** - .fnl files +- **fennel_ls** - .fnl files ## Leader Keys diff --git a/fnl/config/init.fnl b/fnl/config/init.fnl index 1acfc7c..342b24d 100644 --- a/fnl/config/init.fnl +++ b/fnl/config/init.fnl @@ -80,15 +80,31 @@ :settings {:Lua {:runtime {:version :LuaJIT} :workspace {:library (vim.api.nvim_get_runtime_file "" true)}}}}) -(vim.lsp.config :fennel_language_server - {:cmd [:fennel-language-server] +(vim.lsp.config :fennel_ls + {:cmd [:fennel-ls] :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]) +;; rust-analyzer: prefer nightly toolchain (version-matched to proc-macro server), +;; then PATH, then Mason +(local rust-analyzer-bin + (let [nightly-ra (.. (vim.fn.expand "~") "/.rustup/toolchains/nightly-aarch64-apple-darwin/bin/rust-analyzer")] + (if (= (vim.fn.executable nightly-ra) 1) + nightly-ra + (= (vim.fn.executable "rust-analyzer") 1) + "rust-analyzer" + (.. (vim.fn.stdpath "data") "/mason/bin/rust-analyzer")))) + +(vim.lsp.config :rust_analyzer + {:cmd [rust-analyzer-bin] + :filetypes [:rust] + :root_markers [:Cargo.toml :Cargo.lock :.git] + :settings {:rust-analyzer {:checkOnSave {:command "clippy"}}}}) + +;; Enable the configured LSP servers (roslyn handled by roslyn.nvim plugin) +(vim.lsp.enable [:clojure_lsp :lua_ls :fennel_ls :rust_analyzer]) ;; LSP keymaps (set on attach) (autocmd "LspAttach" @@ -107,8 +123,8 @@ opts) (keymap :n "rn" vim.lsp.buf.rename opts) (keymap :n "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 "[d" (fn [] (vim.diagnostic.jump {:count -1 :float true})) opts) + (keymap :n "]d" (fn [] (vim.diagnostic.jump {:count 1 :float true})) opts) (keymap :n "e" vim.diagnostic.open_float opts) (keymap :n "F" vim.lsp.buf.format opts))}) @@ -123,9 +139,9 @@ (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]))) + (vim.lsp.enable [:clojure_lsp :lua_ls :fennel_ls :rust_analyzer]))) {:nargs "?" - :complete (fn [] [:clojure_lsp :lua_ls :fennel_language_server]) + :complete (fn [] [:clojure_lsp :lua_ls :fennel_ls :rust_analyzer]) :desc "Start LSP server"}) (usercmd "LspStop" diff --git a/fnl/plugins/init.fnl b/fnl/plugins/init.fnl index 071a713..359fa8f 100644 --- a/fnl/plugins/init.fnl +++ b/fnl/plugins/init.fnl @@ -105,13 +105,15 @@ {repo "williamboman/mason.nvim" :lazy false :build ":MasonUpdate" - :opts {:ui {:border "rounded"}}} + :opts {:ui {:border "rounded"} + :registries ["github:mason-org/mason-registry" + "github:Crashdummyy/mason-registry"]}} ;; Auto-install LSP servers and tools via Mason {repo "WhoIsSethDaniel/mason-tool-installer.nvim" :lazy false :dependencies ["williamboman/mason.nvim"] - :opts {:ensure_installed ["clojure-lsp" "clj-kondo" "fennel-language-server" "lua-language-server"]}} + :opts {:ensure_installed ["clojure-lsp" "clj-kondo" "fennel-ls" "lua-language-server" "rust-analyzer" "roslyn"]}} ;; Hop - EasyMotion-like word jumping {repo "smoka7/hop.nvim" @@ -184,15 +186,23 @@ :opts {:keymap {:preset "super-tab" "" [(fn [cmp] (cmp.show {:providers ["supermaven"]})) :fallback] "" [:select_and_accept :snippet_forward :fallback] - "" [:select_and_accept :fallback]} - :completion {:trigger {:show_on_keyword false - :show_on_trigger_character false} - :list {:selection {:preselect true :auto_insert false}} + "" [:select_and_accept :fallback] + "" [:cancel :fallback]} + :completion {:list {:selection {:preselect true :auto_insert false}} :documentation {:auto_show true}} - :sources {:default ["lsp" "supermaven" "path" "buffer"] + :sources {:default ["lsp" "path" "buffer"] :providers {:supermaven {:name "Supermaven" :module "supermaven-blink"}}}}} + ;; roslyn.nvim - C# and Blazor/Razor LSP via Roslyn language server + ;; Must not be ft-gated: plugin/roslyn.lua calls vim.lsp.enable which needs to + ;; run before the FileType event fires, or existing .cs buffers won't attach. + {repo "seblj/roslyn.nvim" + :lazy false + :config (fn [] + (let [roslyn (require :roslyn)] + (roslyn.setup {})))} + ;; gitsigns.nvim - Git diff signs in the sign column {repo "lewis6991/gitsigns.nvim" :event ["BufReadPre" "BufNewFile"] diff --git a/lazy-lock.json b/lazy-lock.json index ea8d93b..e0356c1 100644 --- a/lazy-lock.json +++ b/lazy-lock.json @@ -1,22 +1,23 @@ { - "blink.cmp": { "branch": "main", "commit": "4b18c32adef2898f95cdef6192cbd5796c1a332d" }, + "blink.cmp": { "branch": "main", "commit": "78336bc89ee5365633bcf754d93df01678b5c08f" }, "claudecode.nvim": { "branch": "main", "commit": "102d835c964069c9c5e37abaf05ae4f9c3ee6f00" }, - "conjure": { "branch": "main", "commit": "403639610bcb9b6a5dfc494dc3179cc19773a471" }, - "gitsigns.nvim": { "branch": "main", "commit": "7c4faa3540d0781a28588cafbd4dd187a28ac6e3" }, + "conjure": { "branch": "main", "commit": "2ddd752d43b35d72aa3e339c3ae051b8dbad8549" }, + "gitsigns.nvim": { "branch": "main", "commit": "dd3f588bacbeb041be6facf1742e42097f62165d" }, "hop.nvim": { "branch": "master", "commit": "08ddca799089ab96a6d1763db0b8adc5320bf050" }, "lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" }, "mason-tool-installer.nvim": { "branch": "main", "commit": "443f1ef8b5e6bf47045cb2217b6f748a223cf7dc" }, - "mason.nvim": { "branch": "main", "commit": "44d1e90e1f66e077268191e3ee9d2ac97cc18e65" }, - "nfnl": { "branch": "main", "commit": "fecf731e02bc51d88372c4f992fe1ef0c19c02ae" }, + "mason.nvim": { "branch": "main", "commit": "e54f5bf5f12c560da31c17eee5b3e1bd369f3ff9" }, + "nfnl": { "branch": "main", "commit": "ac0177c5549df7abba7a19554c18a7765386c894" }, "nvim-parinfer": { "branch": "master", "commit": "3968e669d9f02589aa311d33cb475b16b27c5fbb" }, - "nvim-treesitter": { "branch": "main", "commit": "f8bbc3177d929dc86e272c41cc15219f0a7aa1ac" }, - "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, + "nvim-treesitter": { "branch": "main", "commit": "4916d6592ede8c07973490d9322f187e07dfefac" }, + "plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" }, + "roslyn.nvim": { "branch": "main", "commit": "b62d1a588765f0aa1b46ed260252c9e456408835" }, "snacks.nvim": { "branch": "main", "commit": "ad9ede6a9cddf16cedbd31b8932d6dcdee9b716e" }, "supermaven-nvim": { "branch": "main", "commit": "07d20fce48a5629686aefb0a7cd4b25e33947d50" }, - "telescope.nvim": { "branch": "master", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" }, - "tokyonight.nvim": { "branch": "main", "commit": "5da1b76e64daf4c5d410f06bcb6b9cb640da7dfd" }, + "telescope.nvim": { "branch": "master", "commit": "f04ab730b8f9c6bf3f54a206d0dcddfd70c52d59" }, + "tokyonight.nvim": { "branch": "main", "commit": "cdc07ac78467a233fd62c493de29a17e0cf2b2b6" }, "vim-repeat": { "branch": "master", "commit": "65846025c15494983dafe5e3b46c8f88ab2e9635" }, - "vim-sexp": { "branch": "master", "commit": "2fc0a7c7e44fe94e48156d6a5b5fea28538430eb" }, + "vim-sexp": { "branch": "master", "commit": "c6e7180781c5603f5ea0e2305adb0c117e4f8284" }, "vim-sexp-mappings-for-regular-people": { "branch": "master", "commit": "4debb74b0a3e530f1b18e5b7dff98a40b2ad26f1" }, "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" } } diff --git a/lua/bootstrap.lua b/lua/bootstrap.lua index 8a5e575..fd9a0c2 100644 --- a/lua/bootstrap.lua +++ b/lua/bootstrap.lua @@ -19,7 +19,7 @@ return { branch = "main", build = ":TSUpdate", config = function() - local langs = { "clojure", "fennel", "lua", "vim", "vimdoc", "query" } + local langs = { "clojure", "fennel", "lua", "vim", "vimdoc", "query", "c_sharp", "html" } -- Install parsers asynchronously on first load vim.schedule(function() @@ -32,16 +32,22 @@ return { -- Enable treesitter highlighting for supported filetypes -- This is required for nvim-paredit to work (needs vim.treesitter.get_node()) vim.api.nvim_create_autocmd("FileType", { - pattern = { "clojure", "fennel", "lua", "vim", "query", "scheme", "lisp" }, + pattern = { "clojure", "fennel", "lua", "vim", "query", "scheme", "lisp", "cs", "razor", "html" }, callback = function() pcall(vim.treesitter.start) end, }) + + -- Filetype detection for Blazor/Razor files + vim.filetype.add({ extension = { razor = "razor" } }) + + -- Use html parser for razor files (no razor parser exists; LSP covers C# parts) + vim.treesitter.language.register("html", "razor") end, }, { "nvim-telescope/telescope.nvim", - tag = "0.1.8", + branch = "master", dependencies = { "nvim-lua/plenary.nvim" }, keys = { { "ff", "Telescope find_files", desc = "Find files" },