From bcbd9d7992a43404409c8ee223f5a0a07a0665f3 Mon Sep 17 00:00:00 2001 From: Vivek Kumar <67893205+kumarvivek1752@users.noreply.github.com> Date: Thu, 9 Jul 2026 21:23:40 +0530 Subject: [PATCH] refactor(api): promote magic spec from CmdParseInfo to exarg_T #39119 Problem: `magic` was owned by `CmdParseInfo`, but command handlers need it at execution time via `exarg_T`. Solution: Move `magic` into `exarg_T`, and initialize it in `parse_cmdline()`. --- src/nvim/api/command.c | 14 +++++++------- src/nvim/ex_cmds_defs.h | 10 +++++----- src/nvim/ex_docmd.c | 8 ++------ 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/nvim/api/command.c b/src/nvim/api/command.c index 30cc88ee4a..05cb0d745c 100644 --- a/src/nvim/api/command.c +++ b/src/nvim/api/command.c @@ -312,8 +312,8 @@ Dict(cmd) nvim_parse_cmd(String str, Dict(empty) *opts, Arena *arena, Error *err PUT_KEY(result, cmd, mods, mods); Dict magic = arena_dict(arena, 2); - PUT_C(magic, "file", BOOLEAN_OBJ(cmdinfo.magic.file)); - PUT_C(magic, "bar", BOOLEAN_OBJ(cmdinfo.magic.bar)); + PUT_C(magic, "file", BOOLEAN_OBJ(ea.magic.file)); + PUT_C(magic, "bar", BOOLEAN_OBJ(ea.magic.bar)); PUT_KEY(result, cmd, magic, magic); undo_cmdmod(&cmdinfo.cmdmod); @@ -629,16 +629,16 @@ String nvim_cmd(uint64_t channel_id, Dict(cmd) *cmd, Dict(cmd_opts) *opts, Arena goto end; } - cmdinfo.magic.file = HAS_KEY(magic, cmd_magic, file) ? magic->file : (ea.argt & EX_XFILE); - cmdinfo.magic.bar = HAS_KEY(magic, cmd_magic, bar) ? magic->bar : (ea.argt & EX_TRLBAR); - if (cmdinfo.magic.file) { + ea.magic.file = HAS_KEY(magic, cmd_magic, file) ? magic->file : (ea.argt & EX_XFILE); + ea.magic.bar = HAS_KEY(magic, cmd_magic, bar) ? magic->bar : (ea.argt & EX_TRLBAR); + if (ea.magic.file) { ea.argt |= EX_XFILE; } else { ea.argt &= ~EX_XFILE; } } else { - cmdinfo.magic.file = ea.argt & EX_XFILE; - cmdinfo.magic.bar = ea.argt & EX_TRLBAR; + ea.magic.file = ea.argt & EX_XFILE; + ea.magic.bar = ea.argt & EX_TRLBAR; } if (HAS_KEY(cmd, cmd, mods)) { diff --git a/src/nvim/ex_cmds_defs.h b/src/nvim/ex_cmds_defs.h index 9e7738fdc1..e1c80a8f93 100644 --- a/src/nvim/ex_cmds_defs.h +++ b/src/nvim/ex_cmds_defs.h @@ -140,6 +140,10 @@ struct exarg { LineGetter ea_getline; ///< function used to get the next line void *cookie; ///< argument for ea_getline() cstack_T *cstack; ///< condition stack for ":if" etc. + struct { ///< special char handling in command args + bool file; + bool bar; + } magic; }; #define FORCE_BIN 1 // ":edit ++bin file" @@ -190,13 +194,9 @@ typedef struct { int cmod_did_esilent; ///< incremented when emsg_silent is } cmdmod_T; -/// Stores command modifier info used by `nvim_parse_cmd` +/// Stores command parse info used by `nvim_parse_cmd` typedef struct { cmdmod_T cmdmod; - struct { - bool file; - bool bar; - } magic; } CmdParseInfo; /// Previous :substitute replacement string definition diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 8f5a2ac362..83822532a4 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -1685,12 +1685,8 @@ bool parse_cmdline(char **cmdline, exarg_T *eap, CmdParseInfo *cmdinfo, const ch } // Set the "magic" values (characters that get treated specially) - if (eap->argt & EX_XFILE) { - cmdinfo->magic.file = true; - } - if (eap->argt & EX_TRLBAR) { - cmdinfo->magic.bar = true; - } + eap->magic.file = eap->argt & EX_XFILE; + eap->magic.bar = eap->argt & EX_TRLBAR; retval = true; end: