local telescope_mapper = require("alpha.telescope.mappings") local lsp_formatting = function(bufnr, allowed_clientes) vim.lsp.buf.format({ filter = function(client) for _, value in pairs(allowed_clientes) do if client.name == value then return true end end return false end, bufnr = bufnr, }) end -- if you want to set up formatting on save, you can use this as a callback local augroup = vim.api.nvim_create_augroup("LspFormatting", {}) local format_on_save = function (allowed_clients) return function(client, bufnr) if client.supports_method("textDocument/formatting") then vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr }) vim.api.nvim_create_autocmd("BufWritePre", { group = augroup, buffer = bufnr, callback = function() lsp_formatting(bufnr, allowed_clients) end, }) end end end local filetype_attach = setmetatable({ go = format_on_save({"gopls"}), -- php = format_on_save, -- lua = format_on_save, gdscript = function(_) end, }, { __index = function() return function() end end, }) -- Since I use null os this allows to have the format and actions -- in all buffers not just configured servers vim.keymap.set("n", "vca", vim.lsp.buf.code_action, {}) vim.keymap.set("n", "vf", function() return vim.lsp.buf.format({ async = true }) end, {}) local function on_attach(client, bufnr) local filetype = vim.api.nvim_buf_get_option(0, "filetype") -- keymaps for lsp vim.keymap.set("n", "K", vim.lsp.buf.hover, { buffer = 0 }) vim.keymap.set("n", "", vim.lsp.buf.definition, { buffer = 0 }) vim.keymap.set("n", "", function () vim.cmd("vsp") vim.lsp.buf.definition() end, { buffer = 0 }) vim.keymap.set("n", "vrn", vim.lsp.buf.rename, { buffer = 0 }) vim.keymap.set("n", "vn", vim.diagnostic.goto_next, { buffer = 0 }) vim.keymap.set("n", "vp", vim.diagnostic.goto_prev, { buffer = 0 }) vim.keymap.set("i", "", vim.lsp.buf.signature_help, { buffer = 0 }) vim.keymap.set("n", "vo", ":LspRestart", { noremap = true }) telescope_mapper("gr", "lsp_references", nil, true) telescope_mapper("pv", "find_symbol", nil, true) telescope_mapper("pd", "lsp_document_symbols", nil, true) vim.bo.omnifunc = "v:lua.vim.lsp.omnifunc" -- Attach any filetype specific options to the client filetype_attach[filetype](client,bufnr) end -- vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, { -- underline = true, -- update_in_insert = false, -- virtual_text = { spacing = 2, prefix = "●" }, -- severity_sort = true, -- }) vim.diagnostic.config({ virtual_text = false, }) local signs = { Error = "⛔", Warn = "âš ī¸", Hint = "💡", Info = "â„šī¸" } for type, icon in pairs(signs) do local hl = "DiagnosticSign" .. type vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" }) end -- Actual configs local lsp_flags = { debounce_text_changes = 150, } require("lspconfig")["rust_analyzer"].setup({ on_attach = on_attach, flags = lsp_flags, -- Server-specific settings... settings = { ["rust-analyzer"] = {}, }, }) require("lspconfig").dockerls.setup({ on_attach = on_attach, flags = lsp_flags, }) require("lspconfig")["intelephense"].setup({ on_attach = on_attach, flags = lsp_flags, }) require("lspconfig").jsonls.setup({ flags = lsp_flags, }) require("lspconfig").html.setup({ flags = lsp_flags, }) require("lspconfig").html.setup({ flags = lsp_flags, }) require("lspconfig").emmet_ls.setup({ flags = lsp_flags, }) require("lspconfig").gopls.setup({ on_attach = on_attach, flags = lsp_flags, }) require("lspconfig").gdscript.setup({ on_attach = on_attach, flags = lsp_flags, }) require("lspconfig").tsserver.setup({ on_attach = on_attach, flags = lsp_flags, }) require("lspconfig").volar.setup({ on_attach = on_attach, flags = lsp_flags, }) require("lspconfig")["sumneko_lua"].setup({ on_attach = on_attach, flags = lsp_flags, settings = { Lua = { runtime = { version = "LuaJIT", }, diagnostics = { globals = { "vim" }, }, workspace = { library = vim.api.nvim_get_runtime_file("", true), }, telemetry = { enable = false, }, }, }, })