fix(picker.highlight): resolve all text chunks when needed. Not just the first.

This commit is contained in:
Folke Lemaitre 2025-11-03 13:17:04 +01:00
parent ab48eebeb3
commit 962aadd310
No known key found for this signature in database
GPG key ID: 9B52594D560070AB

View file

@ -302,36 +302,39 @@ end
---@param line snacks.picker.Highlight[] ---@param line snacks.picker.Highlight[]
---@param max_width number ---@param max_width number
function M.resolve(line, max_width) function M.resolve(line, max_width)
local ret = {} ---@type snacks.picker.Highlight[]
local offset = 0 local offset = 0
local width = 0 local width = 0
local resolve ---@type number? local resolve ---@type number?
for t, text in ipairs(line) do while true do
local w = M.offset({ text }, { char_idx = true }) for t, text in ipairs(line) do
if not resolve and type(text) == "table" and text.resolve then local w = M.offset({ text }, { char_idx = true })
---@cast text snacks.picker.Text if not resolve and type(text) == "table" and text.resolve then
resolve = t ---@cast text snacks.picker.Text
elseif resolve then resolve = t
width = width + w elseif resolve then
width = width + w
else
width = width + w
offset = offset + w
end
end
if resolve then
local ret = {} ---@type snacks.picker.Highlight[]
vim.list_extend(ret, line, 1, resolve - 1)
offset = M.offset(ret)
vim.list_extend(ret, line[resolve].resolve(max_width - width))
local diff = M.offset(ret) - offset
vim.list_extend(ret, line, resolve + 1)
M.fix_offset(ret, diff, resolve + 1)
line = ret
ret = {}
resolve = nil
else else
width = width + w return line
offset = offset + w
end end
end end
if resolve then
vim.list_extend(ret, line, 1, resolve - 1)
offset = M.offset(ret)
vim.list_extend(ret, line[resolve].resolve(max_width - width))
local diff = M.offset(ret) - offset
vim.list_extend(ret, line, resolve + 1)
M.fix_offset(ret, diff, resolve + 1)
else
return line
end
return ret
end end
---@param line snacks.picker.Highlight[] ---@param line snacks.picker.Highlight[]