diff options
-rw-r--r-- | lua/lvim/core/autocmds.lua | 5 | ||||
-rw-r--r-- | lua/lvim/lsp/manager.lua | 44 | ||||
-rw-r--r-- | lua/lvim/utils/ft.lua | 47 |
3 files changed, 28 insertions, 68 deletions
diff --git a/lua/lvim/core/autocmds.lua b/lua/lvim/core/autocmds.lua index 5d1d365e..569622be 100644 --- a/lua/lvim/core/autocmds.lua +++ b/lua/lvim/core/autocmds.lua @@ -6,11 +6,6 @@ function M.load_augroups() return { _general_settings = { - { - "Filetype", - "*", - "lua require('lvim.utils.ft').do_filetype(vim.fn.expand(\"<amatch>\"))", - }, { "FileType", "qf,help,man", "nnoremap <silent> <buffer> q :close<CR>" }, { "TextYankPost", diff --git a/lua/lvim/lsp/manager.lua b/lua/lvim/lsp/manager.lua index a8544803..128c7553 100644 --- a/lua/lvim/lsp/manager.lua +++ b/lua/lvim/lsp/manager.lua @@ -39,6 +39,12 @@ local function resolve_config(name, user_config) 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(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 @@ -48,32 +54,38 @@ function M.setup(server_name, user_config) if lvim_lsp_utils.is_client_active(server_name) then return end + local servers = require "nvim-lsp-installer.servers" local config = resolve_config(server_name, user_config) - local server_available, requested_server = require("nvim-lsp-installer.servers").get_server(server_name) + local server_available, requested_server = servers.get_server(server_name) - local function ensure_installed(server) - if server:is_installed() then - return true - end - if not lvim.lsp.automatic_servers_installation then - Log:debug(server.name .. " is not managed by the automatic installer") - return false + if server_available then + local install_notification = false + + if not requested_server:is_installed() then + if lvim.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 - Log:debug(string.format("Installing [%s]", server.name)) - server:install() - vim.schedule(function() - vim.cmd [[LspStart]] - end) - end - if server_available and ensure_installed(requested_server) then - requested_server:setup(config) + 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) + buf_try_add(server_name) + end) else -- since it may not be installed, don't attempt to configure the LSP unless there is a custom provider local has_custom_provider, _ = pcall(require, "lvim/lsp/providers/" .. server_name) if has_custom_provider then require("lspconfig")[server_name].setup(config) + buf_try_add(server_name) end end end diff --git a/lua/lvim/utils/ft.lua b/lua/lvim/utils/ft.lua deleted file mode 100644 index e9852e6f..00000000 --- a/lua/lvim/utils/ft.lua +++ /dev/null @@ -1,47 +0,0 @@ --- Here be dragons --- Opening files with telescope will not start LSP without this -local ft = {} - -ft.find_lua_ftplugins = function(filetype) - local patterns = { - string.format("ftplugin/%s.lua", filetype), - - -- Looks like we don't need this, because the first one works - -- string.format("after/ftplugin/%s.lua", filetype), - } - - local result = {} - for _, pat in ipairs(patterns) do - vim.list_extend(result, vim.api.nvim_get_runtime_file(pat, true)) - end - - return result -end - -ft.do_filetype = function(filetype) - local ftplugins = ft.find_lua_ftplugins(filetype) - - local f_env = setmetatable({ - -- Override print, so the prints still go through, otherwise it's confusing for people - print = vim.schedule_wrap(print), - }, { - -- Buf default back read/write to whatever is going on in the global landscape - __index = _G, - __newindex = _G, - }) - - for _, file in ipairs(ftplugins) do - local f = loadfile(file) - if not f then - vim.api.nvim_err_writeln("Unable to load file: " .. file) - else - local ok, msg = pcall(setfenv(f, f_env)) - - if not ok then - vim.api.nvim_err_writeln("Error while processing file: " .. file .. "\n" .. msg) - end - end - end -end - -return ft |