diff options
| author | kylo252 <[email protected]> | 2022-07-31 14:28:43 +0200 | 
|---|---|---|
| committer | kylo252 <[email protected]> | 2022-07-31 14:28:43 +0200 | 
| commit | 6fbefdacd35f03b8146490613c54e7865d06a77f (patch) | |
| tree | 70e378c86c411b4c959e7f04851263fc96ad752e /lua/lvim/lsp | |
| parent | b04aefbb79670b115f4f363906d6d294b3d0a2a3 (diff) | |
| parent | dec21bbab6cf9102e236806e20273d08f32f8716 (diff) | |
Merge branch 'rolling'
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) | 
