fix(ui2): fix ruler on repeated messages

Problem: a long message is cropped to keep the ruler visible. But when
the message is repeated, it can be written over the ruler, while the
repetition indicator "(1)" is still placed just before the ruler, which
ends up somewhere inside the message.

Solution: currently, long messages are only cropped when setting the
'last' virttext. Make sure this happens after a repeated long message.
This commit is contained in:
Sébastien Hoffmann
2026-07-11 16:38:12 +02:00
parent 2473cb62b7
commit 0ffd74ae85
2 changed files with 16 additions and 0 deletions

View File

@@ -390,6 +390,13 @@ function M.show_msg(tgt, kind, content, replace_last, append, id)
M.virt[tgt][M.virt.idx.dupe][1] = dupe > 0 and { 0, ('(%d)'):format(dupe) } or nil
M.virt[tgt][M.virt.idx.spill][1] = tgt == 'cmd' and M.virt.cmd[M.virt.idx.spill][1] or nil
set_virttext(tgt --[[@as 'cmd'|'msg']], tgt)
if tgt == 'cmd' then
-- make sure repeated long messages are cropped to keep the ruler intact
-- (if this is not scheduled, it breaks messages during textlock)
vim.schedule(function()
set_virttext('last', 'cmd')
end)
end
end
-- Reset message state the next event loop iteration.

View File

@@ -1200,6 +1200,15 @@ describe('messages2', function()
-----------------------------------0,0-1 All|
]])
feed('<C-L>')
-- message with repetition indicator keeps ruler intact
command('echo "-"->repeat(&columns)')
command('echo "-"->repeat(&columns)')
screen:expect([[
^ |
{1:~ }|*12
--------------------------------(1)0,0-1 All|
]])
feed('<C-L>')
-- when the ruler is configured smaller, there is more space for messages
command('set rulerformat=%l | redraw | echo "-"->repeat(&columns)')
screen:expect([[