diff --git a/lua/config/lsp.lua b/lua/config/lsp.lua index abc1016..42d263f 100644 --- a/lua/config/lsp.lua +++ b/lua/config/lsp.lua @@ -5,63 +5,77 @@ local lspconfig = require("lspconfig") local utils = require("utils") -local custom_attach = function(client, bufnr) - -- Mappings. - local map = function(mode, l, r, opts) - opts = opts or {} - opts.silent = true - opts.buffer = bufnr - keymap.set(mode, l, r, opts) - end +vim.api.nvim_create_autocmd("LspAttach", { + group = vim.api.nvim_create_augroup("buf_behavior_conf", { clear = true }), + callback = function(event_context) + local client = vim.lsp.get_client_by_id(event_context.data.client_id) + -- vim.print(client.name, client.server_capabilities) - map("n", "gd", vim.lsp.buf.definition, { desc = "go to definition" }) - map("n", "", vim.lsp.buf.definition) - map("n", "K", function() - vim.lsp.buf.hover { border = "single", max_height = 25, max_width = 120 } - end) - map("n", "", vim.lsp.buf.signature_help) - map("n", "rn", vim.lsp.buf.rename, { desc = "varialbe rename" }) - map("n", "ca", vim.lsp.buf.code_action, { desc = "LSP code action" }) - map("n", "wa", vim.lsp.buf.add_workspace_folder, { desc = "add workspace folder" }) - map("n", "wr", vim.lsp.buf.remove_workspace_folder, { desc = "remove workspace folder" }) - map("n", "wl", function() - vim.print(vim.lsp.buf.list_workspace_folders()) - end, { desc = "list workspace folder" }) + if not client then + return + end - -- Set some key bindings conditional on server capabilities - if client.server_capabilities.documentFormattingProvider and client.name ~= "lua_ls" then - map({ "n", "x" }, "f", vim.lsp.buf.format, { desc = "format code" }) - end + local bufnr = event_context.buf - -- Uncomment code below to enable inlay hint from language server, some LSP server supports inlay hint, - -- but disable this feature by default, so you may need to enable inlay hint in the LSP server config. - -- vim.lsp.inlay_hint.enable(true, {buffer=bufnr}) + -- Mappings. + local map = function(mode, l, r, opts) + opts = opts or {} + opts.silent = true + opts.buffer = bufnr + keymap.set(mode, l, r, opts) + end - -- The blow command will highlight the current variable and its usages in the buffer. - if client.server_capabilities.documentHighlightProvider then - local gid = api.nvim_create_augroup("lsp_document_highlight", { clear = true }) - api.nvim_create_autocmd("CursorHold", { - group = gid, - buffer = bufnr, - callback = function() - lsp.buf.document_highlight() - end, - }) + map("n", "gd", vim.lsp.buf.definition, { desc = "go to definition" }) + map("n", "", vim.lsp.buf.definition) + map("n", "K", function() + vim.lsp.buf.hover { border = "single", max_height = 25, max_width = 120 } + end) + map("n", "", vim.lsp.buf.signature_help) + map("n", "rn", vim.lsp.buf.rename, { desc = "varialbe rename" }) + map("n", "ca", vim.lsp.buf.code_action, { desc = "LSP code action" }) + map("n", "wa", vim.lsp.buf.add_workspace_folder, { desc = "add workspace folder" }) + map("n", "wr", vim.lsp.buf.remove_workspace_folder, { desc = "remove workspace folder" }) + map("n", "wl", function() + vim.print(vim.lsp.buf.list_workspace_folders()) + end, { desc = "list workspace folder" }) - api.nvim_create_autocmd("CursorMoved", { - group = gid, - buffer = bufnr, - callback = function() - lsp.buf.clear_references() - end, - }) - end + -- Set some key bindings conditional on server capabilities + if client.server_capabilities.documentFormattingProvider and client.name ~= "lua_ls" then + map({ "n", "x" }, "f", vim.lsp.buf.format, { desc = "format code" }) + end - if vim.g.logging_level == "debug" then - local msg = string.format("Language server %s started!", client.name) - vim.notify(msg, vim.log.levels.DEBUG, { title = "Nvim-config" }) - end -end + -- Disable ruff hover feature in favor of Pyright + if client.name == "ruff" then + client.server_capabilities.hoverProvider = false + end + + -- Uncomment code below to enable inlay hint from language server, some LSP server supports inlay hint, + -- but disable this feature by default, so you may need to enable inlay hint in the LSP server config. + -- vim.lsp.inlay_hint.enable(true, {buffer=bufnr}) + + -- The blow command will highlight the current variable and its usages in the buffer. + if client.server_capabilities.documentHighlightProvider then + local gid = api.nvim_create_augroup("lsp_document_highlight", { clear = true }) + api.nvim_create_autocmd("CursorHold", { + group = gid, + buffer = bufnr, + callback = function() + lsp.buf.document_highlight() + end, + }) + + api.nvim_create_autocmd("CursorMoved", { + group = gid, + buffer = bufnr, + callback = function() + lsp.buf.clear_references() + end, + }) + end + end, + nested = true, + desc = "Configure buffer keymap and behavior based on LSP", +}) local capabilities = vim.lsp.protocol.make_client_capabilities() @@ -96,7 +110,6 @@ if utils.executable("pyright") then lspconfig.pyright.setup { cmd = { "delance-langserver", "--stdio" }, - on_attach = custom_attach, capabilities = merged_capability, settings = { pyright = { @@ -131,7 +144,6 @@ end if utils.executable("ruff") then require("lspconfig").ruff.setup { - on_attach = custom_attach, capabilities = capabilities, init_options = { -- the settings can be found here: https://docs.astral.sh/ruff/editors/settings/ @@ -142,26 +154,8 @@ if utils.executable("ruff") then } end --- Disable ruff hover feature in favor of Pyright -vim.api.nvim_create_autocmd("LspAttach", { - group = vim.api.nvim_create_augroup("lsp_attach_disable_ruff_hover", { clear = true }), - callback = function(args) - local client = vim.lsp.get_client_by_id(args.data.client_id) - -- vim.print(client.name, client.server_capabilities) - - if client == nil then - return - end - if client.name == "ruff" then - client.server_capabilities.hoverProvider = false - end - end, - desc = "LSP: Disable hover capability from Ruff", -}) - if utils.executable("ltex-ls") then lspconfig.ltex.setup { - on_attach = custom_attach, cmd = { "ltex-ls" }, filetypes = { "text", "plaintex", "tex", "markdown" }, settings = { @@ -175,7 +169,6 @@ end if utils.executable("clangd") then lspconfig.clangd.setup { - on_attach = custom_attach, capabilities = capabilities, filetypes = { "c", "cpp", "cc" }, flags = { @@ -187,7 +180,6 @@ end -- set up vim-language-server if utils.executable("vim-language-server") then lspconfig.vimls.setup { - on_attach = custom_attach, flags = { debounce_text_changes = 500, }, @@ -200,7 +192,6 @@ end -- set up bash-language-server if utils.executable("bash-language-server") then lspconfig.bashls.setup { - on_attach = custom_attach, capabilities = capabilities, } end @@ -208,7 +199,6 @@ end -- settings for lua-language-server can be found on https://luals.github.io/wiki/settings/ if utils.executable("lua-language-server") then lspconfig.lua_ls.setup { - on_attach = custom_attach, settings = { Lua = { runtime = {