local function keymap(args) -- get client local bufnr = args.buf local client = vim.lsp.get_client_by_id(args.data.client_id) if not client then return end -- loading workspace diagnostics require('workspace-diagnostics').populate_workspace_diagnostics(client, bufnr) -- Enable completion triggered by vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') -- Mappings. -- See `:help vim.lsp.*` for documentation on any of the below functions local bufopts = { noremap = true, silent = true, buffer = bufnr } vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts) vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts) vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts) vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts) vim.keymap.set('n', '', vim.lsp.buf.signature_help, bufopts) vim.keymap.set('n', '', function() vim.diagnostic.open_float({ focusable = false, border = "rounded" }) end, bufopts) vim.keymap.set('n', 'wa', vim.lsp.buf.add_workspace_folder, bufopts) vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, bufopts) vim.keymap.set('n', 'wl', function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, bufopts) vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, bufopts) vim.keymap.set('n', 'ca', vim.lsp.buf.code_action, bufopts) vim.keymap.set('n', 'rn', vim.lsp.buf.rename, bufopts) -- autoformat if client.supports_method('textDocument/formatting') then vim.api.nvim_create_autocmd('BufWritePre', { group = vim.api.nvim_create_augroup('LspFormatting', { clear = true }), buffer = args.buf, callback = function() if vim.fn.exists(":LspEslintFixAll") == 1 then vim.cmd(":LspEslintFixAll") else vim.lsp.buf.format { bufnr = args.buf, id = client.id } end end }) end -- vim.lsp.inlay_hint.enable(true, { bufnr }) end local function diagnostic_icons() 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 = hl }) end end local function configToHandler(server, config) return function() require("lspconfig")[server].setup(config) end end local function lsp_setup() local lspconfig = require("lspconfig") -- adding edge cases for workspace diagnostics require('workspace-diagnostics').setup { workspace_files = function() local gitPath = vim.fn.systemlist("git rev-parse --show-toplevel")[1] local workspace_files = vim.fn.split(vim.fn.system("git ls-files " .. gitPath), "\n") -- this makes nuxt laod the nuxt typescript definition table.insert(workspace_files, '.nuxt/nuxt.d.ts') return workspace_files end } vim.api.nvim_create_autocmd("LspAttach", { desc = "LSP actions", callback = keymap }) local capabilities = require("cmp_nvim_lsp").default_capabilities() local with_defaults = function(config) config.capabilities = capabilities return config end require('mason').setup({}) require('mason-lspconfig').setup { ensure_installed = {} } vim.lsp.enable({ 'vue_ls', 'nil_ls', 'nixd', 'rust_analyzer', 'lua_ls', 'gdscript', 'jsonls', 'r_language_server', 'tailwindcss', 'html', 'taplo', 'protols', 'yamlls', 'clangd', 'eslint', 'nushell', 'tinymist' -- 'jdtls' }) -- not collision between deno lsp and ts lsp if require("lib.lsp").has_file("deno.json") then vim.lsp.enable("denols") else vim.lsp.enable("vtsls") -- vim.lsp.enable("ts_ls") this is disabled vtsls for vue required end vim.lsp.config('*', with_defaults({})) vim.lsp.config('vue_ls', with_defaults(require("plugins.spec.server_configurations.vue"))) vim.lsp.config('nil_ls', with_defaults(require("plugins.spec.server_configurations.nix")['nil'])) vim.lsp.config('nixd', with_defaults(require("plugins.spec.server_configurations.nix")['nixd'])) vim.lsp.config('rust_analyzer', with_defaults(require("plugins.spec.server_configurations.rust"))) vim.lsp.config('lua_ls', with_defaults(require("plugins.spec.server_configurations.lua"))) vim.lsp.config('gdscript', with_defaults(require("plugins.spec.server_configurations.gdscript"))) vim.lsp.config('ts_ls', with_defaults(require("plugins.spec.server_configurations.typescript").config())) vim.lsp.config('jsonls', with_defaults(require("plugins.spec.server_configurations.json"))) vim.lsp.config('yamlls', with_defaults(require("plugins.spec.server_configurations.yaml"))) vim.lsp.config('denols', with_defaults(require("plugins.spec.server_configurations.deno").config())) vim.lsp.config('r_language_server', with_defaults({ cmd = { "R", "--no-echo", "-e", "languageserver::run()" } })) vim.lsp.config('jdtls', with_defaults(require("plugins.spec.server_configurations.java"))) vim.lsp.config('tailwindcss', with_defaults(require("plugins.spec.server_configurations.tailwindcss"))) vim.lsp.config('html', with_defaults(require("plugins.spec.server_configurations.html"))) vim.lsp.config('taplo', with_defaults(require("plugins.spec.server_configurations.taplo"))) vim.lsp.config('protols', with_defaults(require("plugins.spec.server_configurations.proto"))) vim.lsp.config('clangd', with_defaults(require("plugins.spec.server_configurations.clang"))) vim.lsp.config('vtsls', with_defaults(require("plugins.spec.server_configurations.vtsls").config())) vim.lsp.config('eslint', with_defaults(require("plugins.spec.server_configurations.eslint"))) vim.lsp.config('tinymist', with_defaults({ cmd = { "tinymist" } })) vim.diagnostic.config({ virtual_text = { prefix = '●', -- or '■', '▎', 'x', '' whatever you want spacing = 2, }, underline = true, update_in_insert = false, -- set to true if you want real-time errors while typing severity_sort = true, signs = { text = { [vim.diagnostic.severity.ERROR] = "", [vim.diagnostic.severity.WARN] = "", [vim.diagnostic.severity.INFO] = "", [vim.diagnostic.severity.HINT] = "", } } }) end return { 'neovim/nvim-lspconfig', event = { "BufReadPost", "BufNewFile" }, config = function() lsp_setup() end, dependencies = { { 'williamboman/mason.nvim' }, { 'williamboman/mason-lspconfig.nvim' }, 'artemave/workspace-diagnostics.nvim', } }