lsp: add optional vertical padding, maximal size to floats (#12444)

* add vertical padding to floats

* add max_width, max_height option to float methods

* lint

* lintlint

* guard against nil wrap_at
This commit is contained in:
Christian Clason 2020-07-06 03:09:52 +02:00 committed by GitHub
parent bd5f0e9695
commit f9579d473e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 40 additions and 9 deletions

View File

@ -619,8 +619,10 @@ end
---
--@param contents table of lines to trim and pad
--@param opts dictionary with optional fields
-- - pad_left amount of columns to pad contents at left (default 1)
-- - pad_right amount of columns to pad contents at right (default 1)
-- - pad_left number of columns to pad contents at left (default 1)
-- - pad_right number of columns to pad contents at right (default 1)
-- - pad_top number of lines to pad contents at top (default 0)
-- - pad_bottom number of lines to pad contents at bottom (default 0)
--@return contents table of trimmed and padded lines
function M._trim_and_pad(contents, opts)
validate {
@ -634,6 +636,16 @@ function M._trim_and_pad(contents, opts)
for i, line in ipairs(contents) do
contents[i] = string.format('%s%s%s', left_padding, line:gsub("\r", ""), right_padding)
end
if opts.pad_top then
for _ = 1, opts.pad_top do
table.insert(contents, 1, "")
end
end
if opts.pad_bottom then
for _ = 1, opts.pad_bottom do
table.insert(contents, "")
end
end
return contents
end
@ -651,8 +663,12 @@ end
-- - height of floating window
-- - width of floating window
-- - wrap_at character to wrap at for computing height
-- - pad_left amount of columns to pad contents at left
-- - pad_right amount of columns to pad contents at right
-- - max_width maximal width of floating window
-- - max_height maximal height of floating window
-- - pad_left number of columns to pad contents at left
-- - pad_right number of columns to pad contents at right
-- - pad_top number of lines to pad contents at top
-- - pad_bottom number of lines to pad contents at bottom
-- - separator insert separator after code block
--@return width,height size of float
function M.fancy_floating_markdown(contents, opts)
@ -763,6 +779,8 @@ end
-- - height of floating window
-- - width of floating window
-- - wrap_at character to wrap at for computing height
-- - max_width maximal width of floating window
-- - max_height maximal height of floating window
--@return width,height size of float
function M._make_floating_popup_size(contents, opts)
validate {
@ -773,6 +791,9 @@ function M._make_floating_popup_size(contents, opts)
local width = opts.width
local height = opts.height
local wrap_at = opts.wrap_at
local max_width = opts.max_width
local max_height = opts.max_height
local line_widths = {}
if not width then
@ -783,11 +804,14 @@ function M._make_floating_popup_size(contents, opts)
width = math.max(line_widths[i], width)
end
end
if max_width then
width = math.min(width, max_width)
wrap_at = math.min(wrap_at or max_width, max_width)
end
if not height then
height = #contents
local wrap_at = opts.wrap_at
if wrap_at and width > wrap_at then
if wrap_at and width >= wrap_at then
height = 0
if vim.tbl_isempty(line_widths) then
for _, line in ipairs(contents) do
@ -796,11 +820,14 @@ function M._make_floating_popup_size(contents, opts)
end
else
for i = 1, #contents do
height = height + math.ceil(line_widths[i]/wrap_at)
height = height + math.max(1, math.ceil(line_widths[i]/wrap_at))
end
end
end
end
if max_height then
height = math.min(height, max_height)
end
return width, height
end
@ -813,8 +840,12 @@ end
-- - height of floating window
-- - width of floating window
-- - wrap_at character to wrap at for computing height
-- - pad_left amount of columns to pad contents at left
-- - pad_right amount of columns to pad contents at right
-- - max_width maximal width of floating window
-- - max_height maximal height of floating window
-- - pad_left number of columns to pad contents at left
-- - pad_right number of columns to pad contents at right
-- - pad_top number of lines to pad contents at top
-- - pad_bottom number of lines to pad contents at bottom
--@return bufnr,winnr buffer and window number of floating window or nil
function M.open_floating_preview(contents, filetype, opts)
validate {