mirror of
https://github.com/LunarVim/LunarVim.git
synced 2025-08-30 06:39:33 +02:00
[Feature] Encapsulate interface logic (#1320)
* Provide a utility function for aligning text * Replace lvim banner with one using only ASCII chars * Use strings.format instead of .. operator * Center text in the popup based on its dimentions * Minor improvements * Provide a popup factory function * Add function documentation * Improve text alignment * Print marker only if provider list is not empty * Format client capabilities as list * Pretty format lsp client capabilities * Add a metatable to popup.lua * Improve rendering when no lsp is available * Take cmdheight into acount when computing popup size and pos Co-authored-by: kylo252 <59826753+kylo252@users.noreply.github.com>
This commit is contained in:
parent
944dd48935
commit
9b36872d88
3 changed files with 242 additions and 136 deletions
79
lua/interface/text.lua
Normal file
79
lua/interface/text.lua
Normal file
|
@ -0,0 +1,79 @@
|
|||
local M = {}
|
||||
|
||||
local function max_len_line(lines)
|
||||
local max_len = 0
|
||||
|
||||
for _, line in ipairs(lines) do
|
||||
local line_len = line:len()
|
||||
if line_len > max_len then
|
||||
max_len = line_len
|
||||
end
|
||||
end
|
||||
|
||||
return max_len
|
||||
end
|
||||
|
||||
--- Center align lines relatively to the parent container
|
||||
-- @param container The container where lines will be displayed
|
||||
-- @param lines The text to align
|
||||
-- @param alignment The alignment value, range: [0-1]
|
||||
function M.align(container, lines, alignment)
|
||||
local max_len = max_len_line(lines)
|
||||
local indent_amount = math.ceil(math.max(container.width - max_len, 0) * alignment)
|
||||
return M.shift_left(lines, indent_amount)
|
||||
end
|
||||
|
||||
--- Shift lines by a given amount
|
||||
-- @params lines The lines the shift
|
||||
-- @param amount The amount of spaces to add
|
||||
function M.shift_left(lines, amount)
|
||||
local output = {}
|
||||
local padding = string.rep(" ", amount)
|
||||
|
||||
for _, line in ipairs(lines) do
|
||||
table.insert(output, padding .. line)
|
||||
end
|
||||
|
||||
return output
|
||||
end
|
||||
|
||||
--- Pretty format tables
|
||||
-- @param entries The table to format
|
||||
-- @param col_count The number of column to span the table on
|
||||
-- @param col_sep The separator between each colummn, default: " "
|
||||
function M.format_table(entries, col_count, col_sep)
|
||||
col_sep = col_sep or " "
|
||||
|
||||
local col_rows = math.ceil(vim.tbl_count(entries) / col_count)
|
||||
local cols = {}
|
||||
local count = 0
|
||||
|
||||
for i, entry in ipairs(entries) do
|
||||
if ((i - 1) % col_rows) == 0 then
|
||||
table.insert(cols, {})
|
||||
count = count + 1
|
||||
end
|
||||
table.insert(cols[count], entry)
|
||||
end
|
||||
|
||||
local col_max_len = {}
|
||||
for _, col in ipairs(cols) do
|
||||
table.insert(col_max_len, max_len_line(col))
|
||||
end
|
||||
|
||||
local output = {}
|
||||
for i, col in ipairs(cols) do
|
||||
for j, entry in ipairs(col) do
|
||||
if not output[j] then
|
||||
output[j] = entry
|
||||
else
|
||||
local padding = string.rep(" ", col_max_len[i - 1] - cols[i - 1][j]:len())
|
||||
output[j] = output[j] .. padding .. col_sep .. entry
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return output
|
||||
end
|
||||
|
||||
return M
|
Loading…
Add table
Add a link
Reference in a new issue