diff options
Diffstat (limited to '.config/nvim/lua/lsp')
-rw-r--r-- | .config/nvim/lua/lsp/config.lua | 67 | ||||
-rw-r--r-- | .config/nvim/lua/lsp/handlers.lua | 187 | ||||
-rw-r--r-- | .config/nvim/lua/lsp/init.lua | 198 | ||||
-rw-r--r-- | .config/nvim/lua/lsp/manager.lua | 95 | ||||
-rw-r--r-- | .config/nvim/lua/lsp/null-ls/code_actions.lua | 81 | ||||
-rw-r--r-- | .config/nvim/lua/lsp/null-ls/formatters.lua | 82 | ||||
-rw-r--r-- | .config/nvim/lua/lsp/null-ls/init.lua | 22 | ||||
-rw-r--r-- | .config/nvim/lua/lsp/null-ls/linters.lua | 82 | ||||
-rw-r--r-- | .config/nvim/lua/lsp/null-ls/services.lua | 61 | ||||
-rw-r--r-- | .config/nvim/lua/lsp/peek.lua | 166 | ||||
-rw-r--r-- | .config/nvim/lua/lsp/providers/jsonls.lua | 198 | ||||
-rw-r--r-- | .config/nvim/lua/lsp/providers/sumneko_lua.lua | 19 | ||||
-rw-r--r-- | .config/nvim/lua/lsp/providers/vuels.lua | 28 | ||||
-rw-r--r-- | .config/nvim/lua/lsp/providers/yamlls.lua | 30 | ||||
-rw-r--r-- | .config/nvim/lua/lsp/templates.lua | 74 | ||||
-rw-r--r-- | .config/nvim/lua/lsp/utils.lua | 67 |
16 files changed, 0 insertions, 1457 deletions
diff --git a/.config/nvim/lua/lsp/config.lua b/.config/nvim/lua/lsp/config.lua deleted file mode 100644 index 61428aa..0000000 --- a/.config/nvim/lua/lsp/config.lua +++ /dev/null @@ -1,67 +0,0 @@ -return { - templates_dir = join_paths(get_runtime_dir(), "site", "after", "ftplugin"), - diagnostics = { - signs = { - active = true, - values = { - { name = "LspDiagnosticsSignError", text = "" }, - { name = "LspDiagnosticsSignWarning", text = "" }, - { name = "LspDiagnosticsSignHint", text = "" }, - { name = "LspDiagnosticsSignInformation", text = "" }, - }, - }, - virtual_text = true, - update_in_insert = false, - underline = true, - severity_sort = true, - }, - document_highlight = true, - code_lens_refresh = true, - popup_border = "single", - on_attach_callback = nil, - on_init_callback = nil, - automatic_servers_installation = true, - buffer_mappings = { - normal_mode = { - ["K"] = { "<cmd>lua vim.lsp.buf.hover()<CR>", "Show hover" }, - ["gd"] = { "<cmd>lua vim.lsp.buf.definition()<CR>", "Goto Definition" }, - ["gD"] = { "<cmd>lua vim.lsp.buf.declaration()<CR>", "Goto declaration" }, - ["gr"] = { "<cmd>lua vim.lsp.buf.references()<CR>", "Goto references" }, - ["gI"] = { "<cmd>lua vim.lsp.buf.implementation()<CR>", "Goto Implementation" }, - ["gs"] = { "<cmd>lua vim.lsp.buf.signature_help()<CR>", "show signature help" }, - ["gp"] = { "<cmd>lua require'lsp.peek'.Peek('definition')<CR>", "Peek definition" }, - ["gl"] = { - "<cmd>lua require'lsp.handlers'.show_line_diagnostics()<CR>", - "Show line diagnostics", - }, - }, - insert_mode = {}, - visual_mode = {}, - }, - null_ls = { - setup = {}, - config = {}, - }, - override = { - "angularls", - "ansiblels", - "denols", - "ember", - "emmet_ls", - "eslint", - "eslintls", - "graphql", - "jedi_language_server", - "ltex", - "phpactor", - "pylsp", - "rome", - "sorbet", - "sqlls", - "sqls", - "stylelint_lsp", - "tailwindcss", - "tflint", - "volar", - }, -} diff --git a/.config/nvim/lua/lsp/handlers.lua b/.config/nvim/lua/lsp/handlers.lua deleted file mode 100644 index fcf7630..0000000 --- a/.config/nvim/lua/lsp/handlers.lua +++ /dev/null @@ -1,187 +0,0 @@ --- Set Default Prefix. --- Note: You can set a prefix per lsp server in the lv-globals.lua file -local M = {} - -function M.setup() - local config = { -- your config - virtual_text = options.lsp.diagnostics.virtual_text, - signs = options.lsp.diagnostics.signs, - underline = options.lsp.diagnostics.underline, - update_in_insert = options.lsp.diagnostics.update_in_insert, - severity_sort = options.lsp.diagnostics.severity_sort, - } - if vim.fn.has "nvim-0.5.1" > 0 then - vim.lsp.handlers["textDocument/publishDiagnostics"] = function(_, result, ctx, _) - local uri = result.uri - local bufnr = vim.uri_to_bufnr(uri) - if not bufnr then - return - end - - local diagnostics = result.diagnostics - local ok, vim_diag = pcall(require, "vim.diagnostic") - if ok then - -- FIX: why can't we just use vim.diagnostic.get(buf_id)? - config.signs = true - for i, diagnostic in ipairs(diagnostics) do - local rng = diagnostic.range - diagnostics[i].lnum = rng["start"].line - diagnostics[i].end_lnum = rng["end"].line - diagnostics[i].col = rng["start"].character - diagnostics[i].end_col = rng["end"].character - end - local namespace = vim.lsp.diagnostic.get_namespace(ctx.client_id) - - vim_diag.set(namespace, bufnr, diagnostics, config) - if not vim.api.nvim_buf_is_loaded(bufnr) then - return - end - - vim_diag.show(namespace, bufnr, diagnostics, config) - else - vim.lsp.diagnostic.save(diagnostics, bufnr, ctx.client_id) - if not vim.api.nvim_buf_is_loaded(bufnr) then - return - end - vim.lsp.diagnostic.display(diagnostics, bufnr, ctx.client_id, config) - end - end - else - vim.lsp.handlers["textDocument/publishDiagnostics"] = - function(_, _, params, client_id, _) - local uri = params.uri - local bufnr = vim.uri_to_bufnr(uri) - if not bufnr then - return - end - - local diagnostics = params.diagnostics - vim.lsp.diagnostic.save(diagnostics, bufnr, client_id) - if not vim.api.nvim_buf_is_loaded(bufnr) then - return - end - vim.lsp.diagnostic.display(diagnostics, bufnr, client_id, config) - end - end - - vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, { - border = options.lsp.popup_border, - }) - - vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with( - vim.lsp.handlers.signature_help, - { - border = options.lsp.popup_border, - } - ) -end - -local function split_by_chunk(text, chunkSize) - local s = {} - for i = 1, #text, chunkSize do - s[#s + 1] = text:sub(i, i + chunkSize - 1) - end - return s -end - -function M.show_line_diagnostics() - -- TODO: replace all this with vim.diagnostic.show_position_diagnostics() - local diagnostics = vim.lsp.diagnostic.get_line_diagnostics() - local severity_highlight = { - "LspDiagnosticsFloatingError", - "LspDiagnosticsFloatingWarning", - "LspDiagnosticsFloatingInformation", - "LspDiagnosticsFloatingHint", - } - local ok, vim_diag = pcall(require, "vim.diagnostic") - if ok then - local buf_id = vim.api.nvim_win_get_buf(0) - local win_id = vim.api.nvim_get_current_win() - local cursor_position = vim.api.nvim_win_get_cursor(win_id) - severity_highlight = { - "DiagnosticFloatingError", - "DiagnosticFloatingWarn", - "DiagnosticFloatingInfo", - "DiagnosticFloatingHint", - } - diagnostics = vim_diag.get(buf_id, { lnum = cursor_position[1] - 1 }) - end - local lines = {} - local max_width = vim.fn.winwidth(0) - 5 - local height = #diagnostics - local width = 0 - local opts = {} - local close_events = { "CursorMoved", "CursorMovedI", "BufHidden", "InsertCharPre" } - if height == 0 then - return - end - local bufnr = vim.api.nvim_create_buf(false, true) - local diag_message - table.sort(diagnostics, function(a, b) - return a.severity < b.severity - end) - - local hash = {} - local diagnostics_no_dupes = {} - for _, v in ipairs(diagnostics) do - if not hash[v["message"]] then - diagnostics_no_dupes[#diagnostics_no_dupes + 1] = v -- you could print here instead of saving to result table if you wanted - hash[v["message"]] = true - end - end - -- print(vim.inspect(diagnostics_no_dupes)) - - for i, diagnostic in ipairs(diagnostics_no_dupes) do - local source = diagnostic.source - diag_message = diagnostic.message:gsub("[\n\r]", " ") - if source then - if string.find(source, "/") then - source = string.sub( - diagnostic.source, - string.find(diagnostic.source, "([%w-_]+)$") - ) - end - diag_message = string.format("%d. %s: %s", i, source, diag_message) - else - diag_message = string.format("%d. %s", i, diag_message) - end - if diagnostic.code then - diag_message = string.format("%s [%s]", diag_message, diagnostic.code) - end - local msgs = split_by_chunk(diag_message, max_width) - for _, diag in ipairs(msgs) do - table.insert(lines, { message = diag, severity = diagnostic.severity }) - width = math.max(diag:len(), width) - end - end - height = #lines - opts = vim.lsp.util.make_floating_popup_options(width, height, opts) - opts["style"] = "minimal" - opts["border"] = "rounded" - opts["focusable"] = true - - vim.api.nvim_buf_set_option(bufnr, "bufhidden", "wipe") - local winnr = vim.api.nvim_open_win(bufnr, false, opts) - vim.api.nvim_win_set_option(winnr, "winblend", 0) - vim.api.nvim_buf_set_var(bufnr, "lsp_floating_window", winnr) - for i, diag in ipairs(lines) do - vim.api.nvim_buf_set_lines(bufnr, i - 1, i - 1, 0, { diag.message }) - vim.api.nvim_buf_add_highlight( - bufnr, - -1, - severity_highlight[diag.severity], - i - 1, - 0, - diag.message:len() - ) - end - - vim.api.nvim_command( - "autocmd QuitPre <buffer> ++nested ++once lua pcall(vim.api.nvim_win_close, " - .. winnr - .. ", true)" - ) - vim.lsp.util.close_preview_autocmd(close_events, winnr) -end - -return M diff --git a/.config/nvim/lua/lsp/init.lua b/.config/nvim/lua/lsp/init.lua deleted file mode 100644 index 9cb3e78..0000000 --- a/.config/nvim/lua/lsp/init.lua +++ /dev/null @@ -1,198 +0,0 @@ -local M = {} -local Log = require "core.log" -local utils = require "utils" - -local function lsp_highlight_document(client) - if options.lsp.document_highlight == false then - return -- we don't need further - end - -- Set autocommands conditional on server_capabilities - if client.resolved_capabilities.document_highlight then - vim.api.nvim_exec( - [[ - augroup lsp_document_highlight - autocmd! * <buffer> - autocmd CursorHold <buffer> lua vim.lsp.buf.document_highlight() - autocmd CursorMoved <buffer> lua vim.lsp.buf.clear_references() - augroup END - ]], - false - ) - end -end - -local function lsp_code_lens_refresh(client) - if options.lsp.code_lens_refresh == false then - return - end - - if client.resolved_capabilities.code_lens then - vim.api.nvim_exec( - [[ - augroup lsp_code_lens_refresh - autocmd! * <buffer> - autocmd InsertLeave <buffer> lua vim.lsp.codelens.refresh() - autocmd InsertLeave <buffer> lua vim.lsp.codelens.display() - augroup END - ]], - false - ) - end -end - -local function add_lsp_buffer_keybindings(bufnr) - local mappings = { - normal_mode = "n", - insert_mode = "i", - visual_mode = "v", - } - - if options.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( - options.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(options.lsp.buffer_mappings[mode_name]) do - vim.api.nvim_buf_set_keymap( - bufnr, - mode_char, - key, - remap[1], - { noremap = true, silent = true } - ) - end - end - end -end - -function M.common_capabilities() - local capabilities = vim.lsp.protocol.make_client_capabilities() - capabilities.textDocument.completion.completionItem.snippetSupport = true - capabilities.textDocument.completion.completionItem.resolveSupport = { - properties = { - "documentation", - "detail", - "additionalTextEdits", - }, - } - - local status_ok, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp") - if status_ok then - capabilities = cmp_nvim_lsp.update_capabilities(capabilities) - end - - return capabilities -end - -local function select_default_formater(client) - if - client.name == "null-ls" or not client.resolved_capabilities.document_formatting - then - return - end - Log:debug("Checking for formatter overriding for " .. client.name) - local formatters = require "lvim.lsp.null-ls.formatters" - local client_filetypes = client.config.filetypes or {} - for _, filetype in ipairs(client_filetypes) do - if #vim.tbl_keys(formatters.list_registered_providers(filetype)) > 0 then - Log:debug( - "Formatter overriding detected. Disabling formatting capabilities for " - .. client.name - ) - client.resolved_capabilities.document_formatting = false - client.resolved_capabilities.document_range_formatting = false - end - end -end - -function M.common_on_init(client, bufnr) - if options.lsp.on_init_callback then - options.lsp.on_init_callback(client, bufnr) - Log:debug "Called lsp.on_init_callback" - return - end - select_default_formater(client) -end - -function M.common_on_attach(client, bufnr) - if options.lsp.on_attach_callback then - options.lsp.on_attach_callback(client, bufnr) - Log:debug "Called lsp.on_attach_callback" - end - lsp_highlight_document(client) - lsp_code_lens_refresh(client) - 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 -end - -function M.get_common_opts() - return { - on_attach = M.common_on_attach, - on_init = M.common_on_init, - capabilities = M.common_capabilities(), - } -end - -local LSP_DEPRECATED_SIGN_MAP = { - ["LspDiagnosticsSignError"] = "DiagnosticSignError", - ["LspDiagnosticsSignWarning"] = "DiagnosticSignWarn", - ["LspDiagnosticsSignHint"] = "DiagnosticSignHint", - ["LspDiagnosticsSignInformation"] = "DiagnosticSignInfo", -} - -function M.setup() - Log:debug "Setting up LSP support" - - local lsp_status_ok, _ = pcall(require, "lspconfig") - if not lsp_status_ok then - return - end - - local is_neovim_nightly = vim.fn.has "nvim-0.5.1" > 0 - - for _, sign in ipairs(options.lsp.diagnostics.signs.values) do - local lsp_sign_name = LSP_DEPRECATED_SIGN_MAP[sign.name] - if is_neovim_nightly and lsp_sign_name then - vim.fn.sign_define( - lsp_sign_name, - { texthl = lsp_sign_name, text = sign.text, numhl = lsp_sign_name } - ) - end - vim.fn.sign_define( - sign.name, - { texthl = sign.name, text = sign.text, numhl = sign.name } - ) - end - require("lsp.handlers").setup() - - if not utils.is_directory(options.lsp.templates_dir) then - require("lsp.templates").generate_templates() - end - - Log:info(string.format("%s", options.lsp.templates_dir)) - - bootstrap_nlsp { config_home = utils.join_paths(get_config_dir(), "lsp-settings") } - - require("lsp.null-ls").setup() - - require("core.autocmds").configure_format_on_save() -end - -return M diff --git a/.config/nvim/lua/lsp/manager.lua b/.config/nvim/lua/lsp/manager.lua deleted file mode 100644 index 268e90d..0000000 --- a/.config/nvim/lua/lsp/manager.lua +++ /dev/null @@ -1,95 +0,0 @@ -local M = {} - -local Log = require "core.log" -local lsp_utils = require "lsp.utils" - -function M.init_defaults(languages) - for _, entry in ipairs(languages) do - if not options.lang[entry] then - options.lang[entry] = { - formatters = {}, - linters = {}, - lsp = {}, - } - end - end -end - ----Resolve the configuration for a server based on both common and user configuration ----@param name string ----@param user_config table [optional] ----@return table -local function resolve_config(name, user_config) - local config = { - on_attach = require("lsp").common_on_attach, - on_init = require("lsp").common_on_init, - capabilities = require("lsp").common_capabilities(), - } - - local has_custom_provider, custom_config = pcall(require, "lsp/providers/" .. name) - if has_custom_provider then - Log:debug("Using custom configuration for requested server: " .. name) - config = vim.tbl_deep_extend("force", config, custom_config) - end - - if user_config then - config = vim.tbl_deep_extend("force", config, user_config) - end - - return config -end - --- manually start the server and don't wait for the usual filetype trigger from lspconfig -local function buf_try_add(server_name, bufnr) - bufnr = bufnr or vim.api.nvim_get_current_buf() - require("lspconfig")[server_name].manager.try_add_wrapper(bufnr) -end - ----Setup a language server by providing a name ----@param server_name string name of the language server ----@param user_config table [optional] when available it will take predence over any default configurations -function M.setup(server_name, user_config) - vim.validate { name = { server_name, "string" } } - - if lsp_utils.is_client_active(server_name) then - return - end - - local config = resolve_config(server_name, user_config) - local servers = require "nvim-lsp-installer.servers" - local server_available, requested_server = servers.get_server(server_name) - - local is_overridden = vim.tbl_contains(options.lsp.override, server_name) - if not server_available or is_overridden then - pcall(function() - require("lspconfig")[server_name].setup(config) - buf_try_add(server_name) - end) - return - end - - local install_notification = false - - if not requested_server:is_installed() then - if options.lsp.automatic_servers_installation then - Log:debug "Automatic server installation detected" - requested_server:install() - install_notification = true - else - Log:debug(requested_server.name .. " is not managed by the automatic installer") - end - end - - requested_server:on_ready(function() - if install_notification then - vim.notify( - string.format("Installation complete for [%s] server", requested_server.name), - vim.log.levels.INFO - ) - end - install_notification = false - requested_server:setup(config) - end) -end - -return M diff --git a/.config/nvim/lua/lsp/null-ls/code_actions.lua b/.config/nvim/lua/lsp/null-ls/code_actions.lua deleted file mode 100644 index 70cecda..0000000 --- a/.config/nvim/lua/lsp/null-ls/code_actions.lua +++ /dev/null @@ -1,81 +0,0 @@ -local M = {} - -local null_ls = require "null-ls" -local services = require "lsp.null-ls.services" -local Log = require "core.log" - -local METHOD = null_ls.methods.CODE_ACTION - -local is_registered = function(name) - local query = { - name = name, - method = METHOD, - } - return require("null-ls.sources").is_registered(query) -end - -function M.list_registered_providers(filetype) - local registered_providers = services.list_registered_providers_names(filetype) - return registered_providers[METHOD] or {} -end - -function M.list_available(filetype) - local availables = require("null-ls.sources").get_available(filetype, METHOD) - local actors = vim.tbl_map(function(src) - return src.name - end, availables) - table.sort(actors) - return actors -end - -function M.list_configured(actions_configs) - local actors, errors = {}, {} - - for _, config in ipairs(actions_configs) do - vim.validate { - ["config.name"] = { config.name, "string" }, - } - - local name = config.name:gsub("-", "_") - local actor = null_ls.builtins.code_actions[name] - - if not actor then - Log:error("Not a valid code_actions: " .. config.name) - errors[name] = {} -- Add data here when necessary - elseif is_registered(config.name) then - Log:trace "Skipping registering the source more than once" - else - local command - if actor._opts.command then - command = services.find_command(actor._opts.command) - end - if not command and actor._opts.command ~= nil then - Log:warn("Not found: " .. actor._opts.command) - errors[name] = {} -- Add data here when necessary - else - Log:debug("Using code_actions: " .. (command or config.name)) - table.insert( - actors, - actor.with { - command = command, -- could be nil - extra_args = config.args, - filetypes = config.filetypes, - } - ) - end - end - end - - return { supported = actors, unsupported = errors } -end - -function M.setup(actions_configs) - if vim.tbl_isempty(actions_configs) then - return - end - - local actions = M.list_configured(actions_configs) - null_ls.register { sources = actions.supported } -end - -return M diff --git a/.config/nvim/lua/lsp/null-ls/formatters.lua b/.config/nvim/lua/lsp/null-ls/formatters.lua deleted file mode 100644 index 72d622a..0000000 --- a/.config/nvim/lua/lsp/null-ls/formatters.lua +++ /dev/null @@ -1,82 +0,0 @@ -local M = {} - -local null_ls = require "null-ls" -local services = require "lsp.null-ls.services" -local Log = require "core.log" - -local is_registered = function(name) - local query = { - name = name, - method = require("null-ls").methods.FORMATTING, - } - return require("null-ls.sources").is_registered(query) -end - -function M.list_registered_providers(filetype) - local null_ls_methods = require "null-ls.methods" - local formatter_method = null_ls_methods.internal["FORMATTING"] - local registered_providers = services.list_registered_providers_names(filetype) - return registered_providers[formatter_method] or {} -end - -function M.list_available(filetype) - local formatters = {} - local tbl = require "utils.table" - for _, provider in pairs(null_ls.builtins.formatting) do - if - tbl.contains(provider.filetypes or {}, function(ft) - return ft == "*" or ft == filetype - end) - then - table.insert(formatters, provider.name) - end - end - - table.sort(formatters) - return formatters -end - -function M.list_configured(formatter_configs) - local formatters, errors = {}, {} - - for _, fmt_config in ipairs(formatter_configs) do - local name = fmt_config.exe:gsub("-", "_") - local formatter = null_ls.builtins.formatting[name] - - if not formatter then - Log:error("Not a valid formatter: " .. fmt_config.exe) - errors[name] = {} -- Add data here when necessary - elseif is_registered(fmt_config.exe) then - Log:trace "Skipping registering the source more than once" - else - local formatter_cmd = services.find_command(formatter._opts.command) - if not formatter_cmd then - Log:warn("Not found: " .. formatter._opts.command) - errors[name] = {} -- Add data here when necessary - else - Log:debug("Using formatter: " .. formatter_cmd) - table.insert( - formatters, - formatter.with { - command = formatter_cmd, - extra_args = fmt_config.args, - filetypes = fmt_config.filetypes, - } - ) - end - end - end - - return { supported = formatters, unsupported = errors } -end - -function M.setup(formatter_configs) - if vim.tbl_isempty(formatter_configs) then - return - end - - local formatters = M.list_configured(formatter_configs) - null_ls.register { sources = formatters.supported } -end - -return M diff --git a/.config/nvim/lua/lsp/null-ls/init.lua b/.config/nvim/lua/lsp/null-ls/init.lua deleted file mode 100644 index adbc5b2..0000000 --- a/.config/nvim/lua/lsp/null-ls/init.lua +++ /dev/null @@ -1,22 +0,0 @@ -local M = {} - -local Log = require "core.log" - -function M:setup() - local status_ok, null_ls = pcall(require, "null-ls") - if not status_ok then - Log:error "Missing null-ls dependency" - return - end - - null_ls.config(options.lsp.null_ls.config) - local default_opts = require("lsp").get_common_opts() - - if vim.tbl_isempty(options.lsp.null_ls.setup or {}) then - options.lsp.null_ls.setup = default_opts - end - - require("lspconfig")["null-ls"].setup(options.lsp.null_ls.setup) -end - -return M diff --git a/.config/nvim/lua/lsp/null-ls/linters.lua b/.config/nvim/lua/lsp/null-ls/linters.lua deleted file mode 100644 index ec5e25a..0000000 --- a/.config/nvim/lua/lsp/null-ls/linters.lua +++ /dev/null @@ -1,82 +0,0 @@ -local M = {} - -local null_ls = require "null-ls" -local services = require "lsp.null-ls.services" -local Log = require "core.log" - -local is_registered = function(name) - local query = { - name = name, - method = require("null-ls").methods.DIAGNOSTICS, - } - return require("null-ls.sources").is_registered(query) -end - -function M.list_registered_providers(filetype) - local null_ls_methods = require "null-ls.methods" - local linter_method = null_ls_methods.internal["DIAGNOSTICS"] - local registered_providers = services.list_registered_providers_names(filetype) - return registered_providers[linter_method] or {} -end - -function M.list_available(filetype) - local linters = {} - local tbl = require "utils.table" - for _, provider in pairs(null_ls.builtins.diagnostics) do - if - tbl.contains(provider.filetypes or {}, function(ft) - return ft == "*" or ft == filetype - end) - then - table.insert(linters, provider.name) - end - end - - table.sort(linters) - return linters -end - -function M.list_configured(linter_configs) - local linters, errors = {}, {} - - for _, lnt_config in pairs(linter_configs) do - local name = lnt_config.exe:gsub("-", "_") - local linter = null_ls.builtins.diagnostics[name] - - if not linter then - Log:error("Not a valid linter: " .. lnt_config.exe) - errors[lnt_config.exe] = {} -- Add data here when necessary - elseif is_registered(lnt_config.exe) then - Log:trace "Skipping registering the source more than once" - else - local linter_cmd = services.find_command(linter._opts.command) - if not linter_cmd then - Log:warn("Not found: " .. linter._opts.command) - errors[name] = {} -- Add data here when necessary - else - Log:debug("Using linter: " .. linter_cmd) - table.insert( - linters, - linter.with { - command = linter_cmd, - extra_args = lnt_config.args, - filetypes = lnt_config.filetypes, - } - ) - end - end - end - - return { supported = linters, unsupported = errors } -end - -function M.setup(linter_configs) - if vim.tbl_isempty(linter_configs) then - return - end - - local linters = M.list_configured(linter_configs) - null_ls.register { sources = linters.supported } -end - -return M diff --git a/.config/nvim/lua/lsp/null-ls/services.lua b/.config/nvim/lua/lsp/null-ls/services.lua deleted file mode 100644 index 6a52520..0000000 --- a/.config/nvim/lua/lsp/null-ls/services.lua +++ /dev/null @@ -1,61 +0,0 @@ -local M = {} - -local function find_root_dir() - local util = require "lspconfig/util" - local lsp_utils = require "lsp.utils" - - local ts_client = lsp_utils.is_client_active "typescript" - if ts_client then - return ts_client.config.root_dir - end - local dirname = vim.fn.expand "%:p:h" - return util.root_pattern "package.json"(dirname) -end - -local function from_node_modules(command) - local root_dir = find_root_dir() - - if not root_dir then - return nil - end - - return root_dir .. "/node_modules/.bin/" .. command -end - -local local_providers = { - prettier = { find = from_node_modules }, - prettierd = { find = from_node_modules }, - prettier_d_slim = { find = from_node_modules }, - eslint_d = { find = from_node_modules }, - eslint = { find = from_node_modules }, - stylelint = { find = from_node_modules }, -} - -function M.find_command(command) - if local_providers[command] then - local local_command = local_providers[command].find(command) - if local_command and vim.fn.executable(local_command) == 1 then - return local_command - end - end - - if vim.fn.executable(command) == 1 then - return command - end - return nil -end - -function M.list_registered_providers_names(filetype) - local s = require "null-ls.sources" - local available_sources = s.get_available(filetype) - local registered = {} - for _, source in ipairs(available_sources) do - for method in pairs(source.methods) do - registered[method] = registered[method] or {} - table.insert(registered[method], source.name) - end - end - return registered -end - -return M diff --git a/.config/nvim/lua/lsp/peek.lua b/.config/nvim/lua/lsp/peek.lua deleted file mode 100644 index 151c967..0000000 --- a/.config/nvim/lua/lsp/peek.lua +++ /dev/null @@ -1,166 +0,0 @@ -local M = { - floating_buf = nil, - floating_win = nil, - prev_result = nil, -} - -local function create_floating_file(location, opts) - vim.validate { - location = { location, "t" }, - opts = { opts, "t", true }, - } - - -- Set some defaults - opts = opts or {} - local close_events = opts.close_events - or { "CursorMoved", "CursorMovedI", "BufHidden", "InsertCharPre" } - - -- location may be LocationLink or Location - local uri = location.targetUri or location.uri - if uri == nil then - return - end - local bufnr = vim.uri_to_bufnr(uri) - if not vim.api.nvim_buf_is_loaded(bufnr) then - vim.fn.bufload(bufnr) - end - - local range = location.targetRange or location.range - - local contents = vim.api.nvim_buf_get_lines( - bufnr, - range.start.line, - math.min( - range["end"].line + 1 + (opts.context or 10), - range.start.line + (opts.max_height or 15) - ), -- Don't let the window be more that 15 lines long(height) - false - ) - local width, height = vim.lsp.util._make_floating_popup_size(contents, opts) - opts = vim.lsp.util.make_floating_popup_options(width, height, opts) - -- Don't make it minimal as it is meant to be fully featured - opts["style"] = nil - - vim.api.nvim_buf_set_option(bufnr, "bufhidden", "wipe") - - local winnr = vim.api.nvim_open_win(bufnr, false, opts) - vim.api.nvim_win_set_option(winnr, "winblend", 0) - - vim.api.nvim_win_set_cursor(winnr, { range.start.line + 1, range.start.character }) - vim.api.nvim_buf_set_var(bufnr, "lsp_floating_window", winnr) - - -- Set some autocmds to close the window - vim.api.nvim_command( - "autocmd QuitPre <buffer> ++nested ++once lua pcall(vim.api.nvim_win_close, " - .. winnr - .. ", true)" - ) - vim.lsp.util.close_preview_autocmd(close_events, winnr) - - return bufnr, winnr -end - -local function preview_location_callback(result) - if result == nil or vim.tbl_isempty(result) then - return nil - end - - local opts = { - border = "rounded", - context = 10, - } - - if vim.tbl_islist(result) then - M.prev_result = result[1] - M.floating_buf, M.floating_win = create_floating_file(result[1], opts) - else - M.prev_result = result - M.floating_buf, M.floating_win = create_floating_file(result, opts) - end -end - -local function preview_location_callback_old_signature(_, _, result) - return preview_location_callback(result) -end - -local function preview_location_callback_new_signature(_, result) - return preview_location_callback(result) -end - -function M.open_file() - -- Get the file currently open in the floating window - local filepath = vim.fn.expand "%:." - - if not filepath then - print "peek: Unable to open the file!" - return - end - - -- Close the floating window - pcall(vim.api.nvim_win_close, M.floating_win, true) - - -- Edit the file - vim.cmd("edit " .. filepath) - - local winnr = vim.api.nvim_get_current_win() - - -- Set the cursor at the right position - M.set_cursor_to_prev_pos(winnr) -end - -function M.set_cursor_to_prev_pos(winnr) - -- Get position of the thing to peek at - local location = M.prev_result - local range = location.targetRange or location.range - local cursor_pos = { range.start.line + 1, range.start.character } - - -- Set the winnr to the floating window if none was passed in - winnr = winnr or M.floating_win - -- Set the cursor at the correct position in the floating window - vim.api.nvim_win_set_cursor(winnr, cursor_pos) -end - -function M.Peek(what) - -- If a window already exists, focus it at the right position! - if vim.tbl_contains(vim.api.nvim_list_wins(), M.floating_win) then - local success_1, _ = pcall(vim.api.nvim_set_current_win, M.floating_win) - if not success_1 then - print "peek: You cannot edit the current file in a preview!" - return - end - - -- Set the cursor at the correct position in the floating window - M.set_cursor_to_prev_pos() - - vim.api.nvim_buf_set_keymap( - M.floating_buf, - "n", - "<CR>", - ":lua require('lsp.peek').open_file()<CR>", - { noremap = true, silent = true } - ) - else - -- Make a new request and then create the new window in the callback - local params = vim.lsp.util.make_position_params() - local preview_callback = preview_location_callback_old_signature - if vim.fn.has "nvim-0.5.1" > 0 then - preview_callback = preview_location_callback_new_signature - end - local success, _ = pcall( - vim.lsp.buf_request, - 0, - "textDocument/" .. what, - params, - preview_callback - ) - if not success then - print( - 'peek: Error calling LSP method "textDocument/' - .. what - .. '". The current language lsp might not support it.' - ) - end - end -end - -return M diff --git a/.config/nvim/lua/lsp/providers/jsonls.lua b/.config/nvim/lua/lsp/providers/jsonls.lua deleted file mode 100644 index e81b2c3..0000000 --- a/.config/nvim/lua/lsp/providers/jsonls.lua +++ /dev/null @@ -1,198 +0,0 @@ - -local default_schemas = nil -local status_ok, jsonls_settings = pcall(require, "nlspsettings.jsonls") -if status_ok then - default_schemas = jsonls_settings.get_default_schemas() -end - -local schemas = { - { - description = "TypeScript compiler configuration file", - fileMatch = { - "tsconfig.json", - "tsconfig.*.json", - }, - url = "https://json.schemastore.org/tsconfig.json", - }, - { - description = "Lerna config", - fileMatch = { "lerna.json" }, - url = "https://json.schemastore.org/lerna.json", - }, - { - description = "Babel configuration", - fileMatch = { - ".babelrc.json", - ".babelrc", - "babel.config.json", - }, - url = "https://json.schemastore.org/babelrc.json", - }, - { - description = "ESLint config", - fileMatch = { - ".eslintrc.json", - ".eslintrc", - }, - url = "https://json.schemastore.org/eslintrc.json", - }, - { - description = "Bucklescript config", - fileMatch = { "bsconfig.json" }, - url = "https://raw.githubusercontent.com/rescript-lang/rescript-compiler/8.2.0/docs/docson/build-schema.json", - }, - { - description = "Prettier config", - fileMatch = { - ".prettierrc", - ".prettierrc.json", - "prettier.config.json", - }, - url = "https://json.schemastore.org/prettierrc", - }, - { - description = "Vercel Now config", - fileMatch = { "now.json" }, - url = "https://json.schemastore.org/now", - }, - { - description = "Stylelint config", - fileMatch = { - ".stylelintrc", - ".stylelintrc.json", - "stylelint.config.json", - }, - url = "https://json.schemastore.org/stylelintrc", - }, - { - description = "A JSON schema for the ASP.NET LaunchSettings.json files", - fileMatch = { "launchsettings.json" }, - url = "https://json.schemastore.org/launchsettings.json", - }, - { - description = "Schema for CMake Presets", - fileMatch = { - "CMakePresets.json", - "CMakeUserPresets.json", - }, - url = "https://raw.githubusercontent.com/Kitware/CMake/master/Help/manual/presets/schema.json", - }, - { - description = "Configuration file as an alternative for configuring your repository in the settings page.", - fileMatch = { - ".codeclimate.json", - }, - url = "https://json.schemastore.org/codeclimate.json", - }, - { - description = "LLVM compilation database", - fileMatch = { - "compile_commands.json", - }, - url = "https://json.schemastore.org/compile-commands.json", - }, - { - description = "Config file for Command Task Runner", - fileMatch = { - "commands.json", - }, - url = "https://json.schemastore.org/commands.json", - }, - { - description = "AWS CloudFormation provides a common language for you to describe and provision all the infrastructure resources in your cloud environment.", - fileMatch = { - "*.cf.json", - "cloudformation.json", - }, - url = "https://raw.githubusercontent.com/awslabs/goformation/v5.2.9/schema/cloudformation.schema.json", - }, - { - description = "The AWS Serverless Application Model (AWS SAM, previously known as Project Flourish) extends AWS CloudFormation to provide a simplified way of defining the Amazon API Gateway APIs, AWS Lambda functions, and Amazon DynamoDB tables needed by your serverless application.", - fileMatch = { - "serverless.template", - "*.sam.json", - "sam.json", - }, - url = "https://raw.githubusercontent.com/awslabs/goformation/v5.2.9/schema/sam.schema.json", - }, - { - description = "Json schema for properties json file for a GitHub Workflow template", - fileMatch = { - ".github/workflow-templates/**.properties.json", - }, - url = "https://json.schemastore.org/github-workflow-template-properties.json", - }, - { - description = "golangci-lint configuration file", - fileMatch = { - ".golangci.toml", - ".golangci.json", - }, - url = "https://json.schemastore.org/golangci-lint.json", - }, - { - description = "JSON schema for the JSON Feed format", - fileMatch = { - "feed.json", - }, - url = "https://json.schemastore.org/feed.json", - versions = { - ["1"] = "https://json.schemastore.org/feed-1.json", - ["1.1"] = "https://json.schemastore.org/feed.json", - }, - }, - { - description = "Packer template JSON configuration", - fileMatch = { - "packer.json", - }, - url = "https://json.schemastore.org/packer.json", - }, - { - description = "NPM configuration file", - fileMatch = { - "package.json", - }, - url = "https://json.schemastore.org/package.json", - }, - { - description = "JSON schema for Visual Studio component configuration files", - fileMatch = { - "*.vsconfig", - }, - url = "https://json.schemastore.org/vsconfig.json", - }, - { - description = "Resume json", - fileMatch = { "resume.json" }, - url = "https://raw.githubusercontent.com/jsonresume/resume-schema/v1.0.0/schema.json", - }, -} - -local function extend(tab1, tab2) - for _, value in ipairs(tab2) do - table.insert(tab1, value) - end - return tab1 -end - -local extended_schemas = extend(schemas, default_schemas) - -local opts = { - settings = { - json = { - schemas = extended_schemas, - }, - }, - setup = { - commands = { - Format = { - function() - vim.lsp.buf.range_formatting({}, { 0, 0 }, { vim.fn.line "$", 0 }) - end, - }, - }, - }, -} - -return opts diff --git a/.config/nvim/lua/lsp/providers/sumneko_lua.lua b/.config/nvim/lua/lsp/providers/sumneko_lua.lua deleted file mode 100644 index 25693a9..0000000 --- a/.config/nvim/lua/lsp/providers/sumneko_lua.lua +++ /dev/null @@ -1,19 +0,0 @@ -local opts = { - settings = { - Lua = { - diagnostics = { - globals = { "vim", "nvim" }, - }, - workspace = { - library = { - [require("utils").join_paths(get_runtime_dir(), "lua")] = true, - [vim.fn.expand "$VIMRUNTIME/lua"] = true, - [vim.fn.expand "$VIMRUNTIME/lua/vim/lsp"] = true, - }, - maxPreload = 100000, - preloadFileSize = 10000, - }, - }, - }, -} -return opts diff --git a/.config/nvim/lua/lsp/providers/vuels.lua b/.config/nvim/lua/lsp/providers/vuels.lua deleted file mode 100644 index 0d93c61..0000000 --- a/.config/nvim/lua/lsp/providers/vuels.lua +++ /dev/null @@ -1,28 +0,0 @@ -local opts = { - setup = { - root_dir = function(fname) - local util = require "lspconfig/util" - return util.root_pattern "package.json"(fname) - or util.root_pattern "vue.config.js"(fname) - or vim.fn.getcwd() - end, - init_options = { - config = { - vetur = { - completion = { - autoImport = true, - tagCasing = "kebab", - useScaffoldSnippets = true, - }, - useWorkspaceDependencies = true, - validation = { - script = true, - style = true, - template = true, - }, - }, - }, - }, - }, -} -return opts diff --git a/.config/nvim/lua/lsp/providers/yamlls.lua b/.config/nvim/lua/lsp/providers/yamlls.lua deleted file mode 100644 index 156a35b..0000000 --- a/.config/nvim/lua/lsp/providers/yamlls.lua +++ /dev/null @@ -1,30 +0,0 @@ -local opts = { - settings = { - yaml = { - hover = true, - completion = true, - validate = true, - schemaStore = { - enable = true, - url = "https://www.schemastore.org/api/json/catalog.json", - }, - schemas = { - kubernetes = { - "daemon.{yml,yaml}", - "manager.{yml,yaml}", - "restapi.{yml,yaml}", - "role.{yml,yaml}", - "role_binding.{yml,yaml}", - "*onfigma*.{yml,yaml}", - "*ngres*.{yml,yaml}", - "*ecre*.{yml,yaml}", - "*eployment*.{yml,yaml}", - "*ervic*.{yml,yaml}", - "kubectl-edit*.yaml", - }, - }, - }, - }, -} - -return opts diff --git a/.config/nvim/lua/lsp/templates.lua b/.config/nvim/lua/lsp/templates.lua deleted file mode 100644 index 084c1f9..0000000 --- a/.config/nvim/lua/lsp/templates.lua +++ /dev/null @@ -1,74 +0,0 @@ -local M = {} - -local Log = require "core.log" -local utils = require "utils" -local lsp_utils = require "lsp.utils" - -local ftplugin_dir = options.lsp.templates_dir - -local join_paths = _G.join_paths - -function M.remove_template_files() - -- remove any outdated files - for _, file in ipairs(vim.fn.glob(ftplugin_dir .. "/*.lua", 1, 1)) do - vim.fn.delete(file) - end -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) - local has_custom_provider, _ = pcall(require, "lsp/providers/" .. server_name) - if - vim.tbl_contains(options.lsp.override, server_name) and not has_custom_provider - then - return - end - - -- we need to go through lspconfig to get the corresponding filetypes currently - local filetypes = lsp_utils.get_supported_filetypes(server_name) or {} - if not filetypes then - return - end - - for _, filetype in ipairs(filetypes) do - local filename = join_paths(dir, filetype .. ".lua") - local setup_cmd = string.format([[require("lsp.manager").setup(%q)]], server_name) - -- print("using setup_cmd: " .. setup_cmd) - -- overwrite the file completely - utils.write_file(filename, setup_cmd .. "\n", "a") - end -end - ----Generates ftplugin files based on a list of server_names ----The files are generated to a runtimepath: "$LUNARVIM_RUNTIME_DIR/site/after/ftplugin/template.lua" ----@param servers_names table list of servers to be enabled. Will add all by default -function M.generate_templates(servers_names) - servers_names = servers_names or {} - - Log:debug "Templates installation in progress" - - M.remove_template_files() - - if vim.tbl_isempty(servers_names) then - local available_servers = - require("nvim-lsp-installer.servers").get_available_servers() - - for _, server in pairs(available_servers) do - table.insert(servers_names, server.name) - end - end - - -- create the directory if it didn't exist - if not utils.is_directory(options.lsp.templates_dir) then - vim.fn.mkdir(ftplugin_dir, "p") - end - - for _, server in ipairs(servers_names) do - M.generate_ftplugin(server, ftplugin_dir) - end - Log:debug "Templates installation is complete" -end - -return M diff --git a/.config/nvim/lua/lsp/utils.lua b/.config/nvim/lua/lsp/utils.lua deleted file mode 100644 index afc3eba..0000000 --- a/.config/nvim/lua/lsp/utils.lua +++ /dev/null @@ -1,67 +0,0 @@ -local M = {} - -local tbl = require "utils.table" - -function M.is_client_active(name) - local clients = vim.lsp.get_active_clients() - return tbl.find_first(clients, function(client) - return client.name == name - end) -end - -function M.get_active_clients_by_ft(filetype) - local matches = {} - local clients = vim.lsp.get_active_clients() - for _, client in pairs(clients) do - local supported_filetypes = client.config.filetypes or {} - if client.name ~= "null-ls" and vim.tbl_contains(supported_filetypes, filetype) then - table.insert(matches, client) - end - end - return matches -end - -function M.get_client_capabilities(client_id) - if not client_id then - local buf_clients = vim.lsp.buf_get_clients() - for _, buf_client in ipairs(buf_clients) do - if buf_client.name ~= "null-ls" then - client_id = buf_client.id - break - end - end - end - if not client_id then - error "Unable to determine client_id" - return - end - - local client = vim.lsp.get_client_by_id(tonumber(client_id)) - - local enabled_caps = {} - for capability, status in pairs(client.resolved_capabilities) do - if status == true then - table.insert(enabled_caps, capability) - end - end - - return enabled_caps -end - -function M.get_supported_filetypes(server_name) - -- temporary workaround: https://github.com/neovim/nvim-lspconfig/pull/1358 - if server_name == "dockerls" then - return { "dockerfile" } - end - local lsp_installer_servers = require "nvim-lsp-installer.servers" - local server_available, requested_server = lsp_installer_servers.get_server( - server_name - ) - if not server_available then - return {} - end - - return requested_server:get_supported_filetypes() -end - -return M |