summaryrefslogtreecommitdiff
path: root/lua/lvim/lsp
diff options
context:
space:
mode:
Diffstat (limited to 'lua/lvim/lsp')
-rw-r--r--lua/lvim/lsp/config.lua30
-rw-r--r--lua/lvim/lsp/init.lua48
-rw-r--r--lua/lvim/lsp/providers/jsonls.lua7
-rw-r--r--lua/lvim/lsp/templates.lua10
-rw-r--r--lua/lvim/lsp/utils.lua53
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)