vim-patch:9.1.2107: :normal may change cmdline history (#37523)

Problem:  :normal may change cmdline history if the keys don't
          explicitly leave Cmdline mode (after 9.1.1872).
Solution: Check ex_normal_busy (zeertzjq)

closes: vim/vim#19237

85241020e8
(cherry picked from commit f10a1dcf4d)
This commit is contained in:
zeertzjq
2026-01-24 07:57:49 +08:00
committed by github-actions[bot]
parent 0b1f5a1d60
commit 0da1e4b1c5
2 changed files with 11 additions and 1 deletions

View File

@@ -1004,7 +1004,7 @@ static int command_line_check(VimState *state)
// that occurs while typing a command should
// cause the command not to be executed.
if (stuff_empty() && typebuf.tb_len == 0) {
if (ex_normal_busy == 0 && stuff_empty() && typebuf.tb_len == 0) {
// There is no pending input from sources other than user input, so
// Vim is going to wait for the user to type a key. Consider the
// command line typed even if next key will trigger a mapping.

View File

@@ -2644,6 +2644,7 @@ func Test_recalling_cmdline_with_mappings()
call assert_equal("echo 'bar'", histget(':', -1))
call assert_equal("echo 'foo'", histget(':', -2))
let g:cmdline = ''
" This command comes completely from a mapping.
nmap <F3> :echo 'baz'<F2><CR>
call feedkeys("\<F3>", 'tx')
@@ -2653,6 +2654,15 @@ func Test_recalling_cmdline_with_mappings()
call assert_equal("echo 'bar'", histget(':', -1))
call assert_equal("echo 'foo'", histget(':', -2))
let g:cmdline = ''
" A command coming from :normal is ignored in the history even if the keys
" don't explicitly leave Cmdline mode.
exe "normal :echo 'baz'\<F2>"
call assert_equal("echo 'baz'", g:cmdline)
call assert_equal("echo 'bar'", @:)
call assert_equal("echo 'bar'", histget(':', -1))
call assert_equal("echo 'foo'", histget(':', -2))
if has('unix')
new
call setline(1, ['aaa'])