fix(cmdline): empty ext_cmdline block events for :<CR> #33118

Problem:  An ext_cmdline block event that should be empty after :<CR>
          re-emits the previous cmdline.
Solution: Clear `last_cmdline` even when `new_last_cmdline == NULL`.
(cherry picked from commit 95ab723995)
This commit is contained in:
luukvbaal
2025-03-28 12:52:57 +01:00
committed by github-actions[bot]
parent c61e8c6e70
commit 53def2a877
2 changed files with 22 additions and 9 deletions

View File

@@ -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; int indent = cstack.cs_idx < 0 ? 0 : (cstack.cs_idx + 1) * 2;
if (count >= 1 && getline_equal(fgetline, cookie, getexline)) { if (count >= 1 && getline_equal(fgetline, cookie, getexline)) {
if (ui_has(kUICmdline)) { 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; block_indent = indent;
} else if (count == 1) { } else if (count == 1) {
// Need to set msg_didout for the first line after an ":if", // 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. // If the command was typed, remember it for the ':' register.
// Do this AFTER executing the command to make :@: work. // Do this AFTER executing the command to make :@: work.
if (getline_equal(fgetline, cookie, getexline) if (getline_equal(fgetline, cookie, getexline)) {
&& new_last_cmdline != NULL) {
xfree(last_cmdline); xfree(last_cmdline);
last_cmdline = new_last_cmdline; last_cmdline = new_last_cmdline;
new_last_cmdline = NULL; new_last_cmdline = NULL;

View File

@@ -886,7 +886,7 @@ local function test_cmdline(linegrid)
}, },
cmdline_block = { { { 'if 1' } } }, cmdline_block = { { { 'if 1' } } },
}) })
feed(':let x = 1<CR>') feed('let x = 1<CR>')
screen:expect({ screen:expect({
grid = s1, grid = s1,
cmdline = { cmdline = {
@@ -897,20 +897,33 @@ local function test_cmdline(linegrid)
pos = 0, pos = 0,
}, },
}, },
cmdline_block = { { { 'if 1' } }, { { ' :let x = 1' } } }, cmdline_block = { { { 'if 1' } }, { { ' let x = 1' } } },
}) })
feed(':endif') feed('<CR>')
screen:expect({ screen:expect({
grid = s1, grid = s1,
cmdline = { cmdline = {
{ {
content = { { ':endif' } }, content = { { '' } },
firstc = ':', firstc = ':',
indent = 2, 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('<CR>') feed('<CR>')
screen:expect({ screen:expect({