mirror of
https://github.com/tmate-io/tmate.git
synced 2024-11-26 18:13:10 +01:00
Allow cmd-run-shell to accept -t to specify the pane to display the
output, requested by Alexander Tsepkov.
This commit is contained in:
parent
1fcc7f50ac
commit
4aa4e9fb26
@ -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
10
tmux.1
@ -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 )
|
||||||
|
Loading…
Reference in New Issue
Block a user