diff --git a/src/nvim/drawscreen.c b/src/nvim/drawscreen.c index 3d7f1572c3..cf9ca0c128 100644 --- a/src/nvim/drawscreen.c +++ b/src/nvim/drawscreen.c @@ -518,6 +518,7 @@ int update_screen(int type) } msg_scrolled = 0; msg_scrolled_at_flush = 0; + msg_grid_scroll_discount = 0; need_wait_return = false; } diff --git a/src/nvim/message.c b/src/nvim/message.c index fd20d9dd81..570c92d1c6 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -128,7 +128,6 @@ static bool msg_ext_history_visible = false; static bool msg_ext_keep_after_cmdline = false; static int msg_grid_pos_at_flush = 0; -static int msg_grid_scroll_discount = 0; static void ui_ext_msg_set_pos(int row, bool scrolled) { @@ -2458,6 +2457,7 @@ void msg_reset_scroll(void) } msg_scrolled = 0; msg_scrolled_at_flush = 0; + msg_grid_scroll_discount = 0; } /// Increment "msg_scrolled". diff --git a/src/nvim/message.h b/src/nvim/message.h index 31cd54f18c..191d3b8da7 100644 --- a/src/nvim/message.h +++ b/src/nvim/message.h @@ -66,6 +66,8 @@ EXTERN ScreenGrid msg_grid_adj INIT(= SCREEN_GRID_INIT); // value of msg_scrolled at latest msg_scroll_flush. EXTERN int msg_scrolled_at_flush INIT(= 0); +EXTERN int msg_grid_scroll_discount INIT(= 0); + #ifdef INCLUDE_GENERATED_DECLARATIONS # include "message.h.generated.h" #endif diff --git a/test/functional/ui/messages_spec.lua b/test/functional/ui/messages_spec.lua index 6b8fa99b38..b1dc9a3eb3 100644 --- a/test/functional/ui/messages_spec.lua +++ b/test/functional/ui/messages_spec.lua @@ -10,9 +10,11 @@ local async_meths = helpers.async_meths local test_build_dir = helpers.test_build_dir local nvim_prog = helpers.nvim_prog local iswin = helpers.iswin +local exec = helpers.exec local exc_exec = helpers.exc_exec local exec_lua = helpers.exec_lua local poke_eventloop = helpers.poke_eventloop +local assert_alive = helpers.assert_alive describe('ui/ext_messages', function() local screen @@ -1258,6 +1260,17 @@ vimComment xxx match /\s"[^\-:.%#=*].*$/ms=s+1,lc=1 excludenl contains=@vim end) end) +it('calling screenstring() after redrawing between messages without UI #20999', function() + clear() + exec([[ + echo repeat('a', 100) + redraw + echo "\n" + call screenstring(1, 1) + ]]) + assert_alive() +end) + describe('ui/ext_messages', function() local screen