diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-04-04 06:13:42 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-04 06:13:42 +0800 |
commit | a93b55273f76e5fe23f614e691536435999f4452 (patch) | |
tree | 85fd7d31fc2dc1b7dfbd2695002a24908c5ff707 | |
parent | d73bf3138a802bb6c1c654cd913d4e91932287f8 (diff) | |
parent | 559dcf45a1ff20b2f1a315b553fc36d4d60003f7 (diff) | |
download | rneovim-a93b55273f76e5fe23f614e691536435999f4452.tar.gz rneovim-a93b55273f76e5fe23f614e691536435999f4452.tar.bz2 rneovim-a93b55273f76e5fe23f614e691536435999f4452.zip |
Merge pull request #17986 from zeertzjq/fix-ex-mode-regression
Fix regression with :normal and Ex mode from #14311
-rw-r--r-- | src/nvim/ex_cmds.c | 17 | ||||
-rw-r--r-- | src/nvim/getchar.c | 2 | ||||
-rw-r--r-- | test/functional/ex_cmds/normal_spec.lua | 14 |
3 files changed, 24 insertions, 9 deletions
diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index b493ad61ae..71b3517adc 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -3860,19 +3860,22 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout, bool do_buf_event, handle prompt = xmallocz(ec + 1); memset(prompt, ' ', sc); memset(prompt + sc, '^', ec - sc + 1); - resp = (char_u *)getcmdline_prompt(NUL, prompt, 0, EXPAND_NOTHING, + resp = (char_u *)getcmdline_prompt(-1, prompt, 0, EXPAND_NOTHING, NULL, CALLBACK_NONE); msg_putchar('\n'); xfree(prompt); if (resp != NULL) { typed = *resp; xfree(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 { + // getcmdline_prompt() returns NULL if there is no command line to return. + typed = NUL; + } + // 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 { char_u *orig_line = NULL; diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index c944a5ec93..8190c20c1c 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -2330,8 +2330,6 @@ static int vgetorpeek(bool advance) // cmdline window. if (p_im && (State & INSERT)) { c = Ctrl_L; - } else if ((State & CMDLINE) && exmode_active) { - c = '\n'; } else if ((State & CMDLINE) || (cmdwin_type > 0 && tc == ESC)) { c = Ctrl_C; } else { diff --git a/test/functional/ex_cmds/normal_spec.lua b/test/functional/ex_cmds/normal_spec.lua index bc4e45ec62..f6e7dd2b3a 100644 --- a/test/functional/ex_cmds/normal_spec.lua +++ b/test/functional/ex_cmds/normal_spec.lua @@ -1,7 +1,10 @@ local helpers = require('test.functional.helpers')(after_each) local clear = helpers.clear +local command = helpers.command local feed = helpers.feed local expect = helpers.expect +local eq = helpers.eq +local eval = helpers.eval before_each(clear) @@ -10,4 +13,15 @@ describe(':normal', function() feed('gQnormal! Ifoo<CR>') expect('foo') end) + + it('normal! does not execute command in Ex mode when running out of characters', function() + command('let g:var = 0') + command('normal! gQlet g:var = 1') + eq(0, eval('g:var')) + end) + + it('normal! gQinsert does not hang #17980', function() + command('normal! gQinsert') + expect('') + end) end) |