From 53def2a877b6424b03fd26bc88f234e59e2a160f Mon Sep 17 00:00:00 2001 From: luukvbaal Date: Fri, 28 Mar 2025 12:52:57 +0100 Subject: [PATCH] fix(cmdline): empty ext_cmdline block events for : #33118 Problem: An ext_cmdline block event that should be empty after : re-emits the previous cmdline. Solution: Clear `last_cmdline` even when `new_last_cmdline == NULL`. (cherry picked from commit 95ab723995f1cc1a11c62355fbac64597526d47e) --- src/nvim/ex_docmd.c | 6 +++--- test/functional/ui/cmdline_spec.lua | 25 +++++++++++++++++++------ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 640c729e3b..5ccb8339b8 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -577,7 +577,8 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) int indent = cstack.cs_idx < 0 ? 0 : (cstack.cs_idx + 1) * 2; if (count >= 1 && getline_equal(fgetline, cookie, getexline)) { if (ui_has(kUICmdline)) { - ui_ext_cmdline_block_append((size_t)MAX(0, block_indent), last_cmdline); + char *line = last_cmdline ? last_cmdline : ""; + ui_ext_cmdline_block_append((size_t)MAX(0, block_indent), line); block_indent = indent; } else if (count == 1) { // Need to set msg_didout for the first line after an ":if", @@ -683,8 +684,7 @@ int do_cmdline(char *cmdline, LineGetter fgetline, void *cookie, int flags) // If the command was typed, remember it for the ':' register. // Do this AFTER executing the command to make :@: work. - if (getline_equal(fgetline, cookie, getexline) - && new_last_cmdline != NULL) { + if (getline_equal(fgetline, cookie, getexline)) { xfree(last_cmdline); last_cmdline = new_last_cmdline; new_last_cmdline = NULL; diff --git a/test/functional/ui/cmdline_spec.lua b/test/functional/ui/cmdline_spec.lua index 99af9f9f73..4d8a1ee6f9 100644 --- a/test/functional/ui/cmdline_spec.lua +++ b/test/functional/ui/cmdline_spec.lua @@ -886,7 +886,7 @@ local function test_cmdline(linegrid) }, cmdline_block = { { { 'if 1' } } }, }) - feed(':let x = 1') + feed('let x = 1') screen:expect({ grid = s1, cmdline = { @@ -897,20 +897,33 @@ local function test_cmdline(linegrid) pos = 0, }, }, - cmdline_block = { { { 'if 1' } }, { { ' :let x = 1' } } }, + cmdline_block = { { { 'if 1' } }, { { ' let x = 1' } } }, }) - feed(':endif') + feed('') screen:expect({ grid = s1, cmdline = { { - content = { { ':endif' } }, + content = { { '' } }, firstc = ':', indent = 2, - pos = 6, + pos = 0, }, }, - cmdline_block = { { { 'if 1' } }, { { ' :let x = 1' } } }, + cmdline_block = { { { 'if 1' } }, { { ' let x = 1' } }, { { ' ' } } }, + }) + feed('endif') + screen:expect({ + grid = s1, + cmdline = { + { + content = { { 'endif' } }, + firstc = ':', + indent = 2, + pos = 5, + }, + }, + cmdline_block = { { { 'if 1' } }, { { ' let x = 1' } }, { { ' ' } } }, }) feed('') screen:expect({