From f2cdf73afc7307fc65ab21134bcc4549ac34b2d4 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Thu, 2 Apr 2026 07:05:47 +0800 Subject: [PATCH] fix(api): avoid error when parsing invalid expr after :echo (#38695) Problem: Parsing :echo followed by invalid expression leads to error. Solution: Suppress error when skipping over expression. --- src/nvim/ex_docmd.c | 2 ++ test/functional/api/vim_spec.lua | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index a3bf5c68cd..666be435fc 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -1640,7 +1640,9 @@ bool parse_cmdline(char **cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, const ch char *arg = eap->arg; while (*arg != NUL && *arg != '|' && *arg != '\n') { char *start = arg; + emsg_skip++; skip_expr(&arg, NULL); + emsg_skip--; // If skip_expr didn't advance, move forward to avoid infinite loop if (arg == start) { arg++; diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index f9227d9cea..d625d2667c 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -4828,6 +4828,16 @@ describe('API', function() eq('execute', result.cmd) eq('edit foo', result.nextcmd) end) + it('parses expr-arg commands with invalid expr #38689', function() + for _, arg in ipairs({ '&', '[', '{', '"', "'" }) do + local result = api.nvim_parse_cmd('echo ' .. arg, {}) + eq({ arg }, result.args) + eq('echo', result.cmd) + eq('', result.nextcmd) + end + -- v:errmsg shouldn't be set + eq('', api.nvim_get_vvar('errmsg')) + end) it('parses :map commands with space in RHS', function() eq({ addr = 'none',