From c4ac36bfd9bc9826dde01839d10d0e65a7b3c9e2 Mon Sep 17 00:00:00 2001 From: luukvbaal Date: Mon, 17 Nov 2025 19:34:02 +0100 Subject: [PATCH] fix(ui2): only redraw when necessary #36457 Problem: Until now the UI callback called nvim__redraw() liberally. It should only be needed when Nvim does not update the screen in its own event loop. Solution: Identify which UI events require immediate redrawing. --- runtime/lua/vim/_extui.lua | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/runtime/lua/vim/_extui.lua b/runtime/lua/vim/_extui.lua index bbb534723f..f9da5629d5 100644 --- a/runtime/lua/vim/_extui.lua +++ b/runtime/lua/vim/_extui.lua @@ -42,11 +42,14 @@ local function ui_callback(event, ...) local handler = ext.msg[event] or ext.cmd[event] ext.check_targets() handler(...) - api.nvim__redraw({ - flush = handler ~= ext.cmd.cmdline_hide or nil, - cursor = handler == ext.cmd[event] and true or nil, - win = handler == ext.cmd[event] and ext.wins.cmd or nil, - }) + -- Cmdline mode and non-empty showcmd requires an immediate redraw. + if ext.cmd[event] or event == 'msg_showcmd' and select(1, ...)[1] then + api.nvim__redraw({ + flush = handler ~= ext.cmd.cmdline_hide or nil, + cursor = handler == ext.cmd[event] and true or nil, + win = handler == ext.cmd[event] and ext.wins.cmd or nil, + }) + end end local scheduled_ui_callback = vim.schedule_wrap(ui_callback)