From 5ddb4b672ebbd276b2008fa32466a968453b1780 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Fri, 19 Jun 2026 14:25:10 +0200 Subject: [PATCH] fix(ui2): "msg_history_show" error while in cmdwin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: Executing :messages while in cmdwin fails: Error in "msg_history_show" UI event handler (ns=nvim.ui2): Lua: …/_core/ui2/messages.lua:699: Invalid 'height': expected positive Integer stack traceback: [C]: in function 'nvim_win_set_config' …/_core/ui2/messages.lua:699: in function 'set_pos' …/_core/ui2/messages.lua:329: in function 'set_target_pos' …/_core/ui2/messages.lua:389: in function 'show_msg' …/_core/ui2/messages.lua:553: in function 'handler' …/_core/ui2.lua:161: in function 'ui_callback' …/_core/ui2.lua:210: in function <…/_core/ui2.lua:202> The bug: when `texth.all` is small (e.g. 0 from a hidden pager whose new content isn't laid out yet), or when the available height after subtracting the cmdwin is small, `math.min(min, …)` can yield 0, and `nvim_win_set_config` rejects `height=0`. Solution: Floor at 1. --- runtime/lua/vim/_core/ui2/messages.lua | 7 +++++-- test/functional/editor/cmdwin_spec.lua | 7 +++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/runtime/lua/vim/_core/ui2/messages.lua b/runtime/lua/vim/_core/ui2/messages.lua index 46233e2900..86f7db7a32 100644 --- a/runtime/lua/vim/_core/ui2/messages.lua +++ b/runtime/lua/vim/_core/ui2/messages.lua @@ -624,13 +624,16 @@ local function win_row_height_border(tgt, min) local cfgmin = ui.cfg.msg[tgt].height --[[@as number]] min = math.min(min, cfgmin < 1 and math.ceil(o.lines * cfgmin) or cfgmin) if tgt ~= 'pager' then - return (tgt == 'msg' and 0 or 1) - ui.cmd.wmnumode, min, min < o.lines - ui.cmdheight + return (tgt == 'msg' and 0 or 1) - ui.cmd.wmnumode, + math.max(1, min), + min < o.lines - ui.cmdheight end local cmdwin = fn.getcmdwintype() ~= was_cmdwin and api.nvim_win_get_height(0) or 0 local global_stl = (cmdwin > 0 or o.laststatus == 3) and 1 or 0 local row = 1 - cmdwin - global_stl local top = min < o.lines - ui.cmdheight - global_stl - cmdwin - return row, math.min(min, o.lines - (top and 1 or 0) - ui.cmdheight - global_stl - cmdwin), top + local height = math.min(min, o.lines - (top and 1 or 0) - ui.cmdheight - global_stl - cmdwin) + return row, math.max(1, height), top end local function enter_pager() diff --git a/test/functional/editor/cmdwin_spec.lua b/test/functional/editor/cmdwin_spec.lua index 85bfe8e6aa..347b4edd3b 100644 --- a/test/functional/editor/cmdwin_spec.lua +++ b/test/functional/editor/cmdwin_spec.lua @@ -43,6 +43,13 @@ describe('cmdwin', function() eq('echo "hi"', api.nvim_get_current_line()) end) + it('history entry with literal newline char', function() + fn.histadd(':', 'echo \n x') + feed('q:') + eq(':', fn.getcmdwintype()) + eq('echo \0 x', api.nvim_buf_get_lines(0, 0, 1, false)[1]) + end) + it(' in normal mode cancels without executing', function() feed('q:') feed('iecho "nope"')