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 *); 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_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 = { const struct cmd_entry cmd_run_shell_entry = {
"run-shell", "run", "run-shell", "run",
"", 1, 1, "t:", 1, 1,
"command", CMD_TARGET_PANE_USAGE " command",
0, 0,
NULL, NULL,
NULL, NULL,
@ -46,17 +48,42 @@ const struct cmd_entry cmd_run_shell_entry = {
struct cmd_run_shell_data { struct cmd_run_shell_data {
char *cmd; char *cmd;
struct cmd_ctx ctx; 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 enum cmd_retval
cmd_run_shell_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_run_shell_exec(struct cmd *self, struct cmd_ctx *ctx)
{ {
struct args *args = self->args; struct args *args = self->args;
struct cmd_run_shell_data *cdata; struct cmd_run_shell_data *cdata;
const char *shellcmd = args->argv[0]; 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 = xmalloc(sizeof *cdata);
cdata->cmd = xstrdup(args->argv[0]); cdata->cmd = xstrdup(args->argv[0]);
cdata->wp_id = wp->id;
memcpy(&cdata->ctx, ctx, sizeof cdata->ctx); memcpy(&cdata->ctx, ctx, sizeof cdata->ctx);
if (ctx->cmdclient != NULL) if (ctx->cmdclient != NULL)
@ -87,7 +114,7 @@ cmd_run_shell_callback(struct job *job)
lines = 0; lines = 0;
do { do {
if ((line = evbuffer_readline(job->event->input)) != NULL) { if ((line = evbuffer_readline(job->event->input)) != NULL) {
ctx->print(ctx, "%s", line); cmd_run_shell_print (job, line);
lines++; lines++;
} }
} while (line != NULL); } while (line != NULL);
@ -98,7 +125,7 @@ cmd_run_shell_callback(struct job *job)
memcpy(line, EVBUFFER_DATA(job->event->input), size); memcpy(line, EVBUFFER_DATA(job->event->input), size);
line[size] = '\0'; line[size] = '\0';
ctx->print(ctx, "%s", line); cmd_run_shell_print(job, line);
lines++; lines++;
free(line); free(line);
@ -115,10 +142,10 @@ cmd_run_shell_callback(struct job *job)
xasprintf(&msg, "'%s' terminated by signal %d", cmd, retcode); xasprintf(&msg, "'%s' terminated by signal %d", cmd, retcode);
} }
if (msg != NULL) { if (msg != NULL) {
if (lines != 0) if (lines == 0)
ctx->print(ctx, "%s", msg);
else
ctx->info(ctx, "%s", msg); ctx->info(ctx, "%s", msg);
else
cmd_run_shell_print(job, msg);
free(msg); free(msg);
} }
} }

10
tmux.1
View File

@ -3394,12 +3394,18 @@ otherwise.
Lock each client individually by running the command specified by the Lock each client individually by running the command specified by the
.Ic lock-command .Ic lock-command
option. 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 ) .D1 (alias: Ic run )
Execute Execute
.Ar shell-command .Ar shell-command
in the background without creating a window. 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. If the command doesn't return success, the exit status is also displayed.
.It Ic server-info .It Ic server-info
.D1 (alias: Ic info ) .D1 (alias: Ic info )