aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-07-17 09:59:32 +0800
committerGitHub <noreply@github.com>2022-07-17 09:59:32 +0800
commit9f837a5dcf61e0b27778dd7127036e12d694d92c (patch)
treeb665f68f4c0966126245707ac6a49db262515d90
parent08a50f6690f4dd0260c3e57b6223d0a9fae9dfd8 (diff)
downloadrneovim-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.c8
-rw-r--r--test/functional/api/vim_spec.lua32
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 ()