local augroup = vim.api.nvim_create_augroup("LspFormatting", {}) local on_attach = function(client, bufnr) local function nnoremap(key, command) vim.keymap.set("n", key, command, { noremap = true, silent = true, buffer = bufnr }) end local function format_buffer() vim.lsp.buf.format({ timeout_ms = 3000, async = false, filter = function(formatter) return formatter.name ~= "tsserver" and formatter.name ~= "volar" end }) end local telescope = require("telescope.builtin") nnoremap("gD", vim.lsp.buf.declaration) nnoremap("gd", telescope.lsp_definitions) nnoremap("gt", telescope.lsp_type_definitions) nnoremap("gi", telescope.lsp_implementations) nnoremap("gr", telescope.lsp_references) nnoremap("K", vim.lsp.buf.hover) nnoremap("rn", vim.lsp.buf.rename) nnoremap("ca", vim.lsp.buf.code_action) nnoremap("f", format_buffer) nnoremap("d", telescope.diagnostics) nnoremap("D", require("lsp_lines").toggle) nnoremap("", vim.diagnostic.goto_prev) nnoremap("", vim.diagnostic.goto_next) 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 = format_buffer, }) end local illuminate = require("illuminate") illuminate.on_attach(client) end local lsp_status = require("lsp-status") lsp_status.config({ current_function = false, show_filename = false, diagnostics = true, status_symbol = "", }) lsp_status.register_progress() -- setup lua language server for init.nvim and nvim plugin development require("neodev").setup({ override = function(root_dir, options) if require("neodev.util").has_file(root_dir, "/etc/nixos") then options.enabled = true options.plugins = true end end, }) local capabilities = require("cmp_nvim_lsp").default_capabilities(lsp_status.capabilities) local servers = { ["bashls"] = {}, ["clangd"] = {}, ["cmake"] = {}, ["dockerls"] = {}, ["jsonls"] = {}, ["lua_ls"] = { Lua = { runtime = { version = "LuaJIT", }, diagnostics = { globals = { "vim" }, }, workspace = { library = vim.api.nvim_get_runtime_file("", true), }, telemetry = { enable = false, }, }, }, ["pylsp"] = { pylsp = { plugins = { pycodestyle = { maxLineLength = 120 } } } }, ["pyright"] = {}, ["rnix"] = {}, ["terraformls"] = {}, ["tflint"] = {}, ["tsserver"] = {}, ["yamlls"] = { yaml = { keyOrdering = false } }, } local lspconfig = require("lspconfig") for lsp, settings in pairs(servers) do lspconfig[lsp].setup({ settings = settings, on_attach = on_attach, capabilities = capabilities, }) end -- setup rust tools local codelldb_base_path = vim.env.HOME .. "/.vscode-extensions/vscode-lldb/share/vscode/extensions/vadimcn.vscode-lldb/" local codelldb_bin_path = codelldb_base_path .. 'adapter/codelldb' local codelldb_lib_path = codelldb_base_path .. 'lldb/lib/liblldb.so' require("rust-tools").setup({ server = { on_attach = on_attach, settings = { ["rust-analyzer"] = { cargo = { loadOutDirsFromCheck = true, }, checkOnSave = { command = "clippy" }, procMacro = { enable = true, }, }, }, capabilities = capabilities, }, dap = { adapter = require("rust-tools.dap").get_codelldb_adapter(codelldb_bin_path, codelldb_lib_path) }, }) -- setup null-ls for markdown formatting local null_ls = require("null-ls") null_ls.setup({ sources = { null_ls.builtins.formatting.prettier, null_ls.builtins.code_actions.eslint_d, null_ls.builtins.diagnostics.eslint_d, null_ls.builtins.diagnostics.tsc, }, on_attach = on_attach, }) -- setup lsp_lines require("lsp_lines").setup() -- setup vim diagnostics vim.diagnostic.config({ virtual_text = false, signs = true, update_in_insert = true, underline = true, severity_sort = true, float = { border = "rounded", source = "always", header = "", prefix = "", }, }) -- setup diagnostics signs local diagnostics_signs = { Error = "", Warn = "", Hint = "", Info = "" } for type, icon in pairs(diagnostics_signs) do local hl = "DiagnosticSign" .. type vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = hl }) end -- setup html languageserver lspconfig["html"].setup({ cmd = { "html-languageserver", "--stdio" }, on_attach = on_attach, capabilities = capabilities, }) -- setup volar lspconfig["volar"].setup({ cmd = { "./node_modules/.bin/vue-language-server", "--stdio" }, filetypes = { 'typescript', 'javascript', 'javascriptreact', 'typescriptreact', 'vue', 'json' }, on_attach = on_attach, capabilities = capabilities, })