From c92720e3b0ffb51eaa5faa5af096ada048a59903 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Tue, 30 Jun 2026 17:37:15 +0100 Subject: [PATCH] Preserve file and flags. --- cmd-command-prompt.c | 15 ++++++++++++--- cmd-confirm-before.c | 19 +++++++++++++++---- cmd-display-panes.c | 10 ++++++++++ cmd-if-shell.c | 22 +++++++++++++++++++--- cmd-run-shell.c | 14 ++++++++++++-- 5 files changed, 68 insertions(+), 12 deletions(-) diff --git a/cmd-command-prompt.c b/cmd-command-prompt.c index 845985239..18030399f 100644 --- a/cmd-command-prompt.c +++ b/cmd-command-prompt.c @@ -58,6 +58,8 @@ struct cmd_command_prompt_prompt { struct cmd_command_prompt_cdata { struct cmdq_item *item; struct cmd_parse_tree *tree; + char *file; + int parse_flags; int flags; enum prompt_type prompt_type; @@ -85,7 +87,7 @@ cmd_command_prompt_exec(struct cmd *self, struct cmdq_item *item) struct args *args = cmd_get_args(self); struct client *tc = cmdq_get_target_client(item); struct cmd_find_state *target = cmdq_get_target(item); - const char *type, *s, *input, *cmd; + const char *type, *s, *input, *cmd, *file; struct cmd_command_prompt_cdata *cdata; char *tmp, *prompts, *prompt, *next_prompt; char *inputs = NULL, *next_input, *cause = NULL; @@ -116,6 +118,10 @@ cmd_command_prompt_exec(struct cmd *self, struct cmdq_item *item) free(cdata); return (CMD_RETURN_ERROR); } + cmd_get_source(self, &file, NULL); + if (file != NULL) + cdata->file = xstrdup(file); + cdata->parse_flags = cmd_get_parse_flags(self); } if ((s = args_get(args, 'p')) == NULL) { @@ -253,14 +259,16 @@ cmd_command_prompt_callback(struct client *c, void *data, const char *s, /* Explicit body: prompt inputs become the template argv. */ ci.argc = argc; ci.argv = argv; + ci.file = cdata->file; + ci.flags = cdata->parse_flags; new_item = cmd_invoke_get(cdata->tree, cs, &ci); if (item == NULL) cmdq_append(c, new_item); else cmdq_insert_after(item, new_item); - } else { + } else if (argc > 0 && argv[0] != NULL) { /* No body: parse the submitted text as command language. */ - tree = cmd_parse_from_string(s, &pi, &error); + tree = cmd_parse_from_string(argv[0], &pi, &error); if (tree == NULL) { if (item == NULL) cmdq_append(c, cmdq_get_error(error)); @@ -312,5 +320,6 @@ cmd_command_prompt_free(void *data) free(cdata->prompts); cmd_free_argv(cdata->argc, cdata->argv); cmd_parse_free(cdata->tree); + free(cdata->file); free(cdata); } diff --git a/cmd-confirm-before.c b/cmd-confirm-before.c index 0109b8292..2548bd44c 100644 --- a/cmd-confirm-before.c +++ b/cmd-confirm-before.c @@ -52,6 +52,8 @@ const struct cmd_entry cmd_confirm_before_entry = { struct cmd_confirm_before_data { struct cmdq_item *item; struct cmd_parse_tree *tree; + char *file; + int parse_flags; u_char confirm_key; int default_yes; }; @@ -71,7 +73,7 @@ cmd_confirm_before_exec(struct cmd *self, struct cmdq_item *item) struct client *tc = cmdq_get_target_client(item); struct cmd_find_state *target = cmdq_get_target(item); char *new_prompt, *cause = NULL; - const char *confirm_key, *prompt, *cmd; + const char *confirm_key, *prompt, *cmd, *file; int wait = !args_has(args, 'b'), n; cdata = xcalloc(1, sizeof *cdata); @@ -82,6 +84,10 @@ cmd_confirm_before_exec(struct cmd *self, struct cmdq_item *item) free(cdata); return (CMD_RETURN_ERROR); } + cmd_get_source(self, &file, NULL); + if (file != NULL) + cdata->file = xstrdup(file); + cdata->parse_flags = cmd_get_parse_flags(self); if (wait) cdata->item = item; @@ -127,6 +133,8 @@ cmd_confirm_before_callback(struct client *c, void *data, const char *s, { struct cmd_confirm_before_data *cdata = data; struct cmdq_item *item = cdata->item, *new_item; + struct cmdq_state *cs; + struct cmd_invoke_input ci = { 0 }; int retcode = 1; if (c->flags & CLIENT_DEAD) @@ -138,12 +146,14 @@ cmd_confirm_before_callback(struct client *c, void *data, const char *s, goto out; retcode = 0; + ci.file = cdata->file; + ci.flags = cdata->parse_flags; if (item == NULL) { - new_item = cmd_invoke_get(cdata->tree, NULL, NULL); + new_item = cmd_invoke_get(cdata->tree, NULL, &ci); cmdq_append(c, new_item); } else { - new_item = cmd_invoke_get(cdata->tree, cmdq_get_state(item), - NULL); + cs = cmdq_get_state(item); + new_item = cmd_invoke_get(cdata->tree, cs, &ci); cmdq_insert_after(item, new_item); } @@ -163,5 +173,6 @@ cmd_confirm_before_free(void *data) struct cmd_confirm_before_data *cdata = data; cmd_parse_free(cdata->tree); + free(cdata->file); free(cdata); } diff --git a/cmd-display-panes.c b/cmd-display-panes.c index baa855333..daae09f8d 100644 --- a/cmd-display-panes.c +++ b/cmd-display-panes.c @@ -46,6 +46,8 @@ const struct cmd_entry cmd_display_panes_entry = { struct cmd_display_panes_data { struct cmdq_item *item; struct cmd_parse_tree *tree; + char *file; + int parse_flags; }; struct cmd_display_panes_ctx { @@ -298,6 +300,7 @@ cmd_display_panes_free(__unused struct client *c, void *data) if (cdata->item != NULL) cmdq_continue(cdata->item); cmd_parse_free(cdata->tree); + free(cdata->file); free(cdata); } @@ -333,6 +336,8 @@ cmd_display_panes_key(struct client *c, void *data, struct key_event *event) xasprintf(&expanded, "%%%u", wp->id); ci.argc = 1; ci.argv = &expanded; + ci.file = cdata->file; + ci.flags = cdata->parse_flags; if (item != NULL) cs = cmdq_get_state(item); @@ -354,6 +359,7 @@ cmd_display_panes_exec(struct cmd *self, struct cmdq_item *item) struct session *s = tc->session; u_int delay; char *cause; + const char *file; struct cmd_display_panes_data *cdata; int wait = !args_has(args, 'b'); @@ -382,6 +388,10 @@ cmd_display_panes_exec(struct cmd *self, struct cmdq_item *item) free(cdata); return (CMD_RETURN_ERROR); } + cmd_get_source(self, &file, NULL); + if (file != NULL) + cdata->file = xstrdup(file); + cdata->parse_flags = cmd_get_parse_flags(self); if (args_has(args, 'N')) { server_client_set_overlay(tc, delay, NULL, NULL, diff --git a/cmd-if-shell.c b/cmd-if-shell.c index 216bca55b..1a0b85873 100644 --- a/cmd-if-shell.c +++ b/cmd-if-shell.c @@ -56,6 +56,9 @@ struct cmd_if_shell_data { struct cmd_parse_tree *cmd_if; struct cmd_parse_tree *cmd_else; + char *file; + int parse_flags; + struct client *client; struct cmdq_item *item; }; @@ -77,6 +80,8 @@ cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item) struct cmd_if_shell_data *cdata; struct cmdq_item *new_item; struct cmd_parse_tree *tree; + struct cmd_invoke_input input = { 0 }; + const char *file; char *shellcmd, *cause = NULL; struct client *tc = cmdq_get_target_client(item); struct session *s = target->s; @@ -101,7 +106,10 @@ cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item) free(cause); return (CMD_RETURN_ERROR); } - new_item = cmd_invoke_get(tree, cmdq_get_state(item), NULL); + cmd_get_source(self, &file, NULL); + input.file = file; + input.flags = cmd_get_parse_flags(self); + new_item = cmd_invoke_get(tree, cmdq_get_state(item), &input); cmd_parse_free(tree); cmdq_insert_after(item, new_item); return (CMD_RETURN_NORMAL); @@ -121,6 +129,10 @@ cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item) goto fail; } } + cmd_get_source(self, &file, NULL); + if (file != NULL) + cdata->file = xstrdup(file); + cdata->parse_flags = cmd_get_parse_flags(self); if (!wait) cdata->client = tc; @@ -158,6 +170,7 @@ cmd_if_shell_callback(struct job *job) struct client *c = cdata->client; struct cmdq_item *item = cdata->item, *new_item; struct cmd_parse_tree *tree; + struct cmd_invoke_input input = { 0 }; int status; status = job_get_status(job); @@ -168,11 +181,13 @@ cmd_if_shell_callback(struct job *job) if (tree == NULL) goto out; + input.file = cdata->file; + input.flags = cdata->parse_flags; if (item == NULL) { - new_item = cmd_invoke_get(tree, NULL, NULL); + new_item = cmd_invoke_get(tree, NULL, &input); cmdq_append(c, new_item); } else { - new_item = cmd_invoke_get(tree, cmdq_get_state(item), NULL); + new_item = cmd_invoke_get(tree, cmdq_get_state(item), &input); cmdq_insert_after(item, new_item); } @@ -193,5 +208,6 @@ cmd_if_shell_free(void *data) cmd_parse_free(cdata->cmd_else); if (cdata->cmd_if != NULL) cmd_parse_free(cdata->cmd_if); + free(cdata->file); free(cdata); } diff --git a/cmd-run-shell.c b/cmd-run-shell.c index e8328278e..f4ecf9706 100644 --- a/cmd-run-shell.c +++ b/cmd-run-shell.c @@ -58,6 +58,8 @@ struct cmd_run_shell_data { struct client *client; char *cmd; struct cmd_parse_tree *tree; + char *file; + int parse_flags; char *cwd; struct cmdq_item *item; struct session *s; @@ -114,7 +116,7 @@ cmd_run_shell_exec(struct cmd *self, struct cmdq_item *item) struct client *tc = cmdq_get_target_client(item); struct session *s = target->s; struct window_pane *wp = target->wp; - const char *delay, *cmd; + const char *delay, *cmd, *file; struct format_tree *ft; double d; struct timeval tv; @@ -153,6 +155,10 @@ cmd_run_shell_exec(struct cmd *self, struct cmdq_item *item) cmd_run_shell_free(cdata); return (CMD_RETURN_ERROR); } + cmd_get_source(self, &file, NULL); + if (file != NULL) + cdata->file = xstrdup(file); + cdata->parse_flags = cmd_get_parse_flags(self); } if (args_has(args, 't') && wp != NULL) @@ -206,6 +212,7 @@ cmd_run_shell_timer(__unused int fd, __unused short events, void* arg) const char *cmd = cdata->cmd; struct cmdq_item *item = cdata->item, *new_item; struct cmdq_state *cs = NULL; + struct cmd_invoke_input input = { 0 }; if (cdata->tree == NULL) { if (cmd == NULL) { @@ -232,7 +239,9 @@ cmd_run_shell_timer(__unused int fd, __unused short events, void* arg) if (item != NULL) cs = cmdq_get_state(item); - new_item = cmd_invoke_get(cdata->tree, cs, NULL); + input.file = cdata->file; + input.flags = cdata->parse_flags; + new_item = cmd_invoke_get(cdata->tree, cs, &input); if (item == NULL) cmdq_append(c, new_item); else @@ -305,6 +314,7 @@ cmd_run_shell_free(void *data) if (cdata->client != NULL) server_client_unref(cdata->client); cmd_parse_free(cdata->tree); + free(cdata->file); free(cdata->cwd); free(cdata->cmd); free(cdata);