|PatchSet 874

|Date: 2011/03/28 21:17:39
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|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.
This commit is contained in:
Nicholas Marriott 2011-04-06 22:19:42 +00:00
parent 8ab7fcf7eb
commit 0a2b3492c3
2 changed files with 45 additions and 8 deletions

View File

@ -1,4 +1,4 @@
/* $Id: cmd-capture-pane.c,v 1.6 2011-01-07 14:45:33 tcunha Exp $ */ /* $Id: cmd-capture-pane.c,v 1.7 2011-04-06 22:19:42 nicm Exp $ */
/* /*
* Copyright (c) 2009 Jonathan Alvarado <radobobo@users.sourceforge.net> * Copyright (c) 2009 Jonathan Alvarado <radobobo@users.sourceforge.net>
@ -31,8 +31,8 @@ int 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:t:", 0, 0, "b:E:S:t:", 0, 0,
"[-b buffer-index] [-t target-pane]", "[-b buffer-index] [-E end-line] [-S start-line] [-t target-pane]",
0, 0,
NULL, NULL,
NULL, NULL,
@ -46,19 +46,47 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
struct window_pane *wp; struct window_pane *wp;
char *buf, *line, *cause; char *buf, *line, *cause;
struct screen *s; struct screen *s;
int buffer; struct grid *gd;
u_int i, limit; int buffer, n;
u_int i, limit, top, bottom, tmp;
size_t len, linelen; size_t len, linelen;
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 (-1); return (-1);
s = &wp->base; s = &wp->base;
gd = s->grid;
buf = NULL; buf = NULL;
len = 0; len = 0;
for (i = 0; i < screen_size_y(s); i++) { n = args_strtonum(args, 'S', SHRT_MIN, SHRT_MAX, &cause);
line = grid_view_string_cells(s->grid, 0, i, screen_size_x(s)); 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); linelen = strlen(line);
buf = xrealloc(buf, 1, len + linelen + 1); buf = xrealloc(buf, 1, len + linelen + 1);

11
tmux.1
View File

@ -1,4 +1,4 @@
.\" $Id: tmux.1,v 1.297 2011-04-06 22:16:33 nicm Exp $ .\" $Id: tmux.1,v 1.298 2011-04-06 22:19:42 nicm Exp $
.\" .\"
.\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> .\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
.\" .\"
@ -957,11 +957,20 @@ If
is given, the new window does not become the current window. is given, the new window does not become the current window.
.It Xo Ic capture-pane .It Xo Ic capture-pane
.Op Fl b Ar buffer-index .Op Fl b Ar buffer-index
.Op Fl E Ar end-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 to the specified buffer, or a new buffer if none
is specified. 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 .It Xo
.Ic choose-client .Ic choose-client
.Op Fl t Ar target-window .Op Fl t Ar target-window