diff options
| -rw-r--r-- | lua/plugins/lsp.lua | 151 |
1 files changed, 79 insertions, 72 deletions
diff --git a/lua/plugins/lsp.lua b/lua/plugins/lsp.lua index 5cca919..8802994 100644 --- a/lua/plugins/lsp.lua +++ b/lua/plugins/lsp.lua @@ -1,29 +1,30 @@ -local lspconfig = require("lspconfig") -local mason_lspconfig = require("mason-lspconfig") -local null_ls = require("null-ls") +local lspconfig = require('lspconfig') +local mason_lspconfig = require('mason-lspconfig') +local null_ls = require('null-ls') -- local lsp_lines = require('lsp_lines') -require("mason").setup() -require("mason-null-ls").setup({ handlers = {}, ensure_installed = nil, automatic_installation = true, automatic_setup = true }) +require('mason').setup() +require('mason-null-ls').setup({ handlers = {}, ensure_installed = nil, automatic_installation = true, automatic_setup = true }) local keymap = vim.keymap local cmd = vim.cmd -local border = { { "┌", "FloatBorder" }, { "─", "FloatBorder" }, { "┐", "FloatBorder" }, { "│", "FloatBorder" }, { "┘", "FloatBorder" }, { "─", "FloatBorder" }, { "└", "FloatBorder" }, { "│", "FloatBorder" } } +local border = { { '┌', 'FloatBorder' }, { '─', 'FloatBorder' }, { '┐', 'FloatBorder' }, { '│', 'FloatBorder' }, { '┘', 'FloatBorder' }, { '─', 'FloatBorder' }, { '└', 'FloatBorder' }, { '│', 'FloatBorder' } } -- Set up LSP servers if not done before if not vim.g.lsp_setup_done then -- Clear existing LSP clients for _, bufnr in ipairs(vim.api.nvim_list_bufs()) do - local clients = vim.lsp.get_clients({ buffer = bufnr }) + local clients = require('user.mods').get_lsp_clients(bufnr) + for _, client in ipairs(clients) do client.stop() end end - local signs = { Error = " ", Warn = "▲", Info = "", Hint = "⚑" } + local signs = { Error = ' ', Warn = '▲', Info = '', Hint = '⚑' } -- for type, icon in pairs(signs) do - local hl = "DiagnosticSign" .. type + local hl = 'DiagnosticSign' .. type vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = hl }) end @@ -46,7 +47,7 @@ if not vim.g.lsp_setup_done then virtual_lines = false, float = { show_header = true, - source = "if_many", -- border = 'rounded', + source = 'if_many', -- border = 'rounded', border = border, focusable = true, }, @@ -54,15 +55,15 @@ if not vim.g.lsp_setup_done then severity_sort = false, -- default to false }) - vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, { underline = false, virtual_text = false, signs = true, update_in_insert = false }) + vim.lsp.handlers['textDocument/publishDiagnostics'] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, { underline = false, virtual_text = false, signs = true, update_in_insert = false }) - vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, { border = "rounded" }) - vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, { border = "rounded" }) + vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(vim.lsp.handlers.hover, { border = 'rounded' }) + vim.lsp.handlers['textDocument/signatureHelp'] = vim.lsp.with(vim.lsp.handlers.signature_help, { border = 'rounded' }) -- Use an on_attach function to only map the following keys after the language server attaches to the current buffer local on_attach = function(client, bufnr) -- Enable completion triggered by <c-x><c-o> - vim.api.nvim_buf_set_option(bufnr, "omnifunc", "v:lua.vim.lsp.omnifunc") + vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') local map = function(mode, l, r, opts) opts = opts or {} opts.silent = true @@ -71,39 +72,39 @@ if not vim.g.lsp_setup_done then keymap.set(mode, l, r, opts) end -- Mappings - map("n", "K", "<Cmd>lua vim.lsp.buf.hover()<CR>") + map('n', 'K', '<Cmd>lua vim.lsp.buf.hover()<CR>') -- map("n", "gd", "<Cmd>lua vim.lsp.buf.definition()<CR>") - map("n", "gd", "<cmd>lua require('goto-preview').goto_preview_definition()<CR>") + map('n', 'gd', "<cmd>lua require('goto-preview').goto_preview_definition()<CR>") -- map("n", "gi", "<Cmd>lua vim.lsp.buf.implementation()<CR>") - map("n", "gi", "<cmd>lua require('goto-preview').goto_preview_implementation()<CR>") + map('n', 'gi', "<cmd>lua require('goto-preview').goto_preview_implementation()<CR>") -- map("n", "gr", "<Cmd>lua vim.lsp.buf.references()<CR>") - map("n", "gr", "<cmd>lua require('goto-preview').goto_preview_references()<CR>") - map("n", "gD", "<Cmd>lua vim.lsp.buf.declaration()<CR>") -- most lsp servers don't implement textDocument/Declaration, so gD is useless for now. - map("n", "<leader>k", "<Cmd>lua vim.lsp.buf.signature_help()<CR>") + map('n', 'gr', "<cmd>lua require('goto-preview').goto_preview_references()<CR>") + map('n', 'gD', '<Cmd>lua vim.lsp.buf.declaration()<CR>') -- most lsp servers don't implement textDocument/Declaration, so gD is useless for now. + map('n', '<leader>k', '<Cmd>lua vim.lsp.buf.signature_help()<CR>') -- map("n", "gt", "<Cmd>lua vim.lsp.buf.type_definition()<CR>") - map("n", "gt", "<cmd>lua require('goto-preview').goto_preview_type_definition()<CR>") - map("n", "gn", "<Cmd>lua vim.lsp.buf.rename()<CR>") - map("n", "ga", "<Cmd>lua vim.lsp.buf.code_action()<CR>") - map("n", "gf", "<Cmd>lua vim.lsp.buf.formatting()<CR>") - map("n", "go", "<Cmd>lua vim.diagnostic.open_float()<CR>") - map("n", "<leader>go", ":call utils#ToggleDiagnosticsOpenFloat()<CR> | :echom ('Toggle Diagnostics Float open/close...')<CR> | :sl! | echo ('')<CR>") - map("n", "[d", "<Cmd>lua vim.diagnostic.goto_prev()<CR>") - map("n", "]d", "<Cmd>lua vim.diagnostic.goto_next()<CR>") - map("n", "gs", "<Cmd>lua vim.lsp.buf.document_symbol()<CR>") - map("n", "gw", "<Cmd>lua vim.lsp.buf.workspace_symbol()<CR>") - map("n", "<leader>wa", "<Cmd>lua vim.lsp.buf.add_workspace_folder()<CR>") - map("n", "<leader>wr", "<Cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>") - map("n", "<leader>wl", function() + map('n', 'gt', "<cmd>lua require('goto-preview').goto_preview_type_definition()<CR>") + map('n', 'gn', '<Cmd>lua vim.lsp.buf.rename()<CR>') + map('n', 'ga', '<Cmd>lua vim.lsp.buf.code_action()<CR>') + map('n', 'gf', '<Cmd>lua vim.lsp.buf.formatting()<CR>') + map('n', 'go', '<Cmd>lua vim.diagnostic.open_float()<CR>') + map('n', '<leader>go', ":call utils#ToggleDiagnosticsOpenFloat()<CR> | :echom ('Toggle Diagnostics Float open/close...')<CR> | :sl! | echo ('')<CR>") + map('n', '[d', '<Cmd>lua vim.diagnostic.goto_prev()<CR>') + map('n', ']d', '<Cmd>lua vim.diagnostic.goto_next()<CR>') + map('n', 'gs', '<Cmd>lua vim.lsp.buf.document_symbol()<CR>') + map('n', 'gw', '<Cmd>lua vim.lsp.buf.workspace_symbol()<CR>') + map('n', '<leader>wa', '<Cmd>lua vim.lsp.buf.add_workspace_folder()<CR>') + map('n', '<leader>wr', '<Cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>') + map('n', '<leader>wl', function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end) -- TODO: Use the nicer new API for autocommands - cmd("augroup lsp_aucmds") + cmd('augroup lsp_aucmds') if client.server_capabilities.documentHighlightProvider then - cmd("au CursorHold <buffer> lua vim.lsp.buf.document_highlight()") - cmd("au CursorMoved <buffer> lua vim.lsp.buf.clear_references()") + cmd('au CursorHold <buffer> lua vim.lsp.buf.document_highlight()') + cmd('au CursorMoved <buffer> lua vim.lsp.buf.clear_references()') end - cmd("augroup END") + cmd('augroup END') end -- Toggle diagnostics visibility @@ -128,11 +129,11 @@ augroup END ]]) -- Suppress error messages from lang servers - vim.lsp.set_log_level("debug") + vim.lsp.set_log_level('debug') local capabilities = vim.lsp.protocol.make_client_capabilities() - capabilities = require("cmp_nvim_lsp").default_capabilities() + capabilities = require('cmp_nvim_lsp').default_capabilities() capabilities.textDocument.completion.completionItem.snippetSupport = true - capabilities.offsetEncoding = { "utf-16" } + capabilities.offsetEncoding = { 'utf-16' } local function prefer_null_ls_fmt(client) client.server_capabilities.documentHighlightProvider = true @@ -144,24 +145,28 @@ augroup END asm_lsp = {}, bashls = {}, clangd = {}, - cssls = { filetypes = { "css", "scss", "less", "sass" }, root_dir = lspconfig.util.root_pattern("package.json", ".git") }, -- ghcide = {}, + cssls = { filetypes = { 'css', 'scss', 'less', 'sass' }, root_dir = lspconfig.util.root_pattern('package.json', '.git') }, -- ghcide = {}, html = {}, - jsonls = { prefer_null_ls = true, cmd = { "--stdio" } }, + jsonls = { prefer_null_ls = true, cmd = { '--stdio' } }, intelephense = {}, julials = { on_new_config = function(new_config, _) - local julia = vim.fn.expand("~/.julia/environments/nvim-lspconfig/bin/julia") + local julia = vim.fn.expand('~/.julia/environments/nvim-lspconfig/bin/julia') if lspconfig.util.path.is_file(julia) then new_config.cmd[1] = julia end end, settings = { julia = { format = { indent = 2 } } }, }, - pyright = { settings = { python = { formatting = { provider = "yapf" }, linting = { pytypeEnabled = true } } } }, - rust_analyzer = { settings = { ["rust-analyzer"] = { cargo = { allFeatures = true }, checkOnSave = { command = "clippy", extraArgs = { "--no-deps" } } } } }, + pyright = { settings = { python = { formatting = { provider = 'yapf' }, linting = { pytypeEnabled = true } } } }, + rust_analyzer = { + settings = { + ['rust-analyzer'] = { cargo = { allFeatures = true }, checkOnSave = { command = 'clippy', extraArgs = { '--no-deps' } } }, + }, + }, dartls = { - cmd = { "dart", "language-server", "--protocol=lsp" }, - filetypes = { "dart" }, + cmd = { 'dart', 'language-server', '--protocol=lsp' }, + filetypes = { 'dart' }, init_options = { closingLabels = true, flutterOutline = true, @@ -178,20 +183,20 @@ augroup END debounce_text_changes = 500, settings = { Lua = { - runtime = { version = "LuaJIT", path = vim.split(package.path, ";") }, - diagnostics = { enable = true, globals = { "vim" } }, + runtime = { version = 'LuaJIT', path = vim.split(package.path, ';') }, + diagnostics = { enable = true, globals = { 'vim' } }, workspace = { maxPreload = 2000, preloadFileSize = 50000, checkThirdParty = false }, }, }, }, sqlls = {}, tsserver = { - capabilities = require("cmp_nvim_lsp").default_capabilities(vim.lsp.protocol.make_client_capabilities()), + capabilities = require('cmp_nvim_lsp').default_capabilities(vim.lsp.protocol.make_client_capabilities()), on_attach = function(client) client.server_capabilities.document_formatting = false client.server_capabilities.document_range_formatting = false end, - filetypes = { "javascript", "javascriptreact", "javascript.jsx", "typescript", "typescriptreact", "typescript.tsx" }, + filetypes = { 'javascript', 'javascriptreact', 'javascript.jsx', 'typescript', 'typescriptreact', 'typescript.tsx' }, }, vimls = {}, yamlls = {}, @@ -247,7 +252,7 @@ augroup END -- null_ls setup local builtins = null_ls.builtins - local augroup = vim.api.nvim_create_augroup("LspFormatting", {}) + local augroup = vim.api.nvim_create_augroup('LspFormatting', {}) -- local eslint_opts = { -- -- condition = function(utils) @@ -275,10 +280,10 @@ augroup END update_in_insert = false, severity_sort = true, }, - diagnostics_format = "[#{c}] #{m} (#{s})", -- this will run every time the source runs, + diagnostics_format = '[#{c}] #{m} (#{s})', -- this will run every time the source runs, -- so you should prefer caching results if possible }), - builtins.diagnostics.zsh.with({ filetypes = "zsh", "sh" }), + builtins.diagnostics.zsh.with({ filetypes = 'zsh', 'sh' }), builtins.diagnostics.todo_comments, builtins.diagnostics.teal, -- null_ls.builtins.diagnostics.vale, @@ -289,17 +294,17 @@ augroup END builtins.diagnostics.flake8, builtins.diagnostics.eslint_d.with({ condition = function(utils) - return utils.root_has_file(".eslintrc.json") + return utils.root_has_file('.eslintrc.json') end, }), builtins.formatting.eslint_d, -- null_ls.builtins.diagnostics.write_good.with { filetypes = { 'markdown', 'tex' } }, -- Formatting - builtins.formatting.shfmt.with({ filetypes = { "bash", "zsh", "sh" }, extra_args = { "-i", "2", "-ci" } }), + builtins.formatting.shfmt.with({ filetypes = { 'bash', 'zsh', 'sh' }, extra_args = { '-i', '2', '-ci' } }), builtins.formatting.shellharden, - builtins.formatting.trim_whitespace.with({ filetypes = { "tmux", "teal", "zsh" } }), -- builtins.formatting.beautysh, - builtins.formatting.beautysh.with({ filetypes = "zsh" }), + builtins.formatting.trim_whitespace.with({ filetypes = { 'tmux', 'teal', 'zsh' } }), -- builtins.formatting.beautysh, + builtins.formatting.beautysh.with({ filetypes = 'zsh' }), builtins.formatting.clang_format, builtins.formatting.rustfmt, builtins.formatting.sql_formatter, @@ -308,19 +313,19 @@ augroup END builtins.formatting.htmlbeautifier, -- null_ls.builtins.formatting.prettier, builtins.formatting.prettierd, builtins.formatting.prettier.with({ - filetypes = { "javascript", "javascriptreact", "typescript", "typescriptreact", "json", "yaml", "markdown", "html", "css", "scss", "less", "graphql", "vue", "svelte" }, - extra_args = { "--single-quote", "--tab-width 4", "--print-width 200" }, + filetypes = { 'javascript', 'javascriptreact', 'typescript', 'typescriptreact', 'json', 'yaml', 'markdown', 'html', 'css', 'scss', 'less', 'graphql', 'vue', 'svelte' }, + extra_args = { '--single-quote', '--tab-width 4', '--print-width 200' }, }), builtins.formatting.rustfmt, -- builtins.formatting.stylua, -- builtins.formatting.lua_format, builtins.formatting.stylua.with({ - filetypes = { "lua" }, - command = "stylua", - args = { "--indent-width", "2", "--column-width", "160", "--indent-type", "Spaces", "-" }, + filetypes = { 'lua' }, + command = 'stylua', + args = { '--quote_style', 'AutoPreferSingle', '--indent-width', '2', '--column-width', '160', '--indent-type', 'Spaces', '-' }, }), -- builtins.formatting.dart_format, - builtins.formatting.dart_format.with({ filetypes = { "dart" } }), + builtins.formatting.dart_format.with({ filetypes = { 'dart' } }), builtins.formatting.trim_whitespace, builtins.formatting.yapf, -- null_ls.builtins.formatting.black @@ -348,9 +353,9 @@ augroup END sources = sources, update_in_insert = true, on_attach = function(client, bufnr) - if client.supports_method("textDocument/formatting") then + if client.supports_method('textDocument/formatting') then vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr }) - vim.api.nvim_create_autocmd("BufWritePre", { + vim.api.nvim_create_autocmd('BufWritePre', { group = augroup, buffer = bufnr, callback = function() @@ -362,7 +367,7 @@ augroup END }) -- Install all the null-ls sources using Mason - local registry = require("mason-registry") + local registry = require('mason-registry') for _, source_name in ipairs(sources) do local ok, pkg = pcall(registry.get_package, source_name) if ok then @@ -383,15 +388,17 @@ augroup END -- end -- end -- end - vim.api.nvim_create_user_command("NullLsToggle", function() + vim.api.nvim_create_user_command('NullLsToggle', function() -- you can also create commands to disable or enable sources - require("null-ls").toggle({}) + require('null-ls').toggle({}) end, {}) local null_ls_stop = function() local null_ls_client - for _, client in ipairs(vim.lsp.get_clients()) do - if client.name == "null-ls" then + local clients = require('user.mods').get_lsp_clients(bufnr) + + for _, client in ipairs(clients) do + if client.name == 'null-ls' then null_ls_client = client end end @@ -402,7 +409,7 @@ augroup END null_ls_client.stop() end - vim.api.nvim_create_user_command("NullLsStop", null_ls_stop, {}) + vim.api.nvim_create_user_command('NullLsStop', null_ls_stop, {}) vim.g.lsp_setup_done = true end |
