aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/nvim
diff options
context:
space:
mode:
authorToby Vincent <tobyv13@gmail.com>2023-01-15 18:31:56 -0600
committerToby Vincent <tobyv13@gmail.com>2023-01-15 18:33:22 -0600
commit439257b774dffed1a2b69ddef5f09cd8b171a7df (patch)
tree6df30cf761d1ce44d116c10ffca76423d2aaeb52 /nvim
parentc7022fa1eb1965c8209fd6a21576326846e89258 (diff)
refactor(nvim,lsp): merge lsp setup and cleanup configs
Diffstat (limited to 'nvim')
-rw-r--r--nvim/.config/nvim/lua/tobyvin/lsp.lua53
-rw-r--r--nvim/.config/nvim/lua/tobyvin/lsp/configs.lua8
-rw-r--r--nvim/.config/nvim/lua/tobyvin/lsp/formatting.lua22
-rw-r--r--nvim/.config/nvim/lua/tobyvin/lsp/handlers.lua104
-rw-r--r--nvim/.config/nvim/lua/tobyvin/lsp/highlighting.lua26
-rw-r--r--nvim/.config/nvim/lua/tobyvin/plugins/rust-tools.lua29
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