aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-04-04 06:13:42 +0800
committerGitHub <noreply@github.com>2022-04-04 06:13:42 +0800
commita93b55273f76e5fe23f614e691536435999f4452 (patch)
tree85fd7d31fc2dc1b7dfbd2695002a24908c5ff707
parentd73bf3138a802bb6c1c654cd913d4e91932287f8 (diff)
parent559dcf45a1ff20b2f1a315b553fc36d4d60003f7 (diff)
downloadrneovim-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.c17
-rw-r--r--src/nvim/getchar.c2
-rw-r--r--test/functional/ex_cmds/normal_spec.lua14
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)