diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-04-03 12:59:34 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-04-03 12:59:34 +0100 |
commit | ce416b453a849c837f9f6ffc91dd4792d84e1bfd (patch) | |
tree | ac34f041b3743c1f5bf07af7784269894b71b43b /src | |
parent | a3157a476bfa8c3077d510cc8400093c0d115df5 (diff) | |
download | vim-git-ce416b453a849c837f9f6ffc91dd4792d84e1bfd.tar.gz |
patch 8.2.4672: using :normal with Ex mode may make :substitute hangv8.2.4672
Problem: Using :normal with Ex mode may make :substitute hang.
Solution: When getting an empty line behave like 'q' was typed.
(closes #10070)
Diffstat (limited to 'src')
-rw-r--r-- | src/ex_cmds.c | 5 | ||||
-rw-r--r-- | src/testdir/test_normal.vim | 9 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 16 insertions, 0 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 25f06e623..8cdac4b74 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -4233,6 +4233,11 @@ ex_substitute(exarg_T *eap) { typed = *resp; vim_free(resp); + // When ":normal" runs out of characters we get + // an empty line. Use "q" to get out of the + // loop. + if (ex_normal_busy && typed == NUL) + typed = 'q'; } } else diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim index cd987ab3d..b86a72673 100644 --- a/src/testdir/test_normal.vim +++ b/src/testdir/test_normal.vim @@ -2641,6 +2641,15 @@ func Test_normal33_g_cmd2() bw! endfunc +func Test_normal_ex_substitute() + " This was hanging on the substitute prompt. + new + call setline(1, 'a') + exe "normal! gggQs/a/b/c\<CR>" + call assert_equal('a', getline(1)) + bwipe! +endfunc + " Test for g CTRL-G func Test_g_ctrl_g() new diff --git a/src/version.c b/src/version.c index c6111fc92..3fec52ea0 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4672, +/**/ 4671, /**/ 4670, |