This is mostly straight-forward although it feels like there are a lot of layers to push it through. Also, I have no idea what's appropriate [if anything] to bind this to in emacs copy mode.
Keith --- mode-key.c | 4 ++++ screen.c | 12 ++++++++++- tmux.h | 7 ++++++- window-copy.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 83 insertions(+), 4 deletions(-) diff --git a/mode-key.c b/mode-key.c index 57be2d8164b9..eb97d3f8a385 100644 --- a/mode-key.c +++ b/mode-key.c @@ -146,6 +146,8 @@ const struct mode_key_cmdstr mode_key_cmdstr_copy[] = { { MODEKEYCOPY_STARTSELECTION, "begin-selection" }, { MODEKEYCOPY_TOPLINE, "top-line" }, { MODEKEYCOPY_UP, "cursor-up" }, + { MODEKEYCOPY_LEFTPRUNE, "left-prune" }, + { MODEKEYCOPY_RIGHTPRUNE, "right-prune" }, { 0, NULL } }; @@ -275,6 +277,7 @@ const struct mode_key_entry mode_key_vi_copy[] = { { '?', 0, MODEKEYCOPY_SEARCHUP }, { 'A', 0, MODEKEYCOPY_APPENDSELECTION }, { 'B', 0, MODEKEYCOPY_PREVIOUSSPACE }, + { 'C', 0, MODEKEYCOPY_RIGHTPRUNE }, { 'D', 0, MODEKEYCOPY_COPYENDOFLINE }, { 'E', 0, MODEKEYCOPY_NEXTSPACEEND }, { 'F', 0, MODEKEYCOPY_JUMPBACK }, @@ -300,6 +303,7 @@ const struct mode_key_entry mode_key_vi_copy[] = { { '\r', 0, MODEKEYCOPY_COPYSELECTION }, { '^', 0, MODEKEYCOPY_BACKTOINDENTATION }, { 'b', 0, MODEKEYCOPY_PREVIOUSWORD }, + { 'c', 0, MODEKEYCOPY_LEFTPRUNE }, { 'e', 0, MODEKEYCOPY_NEXTWORDEND }, { 'f', 0, MODEKEYCOPY_JUMP }, { 'g', 0, MODEKEYCOPY_HISTORYTOP }, diff --git a/screen.c b/screen.c index 7bfc01543a01..f41cbb2d9cb8 100644 --- a/screen.c +++ b/screen.c @@ -251,7 +251,8 @@ screen_resize_y(struct screen *s, u_int sy) /* Set selection. */ void screen_set_selection(struct screen *s, u_int sx, u_int sy, - u_int ex, u_int ey, u_int rectflag, struct grid_cell *gc) + u_int ex, u_int ey, u_int rectflag, u_int leftprunex, u_int rightprunex, + struct grid_cell *gc) { struct screen_sel *sel = &s->sel; @@ -261,6 +262,9 @@ screen_set_selection(struct screen *s, u_int sx, u_int sy, sel->sx = sx; sel->sy = sy; sel->ex = ex; sel->ey = ey; + + sel->leftprunex = leftprunex; + sel->rightprunex = rightprunex; } /* Clear selection. */ @@ -281,6 +285,12 @@ screen_check_selection(struct screen *s, u_int px, u_int py) if (!sel->flag) return (0); + if (px < sel->leftprunex) + return (0); + + if (px > sel->rightprunex) + return (0); + if (sel->rectflag) { if (sel->sy < sel->ey) { /* start line < end line -- downward selection. */ diff --git a/tmux.h b/tmux.h index fde94afc47b3..aa01b17ee0e3 100644 --- a/tmux.h +++ b/tmux.h @@ -584,6 +584,8 @@ enum mode_key_cmd { MODEKEYCOPY_STARTSELECTION, MODEKEYCOPY_TOPLINE, MODEKEYCOPY_UP, + MODEKEYCOPY_LEFTPRUNE, + MODEKEYCOPY_RIGHTPRUNE, }; /* Entry in the default mode key tables. */ @@ -761,6 +763,9 @@ struct screen_sel { u_int ex; u_int ey; + u_int leftprunex; + u_int rightprunex; + struct grid_cell cell; }; @@ -2093,7 +2098,7 @@ void screen_set_cursor_colour(struct screen *, const char *); void screen_set_title(struct screen *, const char *); void screen_resize(struct screen *, u_int, u_int, int); void screen_set_selection(struct screen *, - u_int, u_int, u_int, u_int, u_int, struct grid_cell *); + u_int, u_int, u_int, u_int, u_int, u_int, u_int, struct grid_cell *); void screen_clear_selection(struct screen *); int screen_check_selection(struct screen *, u_int, u_int); void screen_reflow(struct screen *, u_int); diff --git a/window-copy.c b/window-copy.c index 69a3e13b8bbd..6d2edda8c567 100644 --- a/window-copy.c +++ b/window-copy.c @@ -82,6 +82,8 @@ void window_copy_cursor_previous_word(struct window_pane *, const char *); void window_copy_scroll_up(struct window_pane *, u_int); void window_copy_scroll_down(struct window_pane *, u_int); void window_copy_rectangle_toggle(struct window_pane *); +void window_copy_left_prune(struct window_pane *); +void window_copy_right_prune(struct window_pane *); const struct window_mode window_copy_mode = { window_copy_init, @@ -141,6 +143,11 @@ struct window_copy_mode_data { u_int lastcx; /* position in last line with content */ u_int lastsx; /* size of last line with content */ + int leftprunex_set; + u_int leftprunex; + int rightprunex_set; + u_int rightprunex; + enum window_copy_input_type inputtype; const char *inputprompt; char *inputstr; @@ -169,6 +176,9 @@ window_copy_init(struct window_pane *wp) data->lastcx = 0; data->lastsx = 0; + data->leftprunex_set = 0; + data->rightprunex_set = 0; + data->backing_written = 0; data->rectflag = 0; @@ -723,6 +733,12 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key) case MODEKEYCOPY_RECTANGLETOGGLE: window_copy_rectangle_toggle(wp); break; + case MODEKEYCOPY_LEFTPRUNE: + window_copy_left_prune(wp); + break; + case MODEKEYCOPY_RIGHTPRUNE: + window_copy_right_prune(wp); + break; default: break; } @@ -1295,7 +1311,7 @@ window_copy_update_selection(struct window_pane *wp, int may_redraw) struct screen *s = &data->screen; struct options *oo = &wp->window->options; struct grid_cell gc; - u_int sx, sy, ty, cy; + u_int sx, sy, ty, cy, leftprunex, rightprunex; if (!s->sel.flag) return (0); @@ -1320,9 +1336,12 @@ window_copy_update_selection(struct window_pane *wp, int may_redraw) } else sy -= ty; sy = screen_hsize(s) + sy; + leftprunex = data->leftprunex_set ? data->leftprunex : 0; + rightprunex = data->rightprunex_set ? data->rightprunex : (screen_size_x(s) - 1); screen_set_selection(s, - sx, sy, data->cx, screen_hsize(s) + data->cy, data->rectflag, &gc); + sx, sy, data->cx, screen_hsize(s) + data->cy, data->rectflag, + leftprunex, rightprunex, &gc); if (data->rectflag && may_redraw) { /* @@ -1428,6 +1447,23 @@ window_copy_get_selection(struct window_pane *wp, size_t *len) restsx = 0; } + if (data->leftprunex_set) { + if (firstsx < data->leftprunex) { + firstsx = data->leftprunex; + } + if (restsx < data->leftprunex) { + restsx = data->leftprunex; + } + } + if (data->rightprunex_set) { + if (restex > data->rightprunex + 1) { + restex = data->rightprunex + 1; + } + if (lastex > data->rightprunex + 1) { + lastex = data->rightprunex + 1; + } + } + /* Copy the lines. */ for (i = sy; i <= ey; i++) window_copy_copy_line(wp, &buf, &off, i, @@ -2190,3 +2226,27 @@ window_copy_rectangle_toggle(struct window_pane *wp) window_copy_update_selection(wp, 1); window_copy_redraw_screen(wp); } + +void +window_copy_left_prune(struct window_pane *wp) +{ + struct window_copy_mode_data *data = wp->modedata; + if (!data->rightprunex_set || data->cx <= data->rightprunex) { + data->leftprunex = data->cx; + data->leftprunex_set = 1; + window_copy_update_selection(wp, 1); + window_copy_redraw_screen(wp); + } +} + +void +window_copy_right_prune(struct window_pane *wp) +{ + struct window_copy_mode_data *data = wp->modedata; + if (!data->leftprunex_set || data->cx >= data->leftprunex) { + data->rightprunex = data->cx; + data->rightprunex_set = 1; + window_copy_update_selection(wp, 1); + window_copy_redraw_screen(wp); + } +} -- 1.9.1 ------------------------------------------------------------------------------ "Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE Instantly run your Selenium tests across 300+ browser/OS combos. Get unparalleled scalability from the best Selenium testing platform available Simple to use. Nothing to install. Get started now for free." http://p.sf.net/sfu/SauceLabs _______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users