Allow a start and end line to be specified for capture-pane which may be

negative to capture part of the history. Prompted by request from Victor
J Orlikowski.
pull/1/head
Nicholas Marriott 2011-03-28 20:17:39 +00:00
parent fa6abac98d
commit 82e0165c49
2 changed files with 43 additions and 6 deletions

View File

@ -31,8 +31,8 @@ int cmd_capture_pane_exec(struct cmd *, struct cmd_ctx *);
const struct cmd_entry cmd_capture_pane_entry = {
"capture-pane", "capturep",
"b:t:", 0, 0,
"[-b buffer-index] [-t target-pane]",
"b:E:S:t:", 0, 0,
"[-b buffer-index] [-E end-line] [-S start-line] [-t target-pane]",
0,
NULL,
NULL,
@ -46,19 +46,47 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
struct window_pane *wp;
char *buf, *line, *cause;
struct screen *s;
int buffer;
u_int i, limit;
struct grid *gd;
int buffer, n;
u_int i, limit, top, bottom, tmp;
size_t len, linelen;
if (cmd_find_pane(ctx, args_get(args, 't'), NULL, &wp) == NULL)
return (-1);
s = &wp->base;
gd = s->grid;
buf = NULL;
len = 0;
for (i = 0; i < screen_size_y(s); i++) {
line = grid_view_string_cells(s->grid, 0, i, screen_size_x(s));
n = args_strtonum(args, 'S', SHRT_MIN, SHRT_MAX, &cause);
if (cause != NULL)
top = gd->hsize;
else if (n < 0 && (u_int) -n > gd->hsize)
top = 0;
else
top = gd->hsize + n;
if (top > gd->hsize + gd->sy - 1)
top = gd->hsize + gd->sy - 1;
n = args_strtonum(args, 'E', SHRT_MIN, SHRT_MAX, &cause);
if (cause != NULL)
bottom = gd->hsize + gd->sy - 1;
else if (n < 0 && (u_int) -n > gd->hsize)
bottom = 0;
else
bottom = gd->hsize + n;
if (bottom > gd->hsize + gd->sy - 1)
bottom = gd->hsize + gd->sy - 1;
if (bottom < top) {
tmp = bottom;
bottom = top;
top = tmp;
}
for (i = top; i <= bottom; i++) {
line = grid_string_cells(s->grid, 0, i, screen_size_x(s));
linelen = strlen(line);
buf = xrealloc(buf, 1, len + linelen + 1);

9
tmux.1
View File

@ -953,11 +953,20 @@ If
is given, the new window does not become the current window.
.It Xo Ic capture-pane
.Op Fl b Ar buffer-index
.Op Fl E Ar end-line
.Op Fl S Ar start-line
.Op Fl t Ar target-pane
.Xc
.D1 (alias: Ic capturep )
Capture the contents of a pane to the specified buffer, or a new buffer if none
is specified.
.Pp
.Fl S
and
.Fl E
specify the starting and ending line numbers, zero is the first line of the
visible pane and negative numbers are lines in the history.
The default is to capture only the visible contents of the pane.
.It Xo
.Ic choose-client
.Op Fl t Ar target-window