diff options
Diffstat (limited to 'lua/lvim/lsp')
-rw-r--r-- | lua/lvim/lsp/config.lua | 30 | ||||
-rw-r--r-- | lua/lvim/lsp/init.lua | 48 | ||||
-rw-r--r-- | lua/lvim/lsp/providers/jsonls.lua | 7 | ||||
-rw-r--r-- | lua/lvim/lsp/templates.lua | 10 | ||||
-rw-r--r-- | lua/lvim/lsp/utils.lua | 53 |
5 files changed, 84 insertions, 64 deletions
diff --git a/lua/lvim/lsp/config.lua b/lua/lvim/lsp/config.lua index 1f84c4e2..e3cd503b 100644 --- a/lua/lvim/lsp/config.lua +++ b/lua/lvim/lsp/config.lua @@ -39,6 +39,8 @@ local skipped_servers = { local skipped_filetypes = { "markdown", "rst", "plaintext" } +local join_paths = require("lvim.utils").join_paths + return { templates_dir = join_paths(get_runtime_dir(), "site", "after", "ftplugin"), diagnostics = { @@ -119,6 +121,34 @@ return { insert_mode = {}, visual_mode = {}, }, + buffer_options = { + --- enable completion triggered by <c-x><c-o> + omnifunc = "v:lua.vim.lsp.omnifunc", + --- use gq for formatting + formatexpr = "v:lua.vim.lsp.formatexpr(#{timeout_ms:500})", + }, + ---@usage list of settings of nvim-lsp-installer + installer = { + setup = { + ensure_installed = {}, + ui = { + icons = { + server_installed = "✓", + server_pending = "", + server_uninstalled = "✗", + }, + }, + }, + }, + nlsp_settings = { + setup = { + config_home = join_paths(get_config_dir(), "lsp-settings"), + -- set to false to overwrite schemastore.nvim + append_default_schemas = true, + ignored_servers = {}, + loader = "json", + }, + }, null_ls = { setup = {}, config = {}, diff --git a/lua/lvim/lsp/init.lua b/lua/lvim/lsp/init.lua index 2f3258c9..53b4f248 100644 --- a/lua/lvim/lsp/init.lua +++ b/lua/lvim/lsp/init.lua @@ -3,6 +3,12 @@ local Log = require "lvim.core.log" local utils = require "lvim.utils" local autocmds = require "lvim.core.autocmds" +local function add_lsp_buffer_options(bufnr) + for k, v in pairs(lvim.lsp.buffer_options) do + vim.api.nvim_buf_set_option(bufnr, k, v) + end +end + local function add_lsp_buffer_keybindings(bufnr) local mappings = { normal_mode = "n", @@ -10,21 +16,10 @@ local function add_lsp_buffer_keybindings(bufnr) visual_mode = "v", } - if lvim.builtin.which_key.active then - -- Remap using which_key - local status_ok, wk = pcall(require, "which-key") - if not status_ok then - return - end - for mode_name, mode_char in pairs(mappings) do - wk.register(lvim.lsp.buffer_mappings[mode_name], { mode = mode_char, buffer = bufnr }) - end - else - -- Remap using nvim api - for mode_name, mode_char in pairs(mappings) do - for key, remap in pairs(lvim.lsp.buffer_mappings[mode_name]) do - vim.api.nvim_buf_set_keymap(bufnr, mode_char, key, remap[1], { noremap = true, silent = true }) - end + for mode_name, mode_char in pairs(mappings) do + for key, remap in pairs(lvim.lsp.buffer_mappings[mode_name]) do + local opts = { buffer = bufnr, desc = remap[2], noremap = true, silent = true } + vim.keymap.set(mode_char, key, remap[1], opts) end end end @@ -78,14 +73,7 @@ function M.common_on_attach(client, bufnr) lu.setup_codelens_refresh(client, bufnr) end add_lsp_buffer_keybindings(bufnr) -end - -local function bootstrap_nlsp(opts) - opts = opts or {} - local lsp_settings_status_ok, lsp_settings = pcall(require, "nlspsettings") - if lsp_settings_status_ok then - lsp_settings.setup(opts) - end + add_lsp_buffer_options(bufnr) end function M.get_common_opts() @@ -117,15 +105,13 @@ function M.setup() require("lvim.lsp.templates").generate_templates() end - bootstrap_nlsp { - config_home = utils.join_paths(get_config_dir(), "lsp-settings"), - append_default_schemas = true, - } + pcall(function() + require("nlspsettings").setup(lvim.lsp.nlsp_settings.setup) + end) - require("nvim-lsp-installer").setup { - -- use the default nvim_data_dir, since the server binaries are independent - install_root_dir = utils.join_paths(vim.call("stdpath", "data"), "lsp_servers"), - } + pcall(function() + require("nvim-lsp-installer").setup(lvim.lsp.installer.setup) + end) require("lvim.lsp.null-ls").setup() diff --git a/lua/lvim/lsp/providers/jsonls.lua b/lua/lvim/lsp/providers/jsonls.lua index 528c72a0..76aea25f 100644 --- a/lua/lvim/lsp/providers/jsonls.lua +++ b/lua/lvim/lsp/providers/jsonls.lua @@ -1,12 +1,7 @@ -local full_schemas = vim.tbl_deep_extend( - "force", - require("schemastore").json.schemas(), - require("nlspsettings.jsonls").get_default_schemas() -) local opts = { settings = { json = { - schemas = full_schemas, + schemas = require("schemastore").json.schemas(), }, }, setup = { diff --git a/lua/lvim/lsp/templates.lua b/lua/lvim/lsp/templates.lua index 09f82430..578362a7 100644 --- a/lua/lvim/lsp/templates.lua +++ b/lua/lvim/lsp/templates.lua @@ -17,12 +17,20 @@ end local skipped_filetypes = lvim.lsp.automatic_configuration.skipped_filetypes local skipped_servers = lvim.lsp.automatic_configuration.skipped_servers +local ensure_installed_servers = lvim.lsp.installer.setup.ensure_installed + +---Check if we should skip generating an ftplugin file based on the server_name +---@param server_name string name of a valid language server +local function should_skip(server_name) + -- ensure_installed_servers should take priority over skipped_servers + return vim.tbl_contains(skipped_servers, server_name) and not vim.tbl_contains(ensure_installed_servers, server_name) +end ---Generates an ftplugin file based on the server_name in the selected directory ---@param server_name string name of a valid language server, e.g. pyright, gopls, tsserver, etc. ---@param dir string the full path to the desired directory function M.generate_ftplugin(server_name, dir) - if vim.tbl_contains(skipped_servers, server_name) then + if should_skip(server_name) then return end diff --git a/lua/lvim/lsp/utils.lua b/lua/lvim/lsp/utils.lua index d0e36241..fa1ac6d9 100644 --- a/lua/lvim/lsp/utils.lua +++ b/lua/lvim/lsp/utils.lua @@ -130,45 +130,46 @@ function M.setup_codelens_refresh(client, bufnr) end ---filter passed to vim.lsp.buf.format ----gives higher priority to null-ls ----@param clients table clients attached to a buffer ----@return table chosen clients -function M.format_filter(clients) - return vim.tbl_filter(function(client) - local status_ok, formatting_supported = pcall(function() - return client.supports_method "textDocument/formatting" - end) - -- give higher prio to null-ls - if status_ok and formatting_supported and client.name == "null-ls" then - return "null-ls" - else - return status_ok and formatting_supported and client.name - end - end, clients) +---always selects null-ls if it's available and caches the value per buffer +---@param client table client attached to a buffer +---@return boolean if client matches +function M.format_filter(client) + local filetype = vim.bo.filetype + local n = require "null-ls" + local s = require "null-ls.sources" + local method = n.methods.FORMATTING + local avalable_formatters = s.get_available(filetype, method) + + if #avalable_formatters > 0 then + return client.name == "null-ls" + elseif client.supports_method "textDocument/formatting" then + return true + else + return false + end end ---Provide vim.lsp.buf.format for nvim <0.8 ---@param opts table function M.format(opts) - opts = opts or { filter = M.format_filter } + opts = opts or {} + opts.filter = opts.filter or M.format_filter if vim.lsp.buf.format then return vim.lsp.buf.format(opts) end local bufnr = opts.bufnr or vim.api.nvim_get_current_buf() - local clients = vim.lsp.buf_get_clients(bufnr) + + ---@type table|nil + local clients = vim.lsp.get_active_clients { + id = opts.id, + bufnr = bufnr, + name = opts.name, + } if opts.filter then - clients = opts.filter(clients) - elseif opts.id then - clients = vim.tbl_filter(function(client) - return client.id == opts.id - end, clients) - elseif opts.name then - clients = vim.tbl_filter(function(client) - return client.name == opts.name - end, clients) + clients = vim.tbl_filter(opts.filter, clients) end clients = vim.tbl_filter(function(client) |