fix(highlight): refresh highlight attrs before message output #25737

Problem:
When MsgArea highlight is changed, the next message may flash
and disappear because msg_start() renders with stale highlight attributes.

msg_puts_len() uses HL_ATTR(HLF_MSG) to render message text, which
happens before update_screen() calls highlight_changed().
So the message is rendered with outdated attrs.

Solution:
Call highlight_changed() in msg_start().
This commit is contained in:
glepnir
2026-02-17 20:59:07 +08:00
committed by GitHub
parent 73c4472d4a
commit bd12aef784
5 changed files with 112 additions and 62 deletions

View File

@@ -2670,4 +2670,18 @@ describe('fg/bg special colors', function()
eq(new_guifg, eval('synIDattr(hlID("Visual"), "bg#")'))
eq(new_guibg, eval('synIDattr(hlID("Visual"), "sp#")'))
end)
it('changed highlight is reflected in messages before redraw #17832', function()
local screen = Screen.new(50, 7, { rgb = true })
command('set termguicolors')
-- :echomsg in the same request, before the next redraw.
command('call nvim_set_hl(0, "MsgArea", {"fg": "Red"}) | echomsg "foo"')
screen:expect({
grid = [[
^ |
{1:~ }|*5
{19:foo }|
]],
})
end)
end)