> I don't really see this, why not start a rectangle selection on the "s"
> then go to the end of the longest line and move down from there?

For much longer status outputs it can be a long trip from the longest
line to the bottom and it may not even be obvious without serious
eyeball work which line is the longest.

> If that's too awkward, I don't like this as an extra adjustment to the
> selection, I think it should be a special case of rectangle selection -
> something like a key to enter rectangle and also move the cursor to the
> far right of the screen. So you go to the "s" then press your new key
> and then go to the bottom line.

Many ways of getting to the bottom (e.g.  both L and G) return cursor to
column 1.  A separate binding to force the rectangle out rightwards (for
use right before copying, similar to the "$" from the screen version of
this) might cut it although it seems very weird.

Keith

Thus spake Nicholas Marriott, at Thu, May 15, 2014 at 10:36:30AM +0100:
> Date: Thu, 15 May 2014 10:36:30 +0100
> From: Nicholas Marriott <nicholas.marri...@gmail.com>
> To: Keith Amling <aml...@palantir.com>
> CC: tmux-users@lists.sourceforge.net
> Subject: Re: [PATCH 2/3] Copy mode commands left-prune and right-prune to
>  match screen's c and C.
> 
> I don't really see this, why not start a rectangle selection on the "s"
> then go to the end of the longest line and move down from there?
> 
> If that's too awkward, I don't like this as an extra adjustment to the
> selection, I think it should be a special case of rectangle selection -
> something like a key to enter rectangle and also move the cursor to the
> far right of the screen. So you go to the "s" then press your new key
> and then go to the bottom line.
> 
> It looks like moving down in rectangle mode might have a bug so that'd
> need to be fixed first...
> 
> 
> 
> On Wed, May 14, 2014 at 04:02:16PM -0700, Keith Amling wrote:
> > They cause copy selection to exclude to the left (or right) of the
> > column when they're set.  These are screen's version of block copy and I
> > think they do better than tmux's for copying e.g.  the paths out of `git
> > status`:
> > 
> > > $ git status
> > > ...
> > > #
> > > # some/file
> > > # some/much/much/much/longer/file
> > > # some/shorter/file
> > 
> > With screen I'd navigate to the "s" in "some/file" then " " (start
> > copy), "c" (prune "# "), "jj" or similar (navigate to bottom line), "$"
> > (end of line), " " (complete copy).
> > 
> > With tmux's block mode I could not figure out a good way to move the
> > right and bottom sides far enough.  One way or another I had to do a
> > painful navigation to one of the extremes (either wail on "l" at the
> > bottom row to get to the rightest column or use "$" on the longest row
> > then wail on "j" to navigate to the bottom row).
> > 
> > Keith
> > 
> > Thus spake Nicholas Marriott, at Wed, May 14, 2014 at 07:25:03AM +0100:
> > > Date: Wed, 14 May 2014 07:25:03 +0100
> > > From: Nicholas Marriott <nicholas.marri...@gmail.com>
> > > To: Keith Amling <aml...@palantir.com>
> > > CC: tmux-users@lists.sourceforge.net
> > > Subject: Re: [PATCH 2/3] Copy mode commands left-prune and right-prune to
> > >  match screen's c and C.
> > > 
> > > 
> > > What do these do?
> > > 
> > > 
> > > 
> > > 
> > > On Tue, May 13, 2014 at 08:54:49PM -0700, Keith Amling wrote:
> > > > 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."
> > > > https://urldefense.proofpoint.com/v1/url?u=http://p.sf.net/sfu/SauceLabs&k=fDZpZZQMmYwf27OU23GmAQ%3D%3D%0A&r=BTdtcPIZXD8V7r6BhVE1Cy1S1ITG2lF8LZPYHbBpv%2B0%3D%0A&m=WeRze7PcCSBhNaBLkmFaSCbn%2F2f2bjjPKqnn0V7YBc8%3D%0A&s=b21e920c1772cb37c8ecb2c8f9a60a94253711e3de0a602d79944543f9f0c2ef
> > > > _______________________________________________
> > > > tmux-users mailing list
> > > > tmux-users@lists.sourceforge.net
> > > > https://urldefense.proofpoint.com/v1/url?u=https://lists.sourceforge.net/lists/listinfo/tmux-users&k=fDZpZZQMmYwf27OU23GmAQ%3D%3D%0A&r=BTdtcPIZXD8V7r6BhVE1Cy1S1ITG2lF8LZPYHbBpv%2B0%3D%0A&m=WeRze7PcCSBhNaBLkmFaSCbn%2F2f2bjjPKqnn0V7YBc8%3D%0A&s=82f244c2db8317ccc52403d4bc774b880618e056a80142da4f1fd333a51d22d8

------------------------------------------------------------------------------
"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