Support capture-pane -p to send to stdout.

This commit is contained in:
Nicholas Marriott 2013-02-15 09:31:45 +00:00
parent 2bdc59fac8
commit 1d591ada76
2 changed files with 43 additions and 22 deletions

View File

@ -24,15 +24,16 @@
#include "tmux.h" #include "tmux.h"
/* /*
* Write the entire contents of a pane to a buffer. * Write the entire contents of a pane to a buffer or stdout.
*/ */
enum cmd_retval cmd_capture_pane_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_capture_pane_exec(struct cmd *, struct cmd_ctx *);
const struct cmd_entry cmd_capture_pane_entry = { const struct cmd_entry cmd_capture_pane_entry = {
"capture-pane", "capturep", "capture-pane", "capturep",
"b:E:S:t:", 0, 0, "b:c:E:pS:t:", 0, 0,
"[-b buffer-index] [-E end-line] [-S start-line] " "[-p] [-c target-client] [-b buffer-index] [-E end-line] "
"[-S start-line] "
CMD_TARGET_PANE_USAGE, CMD_TARGET_PANE_USAGE,
0, 0,
NULL, NULL,
@ -44,6 +45,7 @@ enum cmd_retval
cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
{ {
struct args *args = self->args; struct args *args = self->args;
struct client *c;
struct window_pane *wp; struct window_pane *wp;
char *buf, *line, *cause; char *buf, *line, *cause;
struct screen *s; struct screen *s;
@ -52,6 +54,9 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
u_int i, limit, top, bottom, tmp; u_int i, limit, top, bottom, tmp;
size_t len, linelen; size_t len, linelen;
if ((c = cmd_find_client(ctx, args_get(args, 'c'))) == NULL)
return (CMD_RETURN_ERROR);
if (cmd_find_pane(ctx, args_get(args, 't'), NULL, &wp) == NULL) if (cmd_find_pane(ctx, args_get(args, 't'), NULL, &wp) == NULL)
return (CMD_RETURN_ERROR); return (CMD_RETURN_ERROR);
s = &wp->base; s = &wp->base;
@ -100,25 +105,33 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
free(line); free(line);
} }
limit = options_get_number(&global_options, "buffer-limit"); if (args_has(args, 'p')) {
if (c == NULL) {
ctx->error(ctx, "can't write to stdout");
return (CMD_RETURN_ERROR);
}
evbuffer_add(c->stdout_data, buf, len);
server_push_stdout(c);
} else {
limit = options_get_number(&global_options, "buffer-limit");
if (!args_has(args, 'b')) {
paste_add(&global_buffers, buf, len, limit);
return (CMD_RETURN_NORMAL);
}
if (!args_has(args, 'b')) { buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause);
paste_add(&global_buffers, buf, len, limit); if (cause != NULL) {
return (CMD_RETURN_NORMAL); ctx->error(ctx, "buffer %s", cause);
} free(buf);
free(cause);
return (CMD_RETURN_ERROR);
}
buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause); if (paste_replace(&global_buffers, buffer, buf, len) != 0) {
if (cause != NULL) { ctx->error(ctx, "no buffer %d", buffer);
ctx->error(ctx, "buffer %s", cause); free(buf);
free(buf); return (CMD_RETURN_ERROR);
free(cause); }
return (CMD_RETURN_ERROR);
}
if (paste_replace(&global_buffers, buffer, buf, len) != 0) {
ctx->error(ctx, "no buffer %d", buffer);
free(buf);
return (CMD_RETURN_ERROR);
} }
return (CMD_RETURN_NORMAL); return (CMD_RETURN_NORMAL);

12
tmux.1
View File

@ -1040,14 +1040,22 @@ By default, it uses the format
but a different format may be specified with but a different format may be specified with
.Fl F . .Fl F .
.It Xo Ic capture-pane .It Xo Ic capture-pane
.Op Fl p
.Op Fl b Ar buffer-index .Op Fl b Ar buffer-index
.Op Fl c Ar target-client
.Op Fl E Ar end-line .Op Fl E Ar end-line
.Op Fl S Ar start-line .Op Fl S Ar start-line
.Op Fl t Ar target-pane .Op Fl t Ar target-pane
.Xc .Xc
.D1 (alias: Ic capturep ) .D1 (alias: Ic capturep )
Capture the contents of a pane to the specified buffer, or a new buffer if none Capture the contents of a pane.
is specified. If
.Fl p
is given, the output goes to
.Ar target-client
stdout, otherwise to the buffer specified with
.Fl b
or a new buffer if omitted.
.Pp .Pp
.Fl S .Fl S
and and