require('vim.lsp.log').set_format_func(vim.inspect) -- vim.lsp.set_log_level("debug") require("config.lsp.pyright") require("config.lsp.ruff") -- require("config.lsp.pylsp") -- require("config.lsp.typescript") require("config.lsp.clangd") require("config.lsp.vls") require("config.lsp.lua_ls") require("config.lsp.rust_analyzer") local api = vim.api local keymap = vim.keymap.set local function keymappings(_, bufnr) local opts = { noremap = true, silent = true } keymap("n", "K", vim.lsp.buf.hover, { buffer = bufnr }) keymap("n", "[d", "lua vim.diagnostic.goto_prev()", opts) keymap("n", "]d", "lua vim.diagnostic.goto_next()", opts) keymap("n", "[e", "lua vim.diagnostic.goto_prev({severity = vim.diagnostic.severity.ERROR})", opts) keymap("n", "]e", "lua vim.diagnostic.goto_next({severity = vim.diagnostic.severity.ERROR})", opts) keymap("n", "gd", "lua vim.lsp.buf.definition()", opts) keymap("n", "gD", "lua vim.lsp.buf.declaration()", opts) keymap("n", "gh", "lua vim.lsp.buf.signature_help()", opts) keymap("n", "gI", "lua vim.lsp.buf.implementation()", opts) keymap("n", "gb", "lua vim.lsp.buf.type_definition()", opts) keymap("n", "ca", "lua vim.lsp.buf.code_action()", opts) keymap("n", "gl", "lua vim.diagnostic.reset()", opts) -- api.nvim_set_keymap("i", "", [[pumvisible() ? "\" : "\"]], { noremap = true, expr = true }) -- api.nvim_set_keymap("i", "", [[pumvisible() ? "\" : "\"]], { noremap = true, expr = true }) end local function highlighting(client, bufnr) if client.server_capabilities.documentHighlightProvider then local lsp_highlight_grp = api.nvim_create_augroup("LspDocumentHighlight", { clear = true }) api.nvim_create_autocmd("CursorHold", { callback = function() vim.schedule(vim.lsp.buf.document_highlight) end, group = lsp_highlight_grp, buffer = bufnr, }) api.nvim_create_autocmd("CursorMoved", { callback = function() vim.schedule(vim.lsp.buf.clear_references) end, group = lsp_highlight_grp, buffer = bufnr, }) end end local function lsp_handlers() local diagnostics = { Error = "E:", Warning = "W:", Hint = "", Information = "I:", Question = "Q:", } local signs = { { name = "DiagnosticSignError", text = diagnostics.Error }, { name = "DiagnosticSignWarn", text = diagnostics.Warning }, { name = "DiagnosticSignHint", text = diagnostics.Hint }, { name = "DiagnosticSignInfo", text = diagnostics.Info }, } for _, sign in ipairs(signs) do vim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = sign.name }) end -- LSP handlers configuration local config = { float = { focusable = true, style = "minimal", border = "rounded", }, diagnostic = { virtual_text = { severity = vim.diagnostic.severity.ERROR }, signs = { active = signs, }, underline = true, update_in_insert = false, severity_sort = true, float = { focusable = true, style = "minimal", border = "rounded", source = "always", header = "", prefix = "", }, }, } vim.diagnostic.config(config.diagnostic) vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, config.float) vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, config.float) end local function formatting(client, bufnr) if client.server_capabilities.documentFormattingProvider then local function format() local view = vim.fn.winsaveview() vim.lsp.buf.format({ async = true, filter = function(attached_client) return attached_client.name ~= "" end, }) vim.fn.winrestview(view) end local lsp_format_grp = api.nvim_create_augroup("LspFormat", { clear = true }) api.nvim_create_autocmd("BufWritePre", { callback = function() vim.schedule(format) end, group = lsp_format_grp, buffer = bufnr, }) end end local function on_attach(client, bufnr) if client.server_capabilities.completionProvider then vim.bo[bufnr].omnifunc = "v:lua.vim.lsp.omnifunc" vim.bo[bufnr].completefunc = "v:lua.vim.lsp.omnifunc" end if client.server_capabilities.definitionProvider then vim.bo[bufnr].tagfunc = "v:lua.vim.lsp.tagfunc" end if client.server_capabilities.documentFormattingProvider then vim.bo[bufnr].formatexpr = "v:lua.vim.lsp.formatexpr()" end keymappings(client, bufnr) --highlighting(client, bufnr) --formatting(client, bufnr) end lsp_handlers() vim.api.nvim_create_autocmd("LspAttach", { callback = function(args) local bufnr = args.buf local client = vim.lsp.get_client_by_id(args.data.client_id) on_attach(client, bufnr) end, })