diff options
author | Toby Vincent <tobyv13@gmail.com> | 2023-01-15 18:31:56 -0600 |
---|---|---|
committer | Toby Vincent <tobyv13@gmail.com> | 2023-01-15 18:33:22 -0600 |
commit | 439257b774dffed1a2b69ddef5f09cd8b171a7df (patch) | |
tree | 6df30cf761d1ce44d116c10ffca76423d2aaeb52 | |
parent | c7022fa1eb1965c8209fd6a21576326846e89258 (diff) |
refactor(nvim,lsp): merge lsp setup and cleanup configs
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/lsp.lua | 53 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/lsp/configs.lua | 8 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/lsp/formatting.lua | 22 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/lsp/handlers.lua | 104 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/lsp/highlighting.lua | 26 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/plugins/rust-tools.lua | 29 |
6 files changed, 120 insertions, 122 deletions
diff --git a/nvim/.config/nvim/lua/tobyvin/lsp.lua b/nvim/.config/nvim/lua/tobyvin/lsp.lua index 58de09e..0c59368 100644 --- a/nvim/.config/nvim/lua/tobyvin/lsp.lua +++ b/nvim/.config/nvim/lua/tobyvin/lsp.lua @@ -1,12 +1,53 @@ -require("tobyvin.lsp.handlers") -require("tobyvin.lsp.highlighting") -require("tobyvin.lsp.formatting") +local augroup = vim.api.nvim_create_augroup("lsp", {}) + +for method, handler in pairs(require("tobyvin.lsp.handlers")) do + vim.lsp.handlers[method] = handler +end vim.api.nvim_create_autocmd("LspAttach", { - group = vim.api.nvim_create_augroup("tobyvin_lsp", { clear = true }), - desc = "lsp", + group = augroup, + desc = "setup lsp", callback = function(args) local client = vim.lsp.get_client_by_id(args.data.client_id) - vim.api.nvim_exec_autocmds("User", { pattern = "LspAttach", data = { client_id = client.id } }) + + if client.server_capabilities.definitionProvider then + vim.bo[args.buf].tagfunc = "v:lua.vim.lsp.tagfunc" + end + + if client.server_capabilities.documentFormattingProvider then + vim.api.nvim_buf_set_option(args.buf, "formatexpr", "v:lua.vim.lsp.formatexpr()") + end + + if client.server_capabilities.documentHighlightProvider then + vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, { + group = augroup, + buffer = args.buf, + callback = vim.lsp.buf.document_highlight, + desc = "document highlight", + }) + + vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, { + group = augroup, + buffer = args.buf, + callback = vim.lsp.buf.clear_references, + desc = "clear references", + }) + end + + vim.keymap.set("n", "<C-k>", vim.lsp.buf.signature_help, { desc = "signature help", buffer = args.buf }) + vim.keymap.set("n", "gd", vim.lsp.buf.definition, { desc = "definition", buffer = args.buf }) + vim.keymap.set("n", "gD", vim.lsp.buf.declaration, { desc = "declaration", buffer = args.buf }) + vim.keymap.set("n", "go", vim.lsp.buf.type_definition, { desc = "type definition", buffer = args.buf }) + vim.keymap.set("n", "gi", vim.lsp.buf.implementation, { desc = "implementation", buffer = args.buf }) + vim.keymap.set("n", "gr", vim.lsp.buf.references, { desc = "references", buffer = args.buf }) + + vim.keymap.set({ "n", "v" }, "<leader>lf", vim.lsp.buf.format, { desc = "format", buffer = args.buf }) + vim.keymap.set("n", "<leader>lr", vim.lsp.buf.rename, { desc = "rename", buffer = args.buf }) + vim.keymap.set("n", "<leader>la", vim.lsp.buf.code_action, { desc = "code action", buffer = args.buf }) + vim.keymap.set("n", "<leader>ll", vim.lsp.codelens.run, { desc = "codelens", buffer = args.buf }) + + local register_opts = { desc = "lsp", buffer = args.buf, priority = 1 } + require("tobyvin.utils.hover").register(vim.lsp.buf.hover, register_opts) + require("tobyvin.utils.documentation").register(vim.lsp.buf.external_docs, register_opts) end, }) diff --git a/nvim/.config/nvim/lua/tobyvin/lsp/configs.lua b/nvim/.config/nvim/lua/tobyvin/lsp/configs.lua index aabf84f..c58474d 100644 --- a/nvim/.config/nvim/lua/tobyvin/lsp/configs.lua +++ b/nvim/.config/nvim/lua/tobyvin/lsp/configs.lua @@ -48,6 +48,11 @@ M.rust_analyzer = { enable = false, }, }, + imports = { + granularity = { + enforce = true, + }, + }, }, }, } @@ -67,9 +72,6 @@ M.sumneko_lua = { format = { enable = false, }, - telemetry = { - enable = false, - }, }, }, } diff --git a/nvim/.config/nvim/lua/tobyvin/lsp/formatting.lua b/nvim/.config/nvim/lua/tobyvin/lsp/formatting.lua deleted file mode 100644 index 736de75..0000000 --- a/nvim/.config/nvim/lua/tobyvin/lsp/formatting.lua +++ /dev/null @@ -1,22 +0,0 @@ -vim.api.nvim_create_autocmd("LspAttach", { - group = vim.api.nvim_create_augroup("tobyvin_lsp_formatting", { clear = true }), - desc = "setup lsp formatting", - callback = function(args) - local bufnr = args.buf - local client = vim.lsp.get_client_by_id(args.data.client_id) - if client.name == "sumneko_lua" then - return - end - - if client.server_capabilities.documentFormattingProvider then - vim.api.nvim_buf_set_option(bufnr, "formatexpr", "v:lua.vim.lsp.formatexpr()") - vim.api.nvim_buf_create_user_command(bufnr, "Format", vim.lsp.buf.format, { nargs = "*" }) - vim.keymap.set("n", "<leader>lf", vim.lsp.buf.format, { desc = "format", buffer = bufnr }) - end - - if client.server_capabilities.documentRangeFormattingProvider then - vim.api.nvim_buf_create_user_command(bufnr, "FormatRange", vim.lsp.buf.format, { nargs = "*" }) - vim.keymap.set("n", "<leader>lf", vim.lsp.buf.format, { desc = "format range", buffer = bufnr }) - end - end, -}) diff --git a/nvim/.config/nvim/lua/tobyvin/lsp/handlers.lua b/nvim/.config/nvim/lua/tobyvin/lsp/handlers.lua index d71160a..e53c371 100644 --- a/nvim/.config/nvim/lua/tobyvin/lsp/handlers.lua +++ b/nvim/.config/nvim/lua/tobyvin/lsp/handlers.lua @@ -1,64 +1,68 @@ -local utils = require("tobyvin.utils") +local augroup = vim.api.nvim_create_augroup("lsp_workspace", {}) +local handlers = vim.lsp.handlers function vim.lsp.buf.external_docs() - ---@diagnostic disable-next-line: missing-parameter - local params = vim.lsp.util.make_position_params() + local params = vim.lsp.util.make_position_params(nil, "") return vim.lsp.buf_request(0, "experimental/externalDocs", params) end -local definition_handler = vim.lsp.handlers["textDocument/definition"] -vim.lsp.handlers["textDocument/definition"] = function(err, result, ctx, config) - if not result or vim.tbl_isempty(result) then - vim.notify("No location found", vim.log.levels.INFO, { title = "[LSP] " .. ctx.method }) - elseif vim.tbl_islist(result) then - result = result[1] - end +return { + ["textDocument/definition"] = function(err, result, ctx, config) + if not result or vim.tbl_isempty(result) then + vim.notify("No location found", vim.log.levels.INFO, { title = "[LSP] " .. ctx.method }) + elseif vim.tbl_islist(result) then + result = result[1] + end - return definition_handler(err, result, ctx, config) -end + local original = vim.lsp.buf.list_workspace_folders() -local external_docs_handler = vim.lsp.handlers["experimental/externalDocs"] -vim.lsp.handlers["experimental/externalDocs"] = function(err, result, ctx, config) - if external_docs_handler then - result, err = external_docs_handler(err, result, ctx, config) - elseif result then - vim.fn["netrw#BrowseX"](result, 0) - end -end + handlers["textDocument/definition"](err, result, ctx, config) ----@diagnostic disable-next-line: duplicate-set-field -vim.lsp.handlers["window/showMessage"] = function(_, result, ctx) - vim.notify(string.format("%s", result.message), 5 - result.type, { - title = string.format("[LSP] %s", vim.lsp.get_client_by_id(ctx.client_id)), - }) -end + local workspaces = vim.lsp.buf.list_workspace_folders() -local hover_ops = { border = "single" } -vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, hover_ops) -vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, hover_ops) + -- TODO: rework this to reload LSP and reset diagnostics, as it is not done + -- when removing the workspace folder. Possibly move into a LspRequest autocmd + if original ~= workspaces then + for _, workspace in ipairs(workspaces) do + if not vim.tbl_contains(original, workspace) then + vim.api.nvim_create_autocmd("BufDelete", { + group = augroup, + buffer = vim.api.nvim_get_current_buf(), + callback = function() + local autocmds = vim.api.nvim_get_autocmds({ group = augroup, event = "BufDelete" }) -vim.api.nvim_create_autocmd("LspAttach", { - group = vim.api.nvim_create_augroup("tobyvin_lsp_handlers", { clear = true }), - desc = "setup lsp handlers", - callback = function(args) - local bufnr = args.buf - local client = vim.lsp.get_client_by_id(args.data.client_id) - if client.server_capabilities["definitionProvider"] then - vim.bo[bufnr].tagfunc = "v:lua.vim.lsp.tagfunc" - end + if #autocmds <= 1 then + vim.lsp.buf.remove_workspace_folder(workspace) + end - utils.hover.register(vim.lsp.buf.hover, { desc = "lsp", buffer = bufnr, priority = 1 }) - utils.documentation.register(vim.lsp.buf.external_docs, { desc = "lsp", buffer = bufnr, priority = 1 }) + return true + end, + desc = "remove temporary workspace", + }) + end + end + end + end, - vim.keymap.set("n", "<C-k>", vim.lsp.buf.signature_help, { desc = "signature help", buffer = bufnr }) - vim.keymap.set("n", "gd", vim.lsp.buf.definition, { desc = "definition", buffer = bufnr }) - vim.keymap.set("n", "gD", vim.lsp.buf.declaration, { desc = "declaration", buffer = bufnr }) - vim.keymap.set("n", "go", vim.lsp.buf.type_definition, { desc = "type definition", buffer = bufnr }) - vim.keymap.set("n", "gi", vim.lsp.buf.implementation, { desc = "implementation", buffer = bufnr }) - vim.keymap.set("n", "gr", vim.lsp.buf.references, { desc = "references", buffer = bufnr }) + ["experimental/externalDocs"] = function(err, result, ctx, config) + if handlers["experimental/externalDocs"] then + result, err = handlers["experimental/externalDocs"](err, result, ctx, config) + elseif result then + vim.fn["netrw#BrowseX"](result, 0) + end + end, - vim.keymap.set("n", "<leader>lr", vim.lsp.buf.rename, { desc = "rename", buffer = bufnr }) - vim.keymap.set("n", "<leader>la", vim.lsp.buf.code_action, { desc = "code action", buffer = bufnr }) - vim.keymap.set("n", "<leader>ll", vim.lsp.codelens.run, { desc = "codelens", buffer = bufnr }) + ["window/showMessage"] = function(_, result, ctx) + vim.notify(string.format("%s", result.message), 5 - result.type, { + title = string.format("[LSP] %s", vim.lsp.get_client_by_id(ctx.client_id)), + }) end, -}) + + ["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, { + border = "single", + }), + + ["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, { + border = "single", + }), +} diff --git a/nvim/.config/nvim/lua/tobyvin/lsp/highlighting.lua b/nvim/.config/nvim/lua/tobyvin/lsp/highlighting.lua deleted file mode 100644 index 8073d62..0000000 --- a/nvim/.config/nvim/lua/tobyvin/lsp/highlighting.lua +++ /dev/null @@ -1,26 +0,0 @@ -vim.api.nvim_create_autocmd("LspAttach", { - group = vim.api.nvim_create_augroup("tobyvin_lsp_highlighting", { clear = true }), - desc = "setup lsp highlighting", - callback = function(args) - local bufnr = args.buf - local client = vim.lsp.get_client_by_id(args.data.client_id) - - if client.server_capabilities.documentHighlightProvider then - local augroup_highlight = vim.api.nvim_create_augroup("DocumentHighlight", { clear = false }) - - vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, { - group = augroup_highlight, - buffer = bufnr, - callback = vim.lsp.buf.document_highlight, - desc = "Highlight lsp references", - }) - - vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, { - group = augroup_highlight, - buffer = bufnr, - callback = vim.lsp.buf.clear_references, - desc = "Clear highlighted references", - }) - end - end, -}) diff --git a/nvim/.config/nvim/lua/tobyvin/plugins/rust-tools.lua b/nvim/.config/nvim/lua/tobyvin/plugins/rust-tools.lua index 66a56e2..b7eb84d 100644 --- a/nvim/.config/nvim/lua/tobyvin/plugins/rust-tools.lua +++ b/nvim/.config/nvim/lua/tobyvin/plugins/rust-tools.lua @@ -21,26 +21,25 @@ function M.init() require("tobyvin.lsp.configs").rust_analyzer = nil vim.api.nvim_create_autocmd("LspAttach", { - group = vim.api.nvim_create_augroup("tobyvin_rust-tools", { clear = true }), + group = vim.api.nvim_create_augroup("rust-tools", {}), desc = "setup rust-tools", callback = function(args) - local bufnr = args.buf - local client = vim.lsp.get_client_by_id(args.data.client_id) - if client.name ~= "rust_analyzer" then + if vim.lsp.get_client_by_id(args.data.client_id).name ~= "rust_analyzer" then return end - local runnables = require("rust-tools").runnables.runnables - local debuggables = require("rust-tools").debuggables.debuggables - local open_cargo_toml = require("rust-tools").open_cargo_toml.open_cargo_toml - local expand_macro = require("rust-tools").expand_macro.expand_macro - local ssr = require("rust-tools").ssr.ssr - - vim.keymap.set("n", "<leader>dd", debuggables, { desc = "debug", buffer = bufnr }) - vim.keymap.set("n", "<leader>tt", runnables, { desc = "test", buffer = bufnr }) - vim.keymap.set("n", "<leader>lo", open_cargo_toml, { desc = "open Cargo.toml", buffer = bufnr }) - vim.keymap.set("n", "<leader>le", expand_macro, { desc = "expand macro", buffer = bufnr }) - vim.keymap.set("n", "<leader>rs", ssr, { desc = "ssr", buffer = bufnr }) + vim.keymap.set("n", "<leader>dd", require("rust-tools").debuggables.debuggables, { + desc = "debug", + buffer = args.buf, + }) + vim.keymap.set("n", "<leader>tt", require("rust-tools").runnables.runnables, { + desc = "test", + buffer = args.buf, + }) + vim.keymap.set("n", "<leader>le", require("rust-tools").expand_macro.expand_macro, { + desc = "expand macro", + buffer = args.buf, + }) end, }) end |