|
@@ -1,128 +1,63 @@
|
|
-local M = {}
|
|
|
|
-local indent = " "
|
|
|
|
-
|
|
|
|
-M.banner = {
|
|
|
|
- " ",
|
|
|
|
- indent
|
|
|
|
- .. "⠀⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀ ⠀⠀⠀ ⠀⠀ ⣺⡿⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀",
|
|
|
|
- indent
|
|
|
|
- .. "⠀⣿⠇⠀⠀⠀⠀⠀⣤⡄⠀⠀⢠⣤⡄⠀.⣠⣤⣤⣤⡀⠀⠀⢀⣤⣤⣤⣤⡄⠀⠀⠀⣤⣄⣤⣤⣤⠀⠀ ⣿⣯ ⣿⡟⠀ ⣤⣤⠀⠀⠀⠀⣠⣤⣤⣤⣄⣤⣤",
|
|
|
|
- indent
|
|
|
|
- .. "⢠⣿⠀⠀⠀⠀⠀⠀⣿⠃⠀⠀⣸⣿⠁⠀⣿⣿⠉⠀⠈⣿⡇⠀⠀⠛⠋⠀⠀⢹⣿⠀⠀⠀⣿⠏⠀⠸⠿⠃⠀⣿⣿⠀⣰⡟⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀⣿⡟⢸⣿⡇⢀⣿",
|
|
|
|
- indent
|
|
|
|
- .. "⣸⡇⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⣿⡟⠀⢠⣿⡇⠀⠀⢰⣿⡇⠀⣰⣾⠟⠛⠛⣻⡇⠀⠀⢸⡿⠀⠀⠀⠀⠀⠀⢻⣿⢰⣿⠀⠀⠀⠀⠀⠀⣾⡇⠀⠀⠀⢸⣿⠇⢸⣿⠀⢸⡏",
|
|
|
|
- indent
|
|
|
|
- .. "⣿⣧⣤⣤⣤⡄⠀⠘⣿⣤⣤⡤⣿⠇⠀⢸⣿⠁⠀⠀⣼⣿⠀⠀⢿⣿⣤⣤⠔⣿⠃⠀⠀⣾⡇⠀⠀⠀⠀⠀⠀⢸⣿⣿⠋⠀⠀⠀⢠⣤⣤⣿⣥⣤⡄⠀⣼⣿⠀⣸⡏⠀⣿⠃",
|
|
|
|
- indent
|
|
|
|
- .. "⠉⠉⠉⠉⠉⠁⠀⠀⠈⠉⠉⠀⠉⠀⠀⠈⠉⠀⠀⠀⠉⠉⠀⠀⠀⠉⠉⠁⠈⠉⠀⠀⠀⠉⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠀⠀⠀⠀⠈⠉⠉⠉⠉⠉⠁⠀⠉⠁⠀⠉⠁⠀⠉⠀",
|
|
|
|
- "",
|
|
|
|
|
|
+local M = {
|
|
|
|
+ banner = {
|
|
|
|
+ "",
|
|
|
|
+ [[ __ _ ___ ]],
|
|
|
|
+ [[ / / __ ______ ____ _____| | / (_)___ ___ ]],
|
|
|
|
+ [[ / / / / / / __ \/ __ `/ ___/ | / / / __ `__ \]],
|
|
|
|
+ [[ / /___/ /_/ / / / / /_/ / / | |/ / / / / / / /]],
|
|
|
|
+ [[/_____/\__,_/_/ /_/\__,_/_/ |___/_/_/ /_/ /_/ ]],
|
|
|
|
+ },
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+local fmt = string.format
|
|
|
|
+
|
|
local function str_list(list)
|
|
local function str_list(list)
|
|
- return "[ " .. table.concat(list, ", ") .. " ]"
|
|
|
|
|
|
+ return fmt("[ %s ]", table.concat(list, ", "))
|
|
end
|
|
end
|
|
|
|
|
|
local function get_formatter_suggestion_msg(ft)
|
|
local function get_formatter_suggestion_msg(ft)
|
|
local null_formatters = require "lsp.null-ls.formatters"
|
|
local null_formatters = require "lsp.null-ls.formatters"
|
|
local supported_formatters = null_formatters.list_available(ft)
|
|
local supported_formatters = null_formatters.list_available(ft)
|
|
- return {
|
|
|
|
- indent
|
|
|
|
- .. "───────────────────────────────────────────────────────────────────",
|
|
|
|
- "",
|
|
|
|
- indent .. " HINT ",
|
|
|
|
- "",
|
|
|
|
- indent .. "* List of supported formatters: " .. str_list(supported_formatters),
|
|
|
|
- indent .. "* Configured formatter needs to be installed and executable.",
|
|
|
|
- indent .. "* Enable installed formatter(s) with following config in ~/.config/lvim/config.lua",
|
|
|
|
- "",
|
|
|
|
- indent .. " lvim.lang." .. tostring(ft) .. [[.formatters = { { exe = ']] .. table.concat(
|
|
|
|
- supported_formatters,
|
|
|
|
- "│"
|
|
|
|
- ) .. [[' } }]],
|
|
|
|
|
|
+ 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", USER_CONFIG_PATH),
|
|
|
|
+ "",
|
|
|
|
+ fmt(" lvim.lang.%s.formatters = { { exe = '%s' } }", ft, table.concat(supported_formatters, "│")),
|
|
|
|
+ })
|
|
|
|
+ end
|
|
|
|
+
|
|
|
|
+ return section
|
|
end
|
|
end
|
|
|
|
|
|
local function get_linter_suggestion_msg(ft)
|
|
local function get_linter_suggestion_msg(ft)
|
|
local null_linters = require "lsp.null-ls.linters"
|
|
local null_linters = require "lsp.null-ls.linters"
|
|
local supported_linters = null_linters.list_available(ft)
|
|
local supported_linters = null_linters.list_available(ft)
|
|
- return {
|
|
|
|
- indent
|
|
|
|
- .. "───────────────────────────────────────────────────────────────────",
|
|
|
|
- "",
|
|
|
|
- indent .. " HINT ",
|
|
|
|
- "",
|
|
|
|
- indent .. "* List of supported linters: " .. str_list(supported_linters),
|
|
|
|
- indent .. "* Configured linter needs to be installed and executable.",
|
|
|
|
- indent .. "* Enable installed linter(s) with following config in ~/.config/lvim/config.lua",
|
|
|
|
- "",
|
|
|
|
- indent
|
|
|
|
- .. " lvim.lang."
|
|
|
|
- .. tostring(ft)
|
|
|
|
- .. [[.linters = { { exe = ']]
|
|
|
|
- .. table.concat(supported_linters, "│")
|
|
|
|
- .. [[' } }]],
|
|
|
|
|
|
+ local section = {
|
|
|
|
+ " HINT ",
|
|
"",
|
|
"",
|
|
|
|
+ fmt("* List of supported linters: %s", str_list(supported_linters)),
|
|
}
|
|
}
|
|
-end
|
|
|
|
|
|
|
|
----creates an average size popup
|
|
|
|
----@param buf_lines a list of lines to print
|
|
|
|
----@param callback could be used to set syntax highlighting rules for example
|
|
|
|
----@return bufnr buffer number of the created buffer
|
|
|
|
----@return win_id window ID of the created popup
|
|
|
|
-function M.create_simple_popup(buf_lines, callback)
|
|
|
|
- -- runtime/lua/vim/lsp/util.lua
|
|
|
|
- local bufnr = vim.api.nvim_create_buf(false, true)
|
|
|
|
- local height_percentage = 0.9
|
|
|
|
- local width_percentage = 0.8
|
|
|
|
- local row_start_percentage = (1 - height_percentage) / 2
|
|
|
|
- local col_start_percentage = (1 - width_percentage) / 2
|
|
|
|
- local opts = {}
|
|
|
|
- opts.relative = "editor"
|
|
|
|
- opts.height = math.min(math.ceil(vim.o.lines * height_percentage), #buf_lines)
|
|
|
|
- opts.row = math.ceil(vim.o.lines * row_start_percentage)
|
|
|
|
- opts.col = math.floor(vim.o.columns * col_start_percentage)
|
|
|
|
- opts.width = math.floor(vim.o.columns * width_percentage)
|
|
|
|
- opts.style = "minimal"
|
|
|
|
- opts.border = "rounded"
|
|
|
|
- --[[
|
|
|
|
- opts.border = {
|
|
|
|
- lvim.builtin.telescope.defaults.borderchars[5], -- "┌",
|
|
|
|
- lvim.builtin.telescope.defaults.borderchars[3], -- "-",
|
|
|
|
- lvim.builtin.telescope.defaults.borderchars[6], -- "┐",
|
|
|
|
- lvim.builtin.telescope.defaults.borderchars[2], -- "|",
|
|
|
|
- lvim.builtin.telescope.defaults.borderchars[7], -- "┘",
|
|
|
|
- lvim.builtin.telescope.defaults.borderchars[3], -- "-",
|
|
|
|
- lvim.builtin.telescope.defaults.borderchars[8], -- "└",
|
|
|
|
- lvim.builtin.telescope.defaults.borderchars[4], -- "|",
|
|
|
|
- }
|
|
|
|
- --]]
|
|
|
|
-
|
|
|
|
- local win_id = vim.api.nvim_open_win(bufnr, true, opts)
|
|
|
|
-
|
|
|
|
- vim.api.nvim_win_set_buf(win_id, bufnr)
|
|
|
|
- -- this needs to be window option!
|
|
|
|
- vim.api.nvim_win_set_option(win_id, "number", false)
|
|
|
|
- vim.cmd "setlocal nocursorcolumn"
|
|
|
|
- vim.cmd "setlocal wrap"
|
|
|
|
- -- set buffer options
|
|
|
|
- vim.api.nvim_buf_set_option(bufnr, "filetype", "lspinfo")
|
|
|
|
- vim.lsp.util.close_preview_autocmd({ "BufHidden", "BufLeave" }, win_id)
|
|
|
|
- buf_lines = vim.lsp.util._trim(buf_lines, {})
|
|
|
|
- vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, buf_lines)
|
|
|
|
- vim.api.nvim_buf_set_option(bufnr, "modifiable", false)
|
|
|
|
- if type(callback) == "function" then
|
|
|
|
- callback()
|
|
|
|
|
|
+ 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", USER_CONFIG_PATH),
|
|
|
|
+ "",
|
|
|
|
+ fmt(" lvim.lang.%s.linters = { { exe = '%s' } }", ft, table.concat(supported_linters, "│")),
|
|
|
|
+ })
|
|
end
|
|
end
|
|
- return bufnr, win_id
|
|
|
|
|
|
+
|
|
|
|
+ return section
|
|
end
|
|
end
|
|
|
|
|
|
local function tbl_set_highlight(terms, highlight_group)
|
|
local function tbl_set_highlight(terms, highlight_group)
|
|
- if type(terms) ~= "table" then
|
|
|
|
- return
|
|
|
|
- end
|
|
|
|
-
|
|
|
|
for _, v in pairs(terms) do
|
|
for _, v in pairs(terms) do
|
|
vim.cmd('let m=matchadd("' .. highlight_group .. '", "' .. v .. "[ ,│']\")")
|
|
vim.cmd('let m=matchadd("' .. highlight_group .. '", "' .. v .. "[ ,│']\")")
|
|
end
|
|
end
|
|
@@ -136,67 +71,90 @@ function M.toggle_popup(ft)
|
|
local client_name = ""
|
|
local client_name = ""
|
|
local client_id = 0
|
|
local client_id = 0
|
|
local document_formatting = false
|
|
local document_formatting = false
|
|
- local num_caps = 0
|
|
|
|
if client ~= nil then
|
|
if client ~= nil then
|
|
is_client_active = not client.is_stopped()
|
|
is_client_active = not client.is_stopped()
|
|
client_enabled_caps = require("lsp").get_ls_capabilities(client.id)
|
|
client_enabled_caps = require("lsp").get_ls_capabilities(client.id)
|
|
- num_caps = vim.tbl_count(client_enabled_caps)
|
|
|
|
client_name = client.name
|
|
client_name = client.name
|
|
client_id = client.id
|
|
client_id = client.id
|
|
document_formatting = client.resolved_capabilities.document_formatting
|
|
document_formatting = client.resolved_capabilities.document_formatting
|
|
end
|
|
end
|
|
|
|
|
|
- local buf_lines = {}
|
|
|
|
- vim.list_extend(buf_lines, M.banner)
|
|
|
|
-
|
|
|
|
local header = {
|
|
local header = {
|
|
- indent .. "Detected filetype: " .. tostring(ft),
|
|
|
|
- indent .. "Treesitter active: " .. tostring(next(vim.treesitter.highlighter.active) ~= nil),
|
|
|
|
- "",
|
|
|
|
|
|
+ fmt("Detected filetype: %s", ft),
|
|
|
|
+ fmt("Treesitter active: %s", tostring(next(vim.treesitter.highlighter.active) ~= nil)),
|
|
}
|
|
}
|
|
- vim.list_extend(buf_lines, header)
|
|
|
|
|
|
|
|
|
|
+ local text = require "interface.text"
|
|
local lsp_info = {
|
|
local lsp_info = {
|
|
- indent .. "Language Server Protocol (LSP) info",
|
|
|
|
- indent .. "* Associated server: " .. client_name,
|
|
|
|
- indent .. "* Active: " .. tostring(is_client_active) .. " (id: " .. tostring(client_id) .. ")",
|
|
|
|
- indent .. "* Supports formatting: " .. tostring(document_formatting),
|
|
|
|
- indent .. "* Capabilities list: " .. table.concat(vim.list_slice(client_enabled_caps, 1, num_caps / 2), ", "),
|
|
|
|
- indent .. indent .. indent .. table.concat(vim.list_slice(client_enabled_caps, ((num_caps / 2) + 1)), ", "),
|
|
|
|
- "",
|
|
|
|
|
|
+ "Language Server Protocol (LSP) info",
|
|
|
|
+ fmt("* Associated server: %s", client_name),
|
|
|
|
+ fmt("* Active: %s (id: %d)", tostring(is_client_active), client_id),
|
|
|
|
+ fmt("* Supports formatting: %s", tostring(document_formatting)),
|
|
}
|
|
}
|
|
- vim.list_extend(buf_lines, lsp_info)
|
|
|
|
-
|
|
|
|
|
|
+ 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_left(enabled_caps, caps_text_len)
|
|
|
|
+ enabled_caps[1] = fmt("%s%s", caps_text, enabled_caps[1]:sub(caps_text_len + 1))
|
|
|
|
+ vim.list_extend(lsp_info, enabled_caps)
|
|
|
|
+ end
|
|
local null_ls = require "lsp.null-ls"
|
|
local null_ls = require "lsp.null-ls"
|
|
local registered_providers = null_ls.list_supported_provider_names(ft)
|
|
local registered_providers = null_ls.list_supported_provider_names(ft)
|
|
|
|
+ local registered_count = vim.tbl_count(registered_providers)
|
|
local null_ls_info = {
|
|
local null_ls_info = {
|
|
- indent .. "Formatters and linters",
|
|
|
|
- indent .. "* Configured providers: " .. table.concat(registered_providers, " , ") .. " ",
|
|
|
|
|
|
+ "Formatters and linters",
|
|
|
|
+ fmt(
|
|
|
|
+ "* Configured providers: %s%s",
|
|
|
|
+ table.concat(registered_providers, " , "),
|
|
|
|
+ registered_count > 0 and " " or ""
|
|
|
|
+ ),
|
|
}
|
|
}
|
|
- vim.list_extend(buf_lines, null_ls_info)
|
|
|
|
|
|
|
|
local null_formatters = require "lsp.null-ls.formatters"
|
|
local null_formatters = require "lsp.null-ls.formatters"
|
|
local missing_formatters = null_formatters.list_unsupported_names(ft)
|
|
local missing_formatters = null_formatters.list_unsupported_names(ft)
|
|
- if vim.tbl_count(missing_formatters) > 0 then
|
|
|
|
- local missing_formatters_status = {
|
|
|
|
- indent .. "* Missing formatters: " .. table.concat(missing_formatters, " , ") .. " ",
|
|
|
|
|
|
+ local missing_formatters_status = {}
|
|
|
|
+ if not vim.tbl_isempty(missing_formatters) then
|
|
|
|
+ missing_formatters_status = {
|
|
|
|
+ fmt("* Missing formatters: %s", table.concat(missing_formatters, " , ") .. " "),
|
|
}
|
|
}
|
|
- vim.list_extend(buf_lines, missing_formatters_status)
|
|
|
|
end
|
|
end
|
|
|
|
|
|
local null_linters = require "lsp.null-ls.linters"
|
|
local null_linters = require "lsp.null-ls.linters"
|
|
local missing_linters = null_linters.list_unsupported_names(ft)
|
|
local missing_linters = null_linters.list_unsupported_names(ft)
|
|
- if vim.tbl_count(missing_linters) > 0 then
|
|
|
|
- local missing_linters_status = {
|
|
|
|
- indent .. "* Missing linters: " .. table.concat(missing_linters, " , ") .. " ",
|
|
|
|
|
|
+ local missing_linters_status = {}
|
|
|
|
+ if not vim.tbl_isempty(missing_linters) then
|
|
|
|
+ missing_linters_status = {
|
|
|
|
+ fmt("* Missing linters: %s", table.concat(missing_linters, " , ") .. " "),
|
|
}
|
|
}
|
|
- vim.list_extend(buf_lines, missing_linters_status)
|
|
|
|
end
|
|
end
|
|
|
|
|
|
- vim.list_extend(buf_lines, { "" })
|
|
|
|
-
|
|
|
|
- vim.list_extend(buf_lines, get_formatter_suggestion_msg(ft))
|
|
|
|
- vim.list_extend(buf_lines, get_linter_suggestion_msg(ft))
|
|
|
|
|
|
+ local content_provider = function(popup)
|
|
|
|
+ local content = {}
|
|
|
|
+
|
|
|
|
+ for _, section in ipairs {
|
|
|
|
+ M.banner,
|
|
|
|
+ { "" },
|
|
|
|
+ { "" },
|
|
|
|
+ header,
|
|
|
|
+ { "" },
|
|
|
|
+ lsp_info,
|
|
|
|
+ { "" },
|
|
|
|
+ null_ls_info,
|
|
|
|
+ missing_formatters_status,
|
|
|
|
+ missing_linters_status,
|
|
|
|
+ { "" },
|
|
|
|
+ { "" },
|
|
|
|
+ get_formatter_suggestion_msg(ft),
|
|
|
|
+ { "" },
|
|
|
|
+ { "" },
|
|
|
|
+ get_linter_suggestion_msg(ft),
|
|
|
|
+ } do
|
|
|
|
+ vim.list_extend(content, section)
|
|
|
|
+ end
|
|
|
|
+
|
|
|
|
+ return text.align(popup, content, 0.5)
|
|
|
|
+ end
|
|
|
|
|
|
local function set_syntax_hl()
|
|
local function set_syntax_hl()
|
|
vim.cmd [[highlight LvimInfoIdentifier gui=bold]]
|
|
vim.cmd [[highlight LvimInfoIdentifier gui=bold]]
|
|
@@ -214,6 +172,13 @@ function M.toggle_popup(ft)
|
|
vim.cmd('let m=matchadd("LvimInfoIdentifier", "' .. client_name .. '")')
|
|
vim.cmd('let m=matchadd("LvimInfoIdentifier", "' .. client_name .. '")')
|
|
end
|
|
end
|
|
|
|
|
|
- return M.create_simple_popup(buf_lines, set_syntax_hl)
|
|
|
|
|
|
+ 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
|
|
end
|
|
return M
|
|
return M
|