| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 | local M = {  banner = {    "",    [[    __                          _    ___         ]],    [[   / /   __  ______  ____ _____| |  / (_)___ ___ ]],    [[  / /   / / / / __ \/ __ `/ ___/ | / / / __ `__ \]],    [[ / /___/ /_/ / / / / /_/ / /   | |/ / / / / / / /]],    [[/_____/\__,_/_/ /_/\__,_/_/    |___/_/_/ /_/ /_/ ]],  },}local fmt = string.formatlocal text = require "lvim.interface.text"local lsp_utils = require "lvim.lsp.utils"local function str_list(list)  return #list == 1 and list[1] or fmt("[%s]", table.concat(list, ", "))endlocal function make_formatters_info(ft)  local null_formatters = require "lvim.lsp.null-ls.formatters"  local registered_formatters = null_formatters.list_registered(ft)  local supported_formatters = null_formatters.list_supported(ft)  local section = {    "Formatters info",    fmt(      "* Active: %s%s",      table.concat(registered_formatters, "  , "),      vim.tbl_count(registered_formatters) > 0 and "  " or ""    ),    fmt("* Supported: %s", str_list(supported_formatters)),  }  return sectionendlocal function make_code_actions_info(ft)  local null_actions = require "lvim.lsp.null-ls.code_actions"  local registered_actions = null_actions.list_registered(ft)  local section = {    "Code actions info",    fmt(      "* Active: %s%s",      table.concat(registered_actions, "  , "),      vim.tbl_count(registered_actions) > 0 and "  " or ""    ),  }  return sectionendlocal function make_linters_info(ft)  local null_linters = require "lvim.lsp.null-ls.linters"  local supported_linters = null_linters.list_supported(ft)  local registered_linters = null_linters.list_registered(ft)  local section = {    "Linters info",    fmt(      "* Active: %s%s",      table.concat(registered_linters, "  , "),      vim.tbl_count(registered_linters) > 0 and "  " or ""    ),    fmt("* Supported: %s", str_list(supported_linters)),  }  return sectionendlocal function tbl_set_highlight(terms, highlight_group)  for _, v in pairs(terms) do    vim.cmd('let m=matchadd("' .. highlight_group .. '", "' .. v .. "[ ,│']\")")  endendlocal function make_client_info(client)  if client.name == "null-ls" then    return  end  local client_enabled_caps = lsp_utils.get_client_capabilities(client.id)  local name = client.name  local id = client.id  local filetypes = lsp_utils.get_supported_filetypes(name)  local attached_buffers_list = str_list(vim.lsp.get_buffers_by_client_id(client.id))  local client_info = {    fmt("* name:                      %s", name),    fmt("* id:                        %s", tostring(id)),    fmt("* supported filetype(s):     %s", str_list(filetypes)),    fmt("* attached buffers:          %s", tostring(attached_buffers_list)),    fmt("* root_dir pattern:          %s", tostring(attached_buffers_list)),  }  if not vim.tbl_isempty(client_enabled_caps) then    local caps_text = "* capabilities:              "    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_infoendlocal function make_override_info(ft)  local available = lsp_utils.get_supported_servers_per_filetype(ft)  local overridden = vim.tbl_filter(function(name)    return vim.tbl_contains(available, name)  end, lvim.lsp.override)  local info_lines = { "" }  if #overridden == 0 then    return info_lines  end  info_lines = {    fmt("Overridden %s server(s)", ft),    fmt("* list: %s", str_list(overridden)),  }  return info_linesendfunction M.toggle_popup(ft)  local clients = vim.lsp.get_active_clients(ft)  local client_names = {}  local bufnr = vim.api.nvim_get_current_buf()  local ts_active_buffers = vim.tbl_keys(vim.treesitter.highlighter.active)  local is_treesitter_active = function()    local status = "inactive"    if vim.tbl_contains(ts_active_buffers, bufnr) then      status = "active"    end    return status  end  local header = {    "Buffer info",    fmt("* filetype:                %s", ft),    fmt("* bufnr:                   %s", bufnr),    fmt("* treesitter status:       %s", is_treesitter_active()),  }  local lsp_info = {    "Active client(s)",  }  for _, client in pairs(clients) do    local client_info = make_client_info(client)    if client_info then      vim.list_extend(lsp_info, client_info)    end    table.insert(client_names, client.name)  end  local override_info = make_override_info(ft)  local formatters_info = make_formatters_info(ft)  local linters_info = make_linters_info(ft)  local code_actions_info = make_code_actions_info(ft)  local content_provider = function(popup)    local content = {}    for _, section in ipairs {      M.banner,      { "" },      { "" },      header,      { "" },      lsp_info,      { "" },      override_info,      { "" },      formatters_info,      { "" },      linters_info,      { "" },      code_actions_info,    } do      vim.list_extend(content, section)    end    return text.align_left(popup, content, 0.5)  end  local function set_syntax_hl()    vim.cmd [[highlight LvimInfoIdentifier gui=bold]]    vim.cmd [[highlight link LvimInfoHeader Type]]    vim.fn.matchadd("LvimInfoHeader", "Buffer info")    vim.fn.matchadd("LvimInfoHeader", "Active client(s)")    vim.fn.matchadd("LvimInfoHeader", fmt("Overridden %s server(s)", ft))    vim.fn.matchadd("LvimInfoHeader", "Formatters info")    vim.fn.matchadd("LvimInfoHeader", "Linters info")    vim.fn.matchadd("LvimInfoHeader", "Code actions info")    vim.fn.matchadd("LvimInfoIdentifier", " " .. ft .. "$")    vim.fn.matchadd("string", "true")    vim.fn.matchadd("string", "active")    vim.fn.matchadd("string", "")    vim.fn.matchadd("boolean", "inactive")    vim.fn.matchadd("error", "false")    tbl_set_highlight(require("lvim.lsp.null-ls.formatters").list_registered(ft), "LvimInfoIdentifier")    tbl_set_highlight(require("lvim.lsp.null-ls.linters").list_registered(ft), "LvimInfoIdentifier")    tbl_set_highlight(require("lvim.lsp.null-ls.code_actions").list_registered(ft), "LvimInfoIdentifier")  end  local Popup = require("lvim.interface.popup"):new {    win_opts = { number = false },    buf_opts = { modifiable = false, filetype = "lspinfo" },  }  Popup:display(content_provider)  set_syntax_hl()  return Popupendreturn M
 |