fix(ui2): avoid ModeChanged in message window #40788

This commit is contained in:
Barrett Ruth
2026-07-18 06:33:38 -05:00
committed by GitHub
parent 7e91f21986
commit b2bb60d70a
2 changed files with 16 additions and 2 deletions

View File

@@ -486,7 +486,8 @@ function M.msg_show(kind, content, replace_last, _, append, id, trigger)
M.cmd.ids, M.cmd.prev_msg = {}, '' M.cmd.ids, M.cmd.prev_msg = {}, ''
elseif tgt == 'pager' then elseif tgt == 'pager' then
-- Position cursor at start of first or last message at bottom of window. -- Position cursor at start of first or last message at bottom of window.
fn.win_execute(ui.wins.pager, 'norm! ' .. (enter_pager and 'gg0' or 'G0zb')) local lnum = enter_pager and 1 or api.nvim_buf_line_count(ui.bufs.pager)
api.nvim_win_set_cursor(ui.wins.pager, { lnum, 0 })
end end
end end
end end
@@ -718,7 +719,7 @@ function M.set_pos(tgt)
M.dialog_on_key = vim.on_key(dialog_on_key, M.dialog_on_key) M.dialog_on_key = vim.on_key(dialog_on_key, M.dialog_on_key)
elseif tgt == 'msg' then elseif tgt == 'msg' then
-- Ensure last line is visible and first line is at top of window. -- Ensure last line is visible and first line is at top of window.
fn.win_execute(ui.wins.msg, 'norm! Gzb') api.nvim_win_set_cursor(ui.wins.msg, { api.nvim_buf_line_count(ui.bufs.msg), 0 })
elseif tgt == 'pager' and not in_pager then elseif tgt == 'pager' and not in_pager then
enter_pager() enter_pager()
end end

View File

@@ -994,6 +994,19 @@ describe('messages2', function()
]]) ]])
end) end)
it('msg window timer does not trigger ModeChanged #40780', function()
exec_lua(function()
require('vim._core.ui2').enable({ msg = { targets = 'msg', msg = { timeout = 50 } } })
end)
command('let g:modechanged = []')
command([[autocmd ModeChanged i:n call add(g:modechanged, copy(v:event))]])
command([[echo "a" | echo "b" | startinsert]])
screen:sleep(100)
t.eq({}, n.eval('g:modechanged'))
feed('<Esc>')
t.eq({ { old_mode = 'i', new_mode = 'n' } }, n.eval('g:modechanged'))
end)
it('configured targets per kind', function() it('configured targets per kind', function()
exec_lua(function() exec_lua(function()
local targets = { echo = 'msg', list_cmd = 'pager', bufwrite = 'cmd', lua_print = 'cmd' } local targets = { echo = 'msg', list_cmd = 'pager', bufwrite = 'cmd', lua_print = 'cmd' }