neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 5db35449917de353fb8e35cbd4edca381233f381
parent fe4faaf81a6f3a8a9374bd8429b405cbba3e421d
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Sat, 25 Oct 2025 22:16:05 +0800

vim-patch:9.1.1871: Wrong 'showcmd' in the cmdwin (#36320)

Problem:  Wrong 'showcmd' in the command-line window.
Solution: Clear 'showcmd' when entering cmdwin (zeertzjq).

related: neovim/neovim#36271
closes: vim/vim#18616

https://github.com/vim/vim/commit/826326f13b0af34b5f1c6f15e480dfaece3787c6
Diffstat:
Msrc/nvim/ex_getln.c | 1+
Mtest/functional/legacy/cmdline_spec.lua | 40----------------------------------------
Atest/functional/legacy/cmdwin_spec.lua | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mtest/old/testdir/test_cmdwin.vim | 29+++++++++++++++++++++++++++++
4 files changed, 110 insertions(+), 40 deletions(-)

diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c @@ -4651,6 +4651,7 @@ static int open_cmdwin(void) State = MODE_NORMAL; setmouse(); + clear_showcmd(); // Reset here so it can be set by a CmdwinEnter autocommand. cmdwin_result = 0; diff --git a/test/functional/legacy/cmdline_spec.lua b/test/functional/legacy/cmdline_spec.lua @@ -7,7 +7,6 @@ local feed = n.feed local feed_command = n.feed_command local exec = n.exec local api = n.api -local pesc = vim.pesc describe('cmdline', function() before_each(clear) @@ -657,42 +656,3 @@ describe('cmdline', function() ]]) end) end) - -describe('cmdwin', function() - before_each(clear) - - -- oldtest: Test_cmdwin_interrupted() - it('still uses a new buffer when interrupting more prompt on open', function() - local screen = Screen.new(30, 16) - command('set more') - command('autocmd WinNew * highlight') - feed('q:') - screen:expect({ any = pesc('{6:-- More --}^') }) - feed('q') - screen:expect([[ - | - {1:~ }|*5 - {2:[No Name] }| - {1::}^ | - {1:~ }|*6 - {3:[Command Line] }| - | - ]]) - feed([[aecho 'done']]) - screen:expect([[ - | - {1:~ }|*5 - {2:[No Name] }| - {1::}echo 'done'^ | - {1:~ }|*6 - {3:[Command Line] }| - {5:-- INSERT --} | - ]]) - feed('<CR>') - screen:expect([[ - ^ | - {1:~ }|*14 - done | - ]]) - end) -end) diff --git a/test/functional/legacy/cmdwin_spec.lua b/test/functional/legacy/cmdwin_spec.lua @@ -0,0 +1,80 @@ +local n = require('test.functional.testnvim')() +local Screen = require('test.functional.ui.screen') + +local clear = n.clear +local command = n.command +local feed = n.feed + +describe('cmdwin', function() + before_each(clear) + + -- oldtest: Test_cmdwin_interrupted() + it('still uses a new buffer when interrupting more prompt on open', function() + local screen = Screen.new(30, 16) + command('set more') + command('autocmd WinNew * highlight') + feed('q:') + screen:expect({ any = vim.pesc('{6:-- More --}^') }) + feed('q') + screen:expect([[ + | + {1:~ }|*5 + {2:[No Name] }| + {1::}^ | + {1:~ }|*6 + {3:[Command Line] }| + | + ]]) + feed([[aecho 'done']]) + screen:expect([[ + | + {1:~ }|*5 + {2:[No Name] }| + {1::}echo 'done'^ | + {1:~ }|*6 + {3:[Command Line] }| + {5:-- INSERT --} | + ]]) + feed('<CR>') + screen:expect([[ + ^ | + {1:~ }|*14 + done | + ]]) + end) + + -- oldtest: Test_cmdwin_showcmd() + it('has correct showcmd', function() + local screen = Screen.new(60, 18) + command('set showcmd') + for _, keys in ipairs({ 'q:', ':<C-F>' }) do + feed(keys) + local fmt = [[ + | + {1:~ }|*7 + {2:[No Name] }| + {1::}^ | + {1:~ }|*6 + {3:[Command Line] }| + : %s | + ]] + screen:expect(fmt:format(' ')) + feed('"') + screen:expect(fmt:format('" ')) + feed('x') + screen:expect(fmt:format('"x ')) + feed('y') + screen:expect(fmt:format('"xy ')) + feed('y') + screen:expect(fmt:format(' ')) + feed('<C-C>') + n.poke_eventloop() + feed('<C-C>') + screen:expect([[ + ^ | + {1:~ }|*16 + | + ]]) + end + end) +end) diff --git a/test/old/testdir/test_cmdwin.vim b/test/old/testdir/test_cmdwin.vim @@ -205,4 +205,33 @@ func Test_cmdwin_existing_bufname() delfunc CheckName endfunc +func Test_cmdwin_showcmd() + CheckScreendump + + let lines =<< trim [SCRIPT] + augroup vimHints | au! | augroup END + set showcmd + [SCRIPT] + call writefile(lines, 'XTest_cmdwin_showcmd', 'D') + let buf = RunVimInTerminal('-S XTest_cmdwin_showcmd', {'rows': 18}) + + for keys in ['q:', ":\<C-F>"] + call term_sendkeys(buf, keys) + call VerifyScreenDump(buf, 'Test_cmdwin_showcmd_1', {}) + call term_sendkeys(buf, '"') + call WaitForAssert({-> assert_match('^: \+" *$', term_getline(buf, 18))}) + call term_sendkeys(buf, 'x') + call WaitForAssert({-> assert_match('^: \+"x *$', term_getline(buf, 18))}) + call term_sendkeys(buf, 'y') + call WaitForAssert({-> assert_match('^: \+"xy *$', term_getline(buf, 18))}) + call term_sendkeys(buf, 'y') + call WaitForAssert({-> assert_match('^: \+$', term_getline(buf, 18))}) + call term_sendkeys(buf, "\<C-C>\<C-C>") + call VerifyScreenDump(buf, 'Test_cmdwin_showcmd_2', {}) + endfor + + " clean up + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 expandtab