From 8aaccc4f16f6f734c1d1a2095807228a9d8f5ba8 Mon Sep 17 00:00:00 2001 From: Sanchayan Maity Date: Mon, 27 Sep 2021 17:15:49 +0530 Subject: [PATCH] nvim: lsp: Refactor and alignment clean ups --- nvim/.config/nvim/lua/lsp.lua | 270 +++++++++++++++++----------------- 1 file changed, 138 insertions(+), 132 deletions(-) diff --git a/nvim/.config/nvim/lua/lsp.lua b/nvim/.config/nvim/lua/lsp.lua index aa7cb8c..f5219ea 100644 --- a/nvim/.config/nvim/lua/lsp.lua +++ b/nvim/.config/nvim/lua/lsp.lua @@ -1,9 +1,10 @@ -local nvim_lsp = require('lspconfig') -local protocol = require('vim.lsp.protocol') -local signature = require('lsp_signature') -local ts_utils = require("nvim-lsp-ts-utils") -local null_ls = require("null-ls") -local util = require("lspconfig/util") +local nvim_lsp = require 'lspconfig' +local protocol = require 'vim.lsp.protocol' +local signature = require 'lsp_signature' +local ts_utils = require 'nvim-lsp-ts-utils' +local null_ls = require 'null-ls' +local util = require 'lspconfig/util' +local cmp = require 'cmp_nvim_lsp' -- https://github.com/neovim/nvim-lspconfig/wiki/User-contributed-tips function format_range_operator() @@ -31,6 +32,61 @@ function PeekDefinition() return vim.lsp.buf_request(0, 'textDocument/definition', params, preview_location_callback) end +-- This should be called only once, so cannot be in on_attach as earlier. +-- See https://github.com/jose-elias-alvarez/null-ls.nvim/issues/38 +-- Required by nvim-lsp-ts-utils to provide ESLint code actions, diagnostics +-- and formatting. +null_ls.config {} +nvim_lsp["null-ls"].setup {} + +local ts_utils_setup = function(client, bufnr, opts) + if client.name == 'tsserver' then + -- Disable tsserver formatting as we plan on formatting via null-ls + client.resolved_capabilities.document_formatting = false + client.resolved_capabilities.document_range_formatting = false + + ts_utils.setup { + debug = false, + disable_commands = false, + enable_import_on_completion = false, + + import_all_timeout = 5000, + import_all_scan_buffers = 100, + import_all_select_source = false, + import_all_priorities = { + buffers = 4, -- loaded buffer names + buffer_content = 3, -- loaded buffer content + local_files = 2, -- git files or files with relative path markers + same_file = 1, -- add to existing import statement + }, + + eslint_enable_code_actions = true, + eslint_bin = "eslint", + eslint_enable_disable_comments = true, + eslint_enable_diagnostics = true, + eslint_config_fallback = nil, + eslint_show_rule_id = false, + + enable_formatting = true, + formatter = "prettier", + formatter_config_fallback = nil, + + update_imports_on_move = false, + require_confirmation_on_move = false, + watch_dir = nil, + + filter_out_diagnostics_by_severity = {}, + filter_out_diagnostics_by_code = {}, + } + + ts_utils.setup_client(client) + + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'go', ':TSLspOrganize' , opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gf', ':TSLspFixCurrent', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gI', ':TSLspImportAll' , opts) + end +end + local on_attach = function(client, bufnr) signature.on_attach({ bind = true, @@ -108,56 +164,52 @@ local on_attach = function(client, bufnr) ' '; -- type parameter } - if client.name == 'tsserver' then - -- Disable tsserver formatting as we plan on formatting via null-ls - client.resolved_capabilities.document_formatting = false - client.resolved_capabilities.document_range_formatting = false - - ts_utils.setup { - debug = false, - disable_commands = false, - enable_import_on_completion = false, - - import_all_timeout = 5000, - import_all_scan_buffers = 100, - import_all_select_source = false, - import_all_priorities = { - buffers = 4, -- loaded buffer names - buffer_content = 3, -- loaded buffer content - local_files = 2, -- git files or files with relative path markers - same_file = 1, -- add to existing import statement - }, - - eslint_enable_code_actions = true, - eslint_bin = "eslint", - eslint_enable_disable_comments = true, - eslint_enable_diagnostics = true, - eslint_config_fallback = nil, - eslint_show_rule_id = false, - - enable_formatting = true, - formatter = "prettier", - formatter_config_fallback = nil, - - update_imports_on_move = false, - require_confirmation_on_move = false, - watch_dir = nil, - - filter_out_diagnostics_by_severity = {}, - filter_out_diagnostics_by_code = {}, - } - - ts_utils.setup_client(client) - - vim.api.nvim_buf_set_keymap(bufnr, 'n', 'go', ':TSLspOrganize' , opts) - vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gf', ':TSLspFixCurrent', opts) - vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gI', ':TSLspImportAll' , opts) - end + ts_utils_setup(client, bufnr, opts) vim.cmd [[autocmd CursorHold,CursorHoldI lua require'nvim-lightbulb'.update_lightbulb()]] end -function set_snippet_capabilities() +-- See https://github.com/sumneko/lua-language-server/wiki/Setting-without-VSCode#neovim-with-built-in-lsp-client +-- on why we do this library thing +-- Idea taken from https://gist.github.com/folke/fe5d28423ea5380929c3f7ce674c41d8 +local determine_setup_lua = function () + local library = {} + local cwd = vim.fn.getcwd() + + local add_to_library = function(lib_path) + for _, p in pairs(vim.fn.expand(lib_path, false, true)) do + p = vim.loop.fs_realpath(p) + library[p] = true + end + end + + if string.find(cwd, "neovim") then + add_to_library("$VIMRUNTIME") + elseif string.find(cwd, "dotfiles") then + add_to_library("$VIMRUNTIME") + add_to_library("~/.config/nvim") + add_to_library("~/.local/share/nvim/site/pack/packer/opt/*") + add_to_library("~/.local/share/nvim/site/pack/packer/start/*") + else + add_to_library(cwd .. "/*") + end + + local runtime_path = vim.split(package.path, ';') + table.insert(runtime_path, "lua/?.lua") + table.insert(runtime_path, "lua/?/init.lua") + + local lua_version = function() + if string.find(cwd, "neovim") or string.find(cwd, "dotfiles") then + return "LuaJIT" + else + return "Lua 5.4" + end + end + + return library, runtime_path, lua_version() +end + +local get_snippet_capabilities = function() local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities.textDocument.completion.completionItem.snippetSupport = true @@ -168,40 +220,9 @@ function set_snippet_capabilities() 'additionalTextEdits', } } - return require('cmp_nvim_lsp').update_capabilities(capabilities) + return cmp.update_capabilities(capabilities) end --- This should be called only once, so cannot be in on_attach as earlier. --- See https://github.com/jose-elias-alvarez/null-ls.nvim/issues/38 --- Required by nvim-lsp-ts-utils to provide ESLint code actions, diagnostics --- and formatting. -null_ls.config {} -nvim_lsp["null-ls"].setup {} - -local servers = { 'hls', 'pylsp', 'tsserver' } -for _, lsp in ipairs(servers) do - nvim_lsp[lsp].setup { - on_attach = on_attach, - capabilities = set_snippet_capabilities(), - } -end - -nvim_lsp.clangd.setup { - on_attach = on_attach, - capabilities = set_snippet_capabilities(), - default_config = { - cmd = { "clangd", "--background-index", "--pch-storage=memory", "--clang-tidy", "--suggest-missing-includes" }, - filetypes = { 'c', 'cpp' }, - root_dir = function(fname) - -- We specify build/compile_commands.json as that is where the compile_commands.json - -- gets generated automatically for meson projects. - local root_pattern = util.root_pattern('build/compile_commands.json', 'compile_commands.json', 'compile_flags.txt', '.git') - local filename = util.path.is_absolute(fname) and fname or util.path.join(vim.loop.cwd(), fname) - return root_pattern(filename) or util.path.dirname(filename) - end, - } -} - local rust_tool_opts = { tools = { autoSetHints = true, @@ -228,7 +249,7 @@ local rust_tool_opts = { }, server = { on_attach = on_attach, - capabilities = set_snippet_capabilities(), + capabilities = get_snippet_capabilities(), settings = { ["rust-analyzer"] = { checkOnSave = { @@ -239,65 +260,50 @@ local rust_tool_opts = { }, } +local servers = { 'hls', 'pylsp', 'tsserver' } +for _, lsp in ipairs(servers) do + nvim_lsp[lsp].setup { + on_attach = on_attach, + capabilities = get_snippet_capabilities(), + } +end + +nvim_lsp.clangd.setup { + on_attach = on_attach, + capabilities = get_snippet_capabilities(), + default_config = { + cmd = { "clangd", "--background-index", "--pch-storage=memory", "--clang-tidy", "--suggest-missing-includes" }, + filetypes = { 'c', 'cpp' }, + root_dir = function(fname) + -- We specify build/compile_commands.json as that is where the compile_commands.json + -- gets generated automatically for meson projects. + local root_pattern = util.root_pattern('build/compile_commands.json', 'compile_commands.json', 'compile_flags.txt', '.git') + local filename = util.path.is_absolute(fname) and fname or util.path.join(vim.loop.cwd(), fname) + return root_pattern(filename) or util.path.dirname(filename) + end, + } +} + require('rust-tools').setup(rust_tool_opts) --- See https://github.com/sumneko/lua-language-server/wiki/Setting-without-VSCode#neovim-with-built-in-lsp-client --- on why we do this library thing --- Idea taken from https://gist.github.com/folke/fe5d28423ea5380929c3f7ce674c41d8 -local library = {} -local function add_to_library(lib_path) - for _, p in pairs(vim.fn.expand(lib_path, false, true)) do - p = vim.loop.fs_realpath(p) - library[p] = true - end -end - -local function add_libraries() - local cwd = vim.fn.getcwd() - if string.find(cwd, "neovim") then - add_to_library("$VIMRUNTIME") - elseif string.find(cwd, "dotfiles") then - add_to_library("$VIMRUNTIME") - add_to_library("~/.config/nvim") - add_to_library("~/.local/share/nvim/site/pack/packer/opt/*") - add_to_library("~/.local/share/nvim/site/pack/packer/start/*") - else - add_to_library(cwd .. "/*") - end -end - -local function determine_lua_version() - local cwd = vim.fn.getcwd() - if string.find(cwd, "neovim") or string.find(cwd, "dotfiles") then - return "LuaJIT" - else - return "Lua 5.4" - end -end - -add_libraries() - -local runtime_path = vim.split(package.path, ';') -table.insert(runtime_path, "lua/?.lua") -table.insert(runtime_path, "lua/?/init.lua") - +library, runtime_path, lua_version = determine_setup_lua() nvim_lsp.sumneko_lua.setup { - cmd = { "/usr/bin/lua-language-server" }; - on_attach = on_attach, - capabilities = set_snippet_capabilities(), + cmd = { "/usr/bin/lua-language-server" }; + on_attach = on_attach, + capabilities = get_snippet_capabilities(), settings = { Lua = { runtime = { - version = determine_lua_version(), - path = runtime_path, + version = lua_version, + path = runtime_path, }, completion = { callSnippet = "Both" }, diagnostics = { globals = {'vim'}, }, workspace = { - library = library, - maxPreload = 2000, + library = library, + maxPreload = 2000, preloadFileSize = 50000 }, telemetry = {