diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-07-17 09:59:32 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-17 09:59:32 +0800 |
commit | 9f837a5dcf61e0b27778dd7127036e12d694d92c (patch) | |
tree | b665f68f4c0966126245707ac6a49db262515d90 | |
parent | 08a50f6690f4dd0260c3e57b6223d0a9fae9dfd8 (diff) | |
download | rneovim-9f837a5dcf61e0b27778dd7127036e12d694d92c.tar.gz rneovim-9f837a5dcf61e0b27778dd7127036e12d694d92c.tar.bz2 rneovim-9f837a5dcf61e0b27778dd7127036e12d694d92c.zip |
fix(api): fix nvim_parse_cmd interfere with printing line in Ex mode (#19400)
-rw-r--r-- | src/nvim/ex_docmd.c | 8 | ||||
-rw-r--r-- | test/functional/api/vim_spec.lua | 32 |
2 files changed, 38 insertions, 2 deletions
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index f0ee849047..c5f393e2ce 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -1444,10 +1444,13 @@ bool parse_cmdline(char *cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, char **er eap->getline = NULL; eap->cookie = NULL; + const bool save_ex_pressedreturn = ex_pressedreturn; // Parse command modifiers if (parse_command_modifiers(eap, errormsg, &cmdinfo->cmdmod, false) == FAIL) { + ex_pressedreturn = save_ex_pressedreturn; goto err; } + ex_pressedreturn = save_ex_pressedreturn; after_modifier = eap->cmd; // Save location after command modifiers @@ -2407,7 +2410,8 @@ char *ex_errmsg(const char *const msg, const char *const arg) /// - Set ex_pressedreturn for an empty command line. /// /// @param skip_only if false, undo_cmdmod() must be called later to free -/// any cmod_filter_pat and cmod_filter_regmatch.regprog. +/// any cmod_filter_pat and cmod_filter_regmatch.regprog, +/// and ex_pressedreturn may be set. /// @param[out] errormsg potential error message. /// /// Call apply_cmdmod() to get the side effects of the modifiers: @@ -2421,7 +2425,7 @@ int parse_command_modifiers(exarg_T *eap, char **errormsg, cmdmod_T *cmod, bool { char *p; - memset(cmod, 0, sizeof(*cmod)); + CLEAR_POINTER(cmod); // Repeat until no more command modifiers are found. for (;;) { diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 63a4e9a39c..3724dbf820 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -3624,6 +3624,38 @@ describe('API', function() eq('Error while parsing command line: E464: Ambiguous use of user-defined command', pcall_err(meths.parse_cmd, 'F', {})) end) + it('does not interfere with printing line in Ex mode #19400', function() + local screen = Screen.new(60, 7) + screen:set_default_attr_ids({ + [0] = {bold = true, foreground = Screen.colors.Blue}, -- NonText + [1] = {bold = true, reverse = true}, -- MsgSeparator + }) + screen:attach() + insert([[ + foo + bar]]) + feed('gQ1') + screen:expect([[ + foo | + bar | + {0:~ }| + {0:~ }| + {1: }| + Entering Ex mode. Type "visual" to go to Normal mode. | + :1^ | + ]]) + eq('Error while parsing command line', pcall_err(meths.parse_cmd, '', {})) + feed('<CR>') + screen:expect([[ + foo | + bar | + {1: }| + Entering Ex mode. Type "visual" to go to Normal mode. | + :1 | + foo | + :^ | + ]]) + end) end) describe('nvim_cmd', function() it('works', function () |