summaryrefslogtreecommitdiffstats
path: root/cmd-command-prompt.c
diff options
context:
space:
mode:
authornicm <nicm>2021-08-27 17:25:55 +0000
committernicm <nicm>2021-08-27 17:25:55 +0000
commitdaec63e5e6eb3390d53f4bf7f8a327df77e46c95 (patch)
treecf78624cb0b4a80a6eeb8e29b368ea4f9beb5610 /cmd-command-prompt.c
parentfd756a150b43d319d08ac4117f34edef9e0438c4 (diff)
Replace %% in command lists (by copying them) for template arguments ,
this means they can be used with {} as well. Also make argument processing from an existing vector preserve commands. GitHub issue 2858.
Diffstat (limited to 'cmd-command-prompt.c')
-rw-r--r--cmd-command-prompt.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/cmd-command-prompt.c b/cmd-command-prompt.c
index 737c44c7..820053ec 100644
--- a/cmd-command-prompt.c
+++ b/cmd-command-prompt.c
@@ -169,11 +169,13 @@ static int
cmd_command_prompt_callback(struct client *c, void *data, const char *s,
int done)
{
- struct cmd_command_prompt_cdata *cdata = data;
- char *error;
- struct cmdq_item *item = cdata->item, *new_item;
- struct cmd_list *cmdlist;
- struct cmd_command_prompt_prompt *prompt;
+ struct cmd_command_prompt_cdata *cdata = data;
+ char *error;
+ struct cmdq_item *item = cdata->item, *new_item;
+ struct cmd_list *cmdlist;
+ struct cmd_command_prompt_prompt *prompt;
+ int argc = 0;
+ char **argv = NULL;
if (s == NULL)
goto out;
@@ -181,7 +183,6 @@ cmd_command_prompt_callback(struct client *c, void *data, const char *s,
if (cdata->flags & PROMPT_INCREMENTAL)
goto out;
- cmd_append_argv(&cdata->argc, &cdata->argv, s);
if (++cdata->current != cdata->count) {
prompt = &cdata->prompts[cdata->current];
status_prompt_update(c, prompt->prompt, prompt->input);
@@ -189,8 +190,15 @@ cmd_command_prompt_callback(struct client *c, void *data, const char *s,
}
}
- cmdlist = args_make_commands(cdata->state, cdata->argc, cdata->argv,
- &error);
+ argc = cdata->argc;
+ argv = cmd_copy_argv(cdata->argc, cdata->argv);
+ cmd_append_argv(&argc, &argv, s);
+ if (done) {
+ cdata->argc = argc;
+ cdata->argv = cmd_copy_argv(argc, argv);
+ }
+
+ cmdlist = args_make_commands(cdata->state, argc, argv, &error);
if (cmdlist == NULL) {
cmdq_append(c, cmdq_get_error(error));
free(error);
@@ -201,6 +209,7 @@ cmd_command_prompt_callback(struct client *c, void *data, const char *s,
new_item = cmdq_get_command(cmdlist, cmdq_get_state(item));
cmdq_insert_after(item, new_item);
}
+ cmd_free_argv(argc, argv);
if (c->prompt_inputcb != cmd_command_prompt_callback)
return (1);