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

Reply via email to