From 82e0165c49b85ab95663d677fc7d0249b2a4efae Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 28 Mar 2011 20:17:39 +0000 Subject: 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. --- cmd-capture-pane.c | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) (limited to 'cmd-capture-pane.c') diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c index 6efbfe97..52f5455c 100644 --- a/cmd-capture-pane.c +++ b/cmd-capture-pane.c @@ -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); -- cgit v1.2.3