local M = { banner = { "", [[ _ ___ ]], [[| | / (_)___ ___ ]], [[| | / / / __ `__ \]], [[| |/ / / / / / / /]], [[|___/_/_/ /_/ /_/ ]], }, } local fmt = string.format local text = require "interface.text" local lsp_utils = require "lsp.utils" local function str_list(list) return fmt("[ %s ]", table.concat(list, ", ")) end local function get_formatter_suggestion_msg(ft) local config = require "config" local null_formatters = require "lsp.null-ls.formatters" local supported_formatters = null_formatters.list_available(ft) local section = { " HINT ", "", fmt("* List of supported formatters: %s", str_list(supported_formatters)), } if not vim.tbl_isempty(supported_formatters) then vim.list_extend(section, { "* Configured formatter needs to be installed and executable.", fmt("* Enable installed formatter(s) with following config in %s", config.path), "", fmt( " options.lang.%s.formatters = { { exe = '%s' } }", ft, table.concat(supported_formatters, "│") ), }) end return section end local function get_linter_suggestion_msg(ft) local config = require "config" local null_linters = require "lsp.null-ls.linters" local supported_linters = null_linters.list_available(ft) local section = { " HINT ", "", fmt("* List of supported linters: %s", str_list(supported_linters)), } if not vim.tbl_isempty(supported_linters) then vim.list_extend(section, { "* Configured linter needs to be installed and executable.", fmt("* Enable installed linter(s) with following config in %s", config.path), "", fmt( " options.lang.%s.linters = { { exe = '%s' } }", ft, table.concat(supported_linters, "│") ), }) end return section end local function tbl_set_highlight(terms, highlight_group) for _, v in pairs(terms) do vim.cmd('let m=matchadd("' .. highlight_group .. '", "' .. v .. "[ ,│']\")") end end local function make_client_info(client) local client_enabled_caps = lsp_utils.get_client_capabilities(client.id) local name = client.name local id = client.id local document_formatting = client.resolved_capabilities.document_formatting local client_info = { fmt("* Name: %s", name), fmt("* Id: %s", tostring(id)), fmt("* Supports formatting: %s", tostring(document_formatting)), } if not vim.tbl_isempty(client_enabled_caps) then local caps_text = "* Capabilities list: " local caps_text_len = caps_text:len() local enabled_caps = text.format_table(client_enabled_caps, 3, " | ") enabled_caps = text.shift_right(enabled_caps, caps_text_len) enabled_caps[1] = fmt("%s%s", caps_text, enabled_caps[1]:sub(caps_text_len + 1)) vim.list_extend(client_info, enabled_caps) end return client_info end function M.toggle_popup(ft) local clients = lsp_utils.get_active_clients_by_ft(ft) local client_names = {} local header = { fmt("Detected filetype: %s", ft), fmt( "Treesitter active: %s", tostring(next(vim.treesitter.highlighter.active) ~= nil) ), } local lsp_info = { "Language Server Protocol (LSP) info", fmt "* Associated server(s):", } for _, client in pairs(clients) do vim.list_extend(lsp_info, make_client_info(client)) table.insert(client_names, client.name) end local null_formatters = require "lsp.null-ls.formatters" local null_linters = require "lsp.null-ls.linters" local registered_formatters = null_formatters.list_supported_names(ft) local registered_linters = null_linters.list_supported_names(ft) local registered_providers = {} vim.list_extend(registered_providers, registered_formatters) vim.list_extend(registered_providers, registered_linters) local registered_count = vim.tbl_count(registered_providers) local null_ls_info = { "Formatters and linters", fmt( "* Configured providers: %s%s", table.concat(registered_providers, "  , "), registered_count > 0 and "  " or "" ), } local content_provider = function(popup) local content = {} for _, section in ipairs { M.banner, { "" }, { "" }, header, { "" }, lsp_info, { "" }, null_ls_info, { "" }, { "" }, get_formatter_suggestion_msg(ft), { "" }, { "" }, get_linter_suggestion_msg(ft), } do vim.list_extend(content, section) end return text.align_left(popup, content, 0.5) end local function set_syntax_hl() vim.cmd [[highlight nvimInfoIdentifier gui=bold]] vim.cmd [[highlight link nvimInfoHeader Type]] vim.cmd [[let m=matchadd("nvimInfoHeader", "Language Server Protocol (LSP) info")]] vim.cmd [[let m=matchadd("nvimInfoHeader", "Formatters and linters")]] vim.cmd('let m=matchadd("nvimInfoIdentifier", " ' .. ft .. '$")') vim.cmd 'let m=matchadd("string", "true")' vim.cmd 'let m=matchadd("error", "false")' tbl_set_highlight(registered_providers, "nvimInfoIdentifier") end local Popup = require("interface.popup"):new { win_opts = { number = false }, buf_opts = { modifiable = false, filetype = "lspinfo" }, } Popup:display(content_provider) set_syntax_hl() return Popup end return M