From d7d2adcf13282cfc7e9609cebba2809a0bcc0349 Mon Sep 17 00:00:00 2001 From: Ward Truyen Date: Mon, 20 Apr 2026 21:13:57 +0200 Subject: [PATCH] fix: lsp rename twice or more if multiple lsp's are active --- lua/ward/plugins/lsp-config.lua | 272 +++++++++++++++++--------------- 1 file changed, 141 insertions(+), 131 deletions(-) diff --git a/lua/ward/plugins/lsp-config.lua b/lua/ward/plugins/lsp-config.lua index c18bfd7..ca2cd2b 100644 --- a/lua/ward/plugins/lsp-config.lua +++ b/lua/ward/plugins/lsp-config.lua @@ -2,160 +2,170 @@ -- NOTE: this adds a Language Server Provider for source files like C++, Java/-Script, etc. -- It will check the code for errors, warnings, variables and structures and give suggestions. return { - "neovim/nvim-lspconfig", - version = "*", - config = function() - -- local lspconfig = require("lspconfig") + "neovim/nvim-lspconfig", + version = "*", + config = function() + -- local lspconfig = require("lspconfig") - vim.cmd([[autocmd! ColorScheme * highlight NormalFloat guibg=#1f2335]]) - vim.cmd([[autocmd! ColorScheme * highlight FloatBorder guifg=white guibg=#1f2335]]) + vim.cmd([[autocmd! ColorScheme * highlight NormalFloat guibg=#1f2335]]) + vim.cmd([[autocmd! ColorScheme * highlight FloatBorder guifg=white guibg=#1f2335]]) - -- Beautiful borders around LSP stuff like hover/signature_help - local border = { - { "┌", "FloatBorder" }, - { "─", "FloatBorder" }, - { "┐", "FloatBorder" }, - { "│", "FloatBorder" }, - { "┘", "FloatBorder" }, - { "─", "FloatBorder" }, - { "└", "FloatBorder" }, - { "│", "FloatBorder" }, - } + -- Beautiful borders around LSP stuff like hover/signature_help + local border = { + { "┌", "FloatBorder" }, + { "─", "FloatBorder" }, + { "┐", "FloatBorder" }, + { "│", "FloatBorder" }, + { "┘", "FloatBorder" }, + { "─", "FloatBorder" }, + { "└", "FloatBorder" }, + { "│", "FloatBorder" }, + } - -- lspconfig.clangd.setup({ - vim.lsp.config("clangd",{ - keys = { - { "pc", "ClangdSwitchSourceHeader", desc = "Switch Source/Header (C/C++)" }, - }, - cmd = { - "clangd", - "--offset-encoding=utf-16", - "--background-index", - "--clang-tidy", - "--header-insertion=iwyu", - "--completion-style=detailed", - "--function-arg-placeholders", - "-j4", - "--fallback-style=llvm", - }, - filetypes = { "c", "cpp", "objc", "objcpp", "cuda", "proto", "hpp", "h" }, - -- init_options = { - -- fallbackFlags = { '-std=c17' }, - -- }, - }) + -- lspconfig.clangd.setup({ + vim.lsp.config("clangd", { + keys = { + { "pc", "ClangdSwitchSourceHeader", desc = "Switch Source/Header (C/C++)" }, + }, + cmd = { + "clangd", + "--offset-encoding=utf-16", + "--background-index", + "--clang-tidy", + "--header-insertion=iwyu", + "--completion-style=detailed", + "--function-arg-placeholders", + "-j4", + "--fallback-style=llvm", + }, + filetypes = { "c", "cpp", "objc", "objcpp", "cuda", "proto", "hpp", "h" }, + -- init_options = { + -- fallbackFlags = { '-std=c17' }, + -- }, + }) - -- lspconfig.glsl_analyzer.setup({ - vim.lsp.config("glsl_analyzer",{ - filetypes = { "glsl", "vert", "tese", "frag", "geom", "comp", "vs", "fs" }, - }) + -- lspconfig.glsl_analyzer.setup({ + vim.lsp.config("glsl_analyzer", { + filetypes = { "glsl", "vert", "tese", "frag", "geom", "comp", "vs", "fs" }, + }) - -- diagnostics border - local orig_util_open_floating_preview = vim.lsp.util.open_floating_preview - function vim.lsp.util.open_floating_preview(contents, syntax, opts, ...) - -- I would love to retrieve the severity level just here in order to modify opts.border - opts = opts or {} - opts.border = opts.border or border - return orig_util_open_floating_preview(contents, syntax, opts, ...) - end + -- diagnostics border + local orig_util_open_floating_preview = vim.lsp.util.open_floating_preview + function vim.lsp.util.open_floating_preview(contents, syntax, opts, ...) + -- I would love to retrieve the severity level just here in order to modify opts.border + opts = opts or {} + opts.border = opts.border or border + return orig_util_open_floating_preview(contents, syntax, opts, ...) + end - -- adding filetypes to get glsl things - vim.filetype.add({ - extension = { - vert = "glsl", - tesc = "glsl", - tese = "glsl", - frag = "glsl", - geom = "glsl", - comp = "glsl", - vs = "glsl", - fs = "glsl", - }, - }) + -- adding filetypes to get glsl things + vim.filetype.add({ + extension = { + vert = "glsl", + tesc = "glsl", + tese = "glsl", + frag = "glsl", + geom = "glsl", + comp = "glsl", + vs = "glsl", + fs = "glsl", + }, + }) - -- lspconfig.rust_analyzer.setup({ - vim.lsp.config("rust_analyzer",{ - settings = { - ["rust-analyzer"] = {}, - }, - }) + -- lspconfig.rust_analyzer.setup({ + vim.lsp.config("rust_analyzer", { + settings = { + ["rust-analyzer"] = {}, + }, + }) - -- These lsp keybinds only load when an LSP is attatched to the buffer. - vim.api.nvim_create_autocmd("LspAttach", { - group = vim.api.nvim_create_augroup("UserLspConfig", {}), - callback = function(event) - -- Enable completion triggered by - vim.bo[event.buf].omnifunc = "v:lua.vim.lsp.omnifunc" + -- These lsp keybinds only load when an LSP is attatched to the buffer. + vim.api.nvim_create_autocmd("LspAttach", { + group = vim.api.nvim_create_augroup("UserLspConfig", {}), + callback = function(event) + -- Enable completion triggered by + vim.bo[event.buf].omnifunc = "v:lua.vim.lsp.omnifunc" - local map = function(keys, func, desc) - vim.keymap.set("n", keys, func, { buffer = event.buf, desc = "LSP: " .. desc }) - end + local map = function(keys, func, desc) + vim.keymap.set("n", keys, func, { buffer = event.buf, desc = "LSP: " .. desc }) + end - -- Jump to the definition of the word under your cursor. - -- This is where a variable was first declared, or where a function is defined, etc. - -- To jump back, press . - map("gd", require("telescope.builtin").lsp_definitions, "[G]oto [D]efinition") + -- Jump to the definition of the word under your cursor. + -- This is where a variable was first declared, or where a function is defined, etc. + -- To jump back, press . + map("gd", require("telescope.builtin").lsp_definitions, "[G]oto [D]efinition") - -- WARN: This is not Goto Definition, this is Goto Declaration. - -- For example, in C this would take you to the header. - map("gD", vim.lsp.buf.declaration, "[G]oto [D]eclaration") + -- WARN: This is not Goto Definition, this is Goto Declaration. + -- For example, in C this would take you to the header. + map("gD", vim.lsp.buf.declaration, "[G]oto [D]eclaration") + -- Find references for the word under your cursor. + map("gr", require("telescope.builtin").lsp_references, "[G]oto [R]eferences") - -- Find references for the word under your cursor. - map("gr", require("telescope.builtin").lsp_references, "[G]oto [R]eferences") + -- Jump to the implementation of the word under your cursor. + -- Useful when your language has ways of declaring types without an actual implementation. + map("gI", require("telescope.builtin").lsp_implementations, "[G]oto [I]mplementation") - -- Jump to the implementation of the word under your cursor. - -- Useful when your language has ways of declaring types without an actual implementation. - map("gI", require("telescope.builtin").lsp_implementations, "[G]oto [I]mplementation") + -- Jump to the type of the word under your cursor. + -- Useful when you're not sure what type a variable is and you want to see + -- the definition of its *type*, not where it was *defined*. + map("ld", require("telescope.builtin").lsp_type_definitions, "Type [D]efinition") - -- Jump to the type of the word under your cursor. - -- Useful when you're not sure what type a variable is and you want to see - -- the definition of its *type*, not where it was *defined*. - map("ld", require("telescope.builtin").lsp_type_definitions, "Type [D]efinition") + -- Jump to the type of the word under your cursor. + -- Useful when you're not sure what type a variable is and you want to see + -- the definition of its *type*, not where it was *defined*. + map("lD", vim.lsp.buf.declaration, "Go to [D]eclaration") - -- Jump to the type of the word under your cursor. - -- Useful when you're not sure what type a variable is and you want to see - -- the definition of its *type*, not where it was *defined*. - map("lD", vim.lsp.buf.declaration, "Go to [D]eclaration") + -- Fuzzy find all the symbols in your current document. + -- Symbols are things like variables, functions, types, etc. + map("ls", require("telescope.builtin").lsp_document_symbols, "document [S]ymbols") - -- Fuzzy find all the symbols in your current document. - -- Symbols are things like variables, functions, types, etc. - map("ls", require("telescope.builtin").lsp_document_symbols, "document [S]ymbols") + -- Format file + map("lf", vim.lsp.buf.format, "[F]ormat") - -- Format file - map("lf", vim.lsp.buf.format, "[F]ormat") + -- Fuzzy find all the symbols in your current workspace. + -- Similar to document symbols, except searches over your entire project. + map("lw", require("telescope.builtin").lsp_dynamic_workspace_symbols, "[W]orkspace symbols") + map("li", vim.cmd.LspInfo, "Show lsp info") + map("lp", vim.diagnostic.goto_prev, "Go to [P]revious diagnostic message") - -- Fuzzy find all the symbols in your current workspace. - -- Similar to document symbols, except searches over your entire project. - map( - "lw", - require("telescope.builtin").lsp_dynamic_workspace_symbols, - "[W]orkspace symbols" - ) - map("li", vim.cmd.LspInfo, "Show lsp info") - map("lp", vim.diagnostic.goto_prev, "Go to [P]revious diagnostic message") + map("ln", vim.diagnostic.goto_next, "Go to [N]ext diagnostic message") - map("ln", vim.diagnostic.goto_next, "Go to [N]ext diagnostic message") + map("le", vim.diagnostic.open_float, "Show diagnostic [E]rror messages") + vim.diagnostic.config({ virtual_text = false }) - map("le", vim.diagnostic.open_float, "Show diagnostic [E]rror messages") - vim.diagnostic.config({ virtual_text = false }) + map("lq", vim.diagnostic.setloclist, "Open diagnostic [Q]uickfix list") - map("lq", vim.diagnostic.setloclist, "Open diagnostic [Q]uickfix list") + -- Rename the variable under your cursor. + local function rename() + local clients = vim.lsp.get_clients({ bufnr = 0, method = "textDocument/rename" }) + if #clients > 0 then + local targetClient = clients[1] -- Use the first client .. or angularls if available + for _, client in ipairs(clients) do + if client.name == "angularls" then + targetClient = client + break + end + end + vim.lsp.buf.rename(nil, { name = targetClient.name }) + else + print("No LSP attached supports renaming") + end + end + --Most Language Servers support renaming across files, etc. + map("lr", rename, "[R]ename") - -- Rename the variable under your cursor. - -- Most Language Servers support renaming across files, etc. - map("lr", vim.lsp.buf.rename, "[R]ename") + -- Execute a code action, usually your cursor needs to be on top of an error + -- or a suggestion from your LSP for this to activate. + map("la", vim.lsp.buf.code_action, "code [A]ction") - -- Execute a code action, usually your cursor needs to be on top of an error - -- or a suggestion from your LSP for this to activate. - map("la", vim.lsp.buf.code_action, "code [A]ction") + -- Opens a popup that displays documentation about the word under your cursor + -- See `:help K` for why this keymap. - -- Opens a popup that displays documentation about the word under your cursor - -- See `:help K` for why this keymap. - - map("th", function() - vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled({ bufnr = event.buf })) - end, "[T]oggle Inlay [H]ints") - end, - }) - end, + map("th", function() + vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled({ bufnr = event.buf })) + end, "[T]oggle Inlay [H]ints") + end, + }) + end, }