Merge pull request #17986 from zeertzjq/fix-ex-mode-regression

Fix regression with :normal and Ex mode from #14311
This commit is contained in:
zeertzjq 2022-04-04 06:13:42 +08:00 committed by GitHub
commit a93b55273f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 9 deletions

View File

@ -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;

View File

@ -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 {

View File

@ -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)