From 0ffd74ae85bf9c6c41c904775ec6ec6d8a3eebb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Hoffmann?= Date: Sat, 11 Jul 2026 16:38:12 +0200 Subject: [PATCH] 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. --- runtime/lua/vim/_core/ui2/messages.lua | 7 +++++++ test/functional/ui/messages2_spec.lua | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/runtime/lua/vim/_core/ui2/messages.lua b/runtime/lua/vim/_core/ui2/messages.lua index 4182fd573b..7a6bd6e4c0 100644 --- a/runtime/lua/vim/_core/ui2/messages.lua +++ b/runtime/lua/vim/_core/ui2/messages.lua @@ -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. diff --git a/test/functional/ui/messages2_spec.lua b/test/functional/ui/messages2_spec.lua index 334b42365d..30acb62925 100644 --- a/test/functional/ui/messages2_spec.lua +++ b/test/functional/ui/messages2_spec.lua @@ -1200,6 +1200,15 @@ describe('messages2', function() -----------------------------------0,0-1 All| ]]) feed('') + -- 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('') -- when the ruler is configured smaller, there is more space for messages command('set rulerformat=%l | redraw | echo "-"->repeat(&columns)') screen:expect([[