diff options
Diffstat (limited to 'start/lspconfig-0.1.8/plugin')
-rw-r--r-- | start/lspconfig-0.1.8/plugin/lspconfig.lua | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/start/lspconfig-0.1.8/plugin/lspconfig.lua b/start/lspconfig-0.1.8/plugin/lspconfig.lua new file mode 100644 index 0000000..254ca6c --- /dev/null +++ b/start/lspconfig-0.1.8/plugin/lspconfig.lua @@ -0,0 +1,159 @@ +if vim.g.lspconfig ~= nil then + return +end +vim.g.lspconfig = 1 + +local api, lsp = vim.api, vim.lsp + +if vim.fn.has 'nvim-0.8' ~= 1 then + local version_info = vim.version() + local warning_str = string.format( + '[lspconfig] requires neovim 0.8 or later. Detected neovim version: 0.%s.%s', + version_info.minor, + version_info.patch + ) + vim.notify_once(warning_str) + return +end + +local completion_sort = function(items) + table.sort(items) + return items +end + +local lsp_complete_configured_servers = function(arg) + return completion_sort(vim.tbl_filter(function(s) + return s:sub(1, #arg) == arg + end, require('lspconfig.util').available_servers())) +end + +local lsp_get_active_client_ids = function(arg) + local clients = vim.tbl_map(function(client) + return ('%d (%s)'):format(client.id, client.name) + end, require('lspconfig.util').get_managed_clients()) + + return completion_sort(vim.tbl_filter(function(s) + return s:sub(1, #arg) == arg + end, clients)) +end + +local get_clients_from_cmd_args = function(arg) + local result = {} + for id in (arg or ''):gmatch '(%d+)' do + result[#result + 1] = lsp.get_client_by_id(tonumber(id)) + end + if #result == 0 then + return require('lspconfig.util').get_managed_clients() + end + return result +end + +for group, hi in pairs { + LspInfoBorder = { link = 'Label', default = true }, + LspInfoList = { link = 'Function', default = true }, + LspInfoTip = { link = 'Comment', default = true }, + LspInfoTitle = { link = 'Title', default = true }, + LspInfoFiletype = { link = 'Type', default = true }, +} do + api.nvim_set_hl(0, group, hi) +end + +-- Called from plugin/lspconfig.vim because it requires knowing that the last +-- script in scriptnames to be executed is lspconfig. +api.nvim_create_user_command('LspInfo', function() + require 'lspconfig.ui.lspinfo'() +end, { + desc = 'Displays attached, active, and configured language servers', +}) + +api.nvim_create_user_command('LspStart', function(info) + local server_name = string.len(info.args) > 0 and info.args or nil + if server_name then + local config = require('lspconfig.configs')[server_name] + if config then + config.launch() + return + end + end + + local matching_configs = require('lspconfig.util').get_config_by_ft(vim.bo.filetype) + for _, config in ipairs(matching_configs) do + config.launch() + end +end, { + desc = 'Manually launches a language server', + nargs = '?', + complete = lsp_complete_configured_servers, +}) + +api.nvim_create_user_command('LspRestart', function(info) + local detach_clients = {} + for _, client in ipairs(get_clients_from_cmd_args(info.args)) do + client.stop() + if vim.tbl_count(client.attached_buffers) > 0 then + detach_clients[client.name] = { client, lsp.get_buffers_by_client_id(client.id) } + end + end + local timer = vim.loop.new_timer() + timer:start( + 500, + 100, + vim.schedule_wrap(function() + for client_name, tuple in pairs(detach_clients) do + if require('lspconfig.configs')[client_name] then + local client, attached_buffers = unpack(tuple) + if client.is_stopped() then + for _, buf in pairs(attached_buffers) do + require('lspconfig.configs')[client_name].launch(buf) + end + detach_clients[client_name] = nil + end + end + end + + if next(detach_clients) == nil and not timer:is_closing() then + timer:close() + end + end) + ) +end, { + desc = 'Manually restart the given language client(s)', + nargs = '?', + complete = lsp_get_active_client_ids, +}) + +api.nvim_create_user_command('LspStop', function(info) + local current_buf = vim.api.nvim_get_current_buf() + local server_id, force + local arguments = vim.split(info.args, '%s') + for _, v in pairs(arguments) do + if v == '++force' then + force = true + elseif v:find '^[0-9]+$' then + server_id = v + end + end + + if not server_id then + local servers_on_buffer = require('lspconfig.util').get_lsp_clients { bufnr = current_buf } + for _, client in ipairs(servers_on_buffer) do + if client.attached_buffers[current_buf] then + client.stop(force) + end + end + else + for _, client in ipairs(get_clients_from_cmd_args(server_id)) do + client.stop(force) + end + end +end, { + desc = 'Manually stops the given language client(s)', + nargs = '?', + complete = lsp_get_active_client_ids, +}) + +api.nvim_create_user_command('LspLog', function() + vim.cmd(string.format('tabnew %s', lsp.get_log_path())) +end, { + desc = 'Opens the Nvim LSP client log.', +}) |