Allow cmd-run-shell to accept -t to specify the pane to display the

output, requested by Alexander Tsepkov.
This commit is contained in:
Nicholas Marriott 2012-11-27 15:09:35 +00:00
parent 1fcc7f50ac
commit 4aa4e9fb26
2 changed files with 44 additions and 11 deletions

View File

@ -30,13 +30,15 @@
*/
enum cmd_retval cmd_run_shell_exec(struct cmd *, struct cmd_ctx *);
void cmd_run_shell_callback(struct job *);
void cmd_run_shell_free(void *);
void cmd_run_shell_print(struct job *, const char *);
const struct cmd_entry cmd_run_shell_entry = {
"run-shell", "run",
"", 1, 1,
"command",
"t:", 1, 1,
CMD_TARGET_PANE_USAGE " command",
0,
NULL,
NULL,
@ -46,17 +48,42 @@ const struct cmd_entry cmd_run_shell_entry = {
struct cmd_run_shell_data {
char *cmd;
struct cmd_ctx ctx;
u_int wp_id;
};
void
cmd_run_shell_print(struct job *job, const char *msg)
{
struct cmd_run_shell_data *cdata = job->data;
struct cmd_ctx *ctx = &cdata->ctx;
struct window_pane *wp;
wp = window_pane_find_by_id(cdata->wp_id);
if (wp == NULL) {
ctx->print(ctx, "%s", msg);
return;
}
if (window_pane_set_mode(wp, &window_copy_mode) == 0)
window_copy_init_for_output(wp);
if (wp->mode == &window_copy_mode)
window_copy_add(wp, "%s", msg);
}
enum cmd_retval
cmd_run_shell_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct args *args = self->args;
struct cmd_run_shell_data *cdata;
const char *shellcmd = args->argv[0];
struct window_pane *wp;
if (cmd_find_pane(ctx, args_get(args, 't'), NULL, &wp) == NULL)
return (CMD_RETURN_ERROR);
cdata = xmalloc(sizeof *cdata);
cdata->cmd = xstrdup(args->argv[0]);
cdata->wp_id = wp->id;
memcpy(&cdata->ctx, ctx, sizeof cdata->ctx);
if (ctx->cmdclient != NULL)
@ -87,7 +114,7 @@ cmd_run_shell_callback(struct job *job)
lines = 0;
do {
if ((line = evbuffer_readline(job->event->input)) != NULL) {
ctx->print(ctx, "%s", line);
cmd_run_shell_print (job, line);
lines++;
}
} while (line != NULL);
@ -98,7 +125,7 @@ cmd_run_shell_callback(struct job *job)
memcpy(line, EVBUFFER_DATA(job->event->input), size);
line[size] = '\0';
ctx->print(ctx, "%s", line);
cmd_run_shell_print(job, line);
lines++;
free(line);
@ -115,10 +142,10 @@ cmd_run_shell_callback(struct job *job)
xasprintf(&msg, "'%s' terminated by signal %d", cmd, retcode);
}
if (msg != NULL) {
if (lines != 0)
ctx->print(ctx, "%s", msg);
else
if (lines == 0)
ctx->info(ctx, "%s", msg);
else
cmd_run_shell_print(job, msg);
free(msg);
}
}

10
tmux.1
View File

@ -3394,12 +3394,18 @@ otherwise.
Lock each client individually by running the command specified by the
.Ic lock-command
option.
.It Ic run-shell Ar shell-command
.It Xo Ic run-shell
.Op Fl t Ar target-pane
.Ar shell-command
.Xc
.D1 (alias: Ic run )
Execute
.Ar shell-command
in the background without creating a window.
After it finishes, any output to stdout is displayed in copy mode.
After it finishes, any output to stdout is displayed in copy mode (in the pane
specified by
.Fl t
or the current pane if omitted).
If the command doesn't return success, the exit status is also displayed.
.It Ic server-info
.D1 (alias: Ic info )