Hi

You can already join the lines on paste with the -s flag to
paste-buffer.

I wouldn't do this at all but if there is a good case for it, I would
just prefer a copy-with-separator command which prompted for the
separator (like the prompt we just added for buffer name).



On Tue, May 13, 2014 at 09:27:58PM -0700, Keith Amling wrote:
> This patch is less clear than the preceding two.
> 
> First, should this be bound to anything by default?  'J' is already
> taken in vi-copy.
> 
> Second, the current way of surfacing the current join mode is the best
> thing I could think of but it's sort of ugly and space-wasting.  Screen
> just shows a temporary message naming the new join mode when you switch
> to one but I didn't see any obvious facility for a temporary message
> like that here.
> 
> Finally, ignore or remove the "0+"s in there.  My company's e-mail
> server barfs on this patch without them for completely insane reasons
> that I'm about to fix with both hands.
> 
> Keith
> 
> ---
>  mode-key.c    |  1 +
>  tmux.h        |  1 +
>  window-copy.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
>  3 files changed, 54 insertions(+), 5 deletions(-)
> 
> diff --git a/mode-key.c b/mode-key.c
> index eb97d3f8a385..0c9c86be265c 100644
> --- a/mode-key.c
> +++ b/mode-key.c
> @@ -148,6 +148,7 @@ const struct mode_key_cmdstr mode_key_cmdstr_copy[] = {
>       { MODEKEYCOPY_UP, "cursor-up" },
>       { MODEKEYCOPY_LEFTPRUNE, "left-prune" },
>       { MODEKEYCOPY_RIGHTPRUNE, "right-prune" },
> +     { MODEKEYCOPY_CHANGEJOINMODE, "change-joinmode" },
>  
>       { 0, NULL }
>  };
> diff --git a/tmux.h b/tmux.h
> index aa01b17ee0e3..0c491a413d23 100644
> --- a/tmux.h
> +++ b/tmux.h
> @@ -586,6 +586,7 @@ enum mode_key_cmd {
>       MODEKEYCOPY_UP,
>       MODEKEYCOPY_LEFTPRUNE,
>       MODEKEYCOPY_RIGHTPRUNE,
> +     MODEKEYCOPY_CHANGEJOINMODE,
>  };
>  
>  /* Entry in the default mode key tables. */
> diff --git a/window-copy.c b/window-copy.c
> index 6d2edda8c567..1803762dc899 100644
> --- a/window-copy.c
> +++ b/window-copy.c
> @@ -84,6 +84,7 @@ 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 *);
> +void window_copy_change_joinmode(struct window_pane *);
>  
>  const struct window_mode window_copy_mode = {
>       window_copy_init,
> @@ -106,6 +107,36 @@ enum window_copy_input_type {
>       WINDOW_COPY_GOTOLINE,
>  };
>  
> +enum window_copy_join_mode {
> +     WINDOW_COPY_JOIN_NEWLINE,
> +     WINDOW_COPY_JOIN_NONE,
> +     WINDOW_COPY_JOIN_SPACE,
> +     WINDOW_COPY_JOIN_COMMA,
> +     WINDOW_COPY_JOIN_MAX
> +};
> +
> +struct window_copy_join_mode_data {
> +     const char *header;
> +     const char *delimiter;
> +} join_modes[WINDOW_COPY_JOIN_MAX] = {
> +     {
> +             "",
> +             "\n",
> +     },
> +     {
> +             " [joined]",
> +             "",
> +     },
> +     {
> +             " [joined with spaces]",
> +             " ",
> +     },
> +     {
> +             " [joined with commas]",
> +             ",",
> +     },
> +};
> +
>  /*
>   * Copy-mode's visible screen (the "screen" field) is filled from one of
>   * two sources: the original contents of the pane (used when we
> @@ -148,6 +179,8 @@ struct window_copy_mode_data {
>       int             rightprunex_set;
>       u_int           rightprunex;
>  
> +     enum window_copy_join_mode joinmode;
> +
>       enum window_copy_input_type inputtype;
>       const char     *inputprompt;
>       char           *inputstr;
> @@ -179,6 +212,8 @@ window_copy_init(struct window_pane *wp)
>       data->leftprunex_set = 0;
>       data->rightprunex_set = 0;
>  
> +     data->joinmode = WINDOW_COPY_JOIN_NEWLINE;
> +
>       data->backing_written = 0;
>  
>       data->rectflag = 0;
> @@ -739,6 +774,8 @@ window_copy_key(struct window_pane *wp, struct session 
> *sess, int key)
>       case MODEKEYCOPY_RIGHTPRUNE:
>               window_copy_right_prune(wp);
>               break;
> +     case MODEKEYCOPY_CHANGEJOINMODE:
> +             window_copy_change_joinmode(wp);
>       default:
>               break;
>       }
> @@ -1203,7 +1240,8 @@ window_copy_write_line(
>       last = screen_size_y(s) - 1;
>       if (py == 0) {
>               size = xsnprintf(hdr, sizeof hdr,
> -                 "[%u/%u]", data->oy, screen_hsize(data->backing));
> +                 "[%u/%u]%s", data->oy, screen_hsize(data->backing),
> +                 join_modes[0+data->joinmode].header);
>               if (size > screen_size_x(s))
>                       size = screen_size_x(s);
>               screen_write_cursormove(ctx, screen_size_x(s) - size, 0);
> @@ -1475,7 +1513,7 @@ window_copy_get_selection(struct window_pane *wp, 
> size_t *len)
>               free(buf);
>               return (NULL);
>       }
> -     *len = off - 1; /* remove final \n */
> +     *len = off - strlen(join_modes[0+data->joinmode].delimiter); /* remove 
> final delimiter */
>       return (buf);
>  }
>  
> @@ -1615,10 +1653,11 @@ window_copy_copy_line(struct window_pane *wp,
>               }
>       }
>  
> -     /* Only add a newline if the line wasn't wrapped. */
> +     /* Only add a delimiter if the line wasn't wrapped. */
>       if (!wrapped || ex != xx) {
> -             *buf = xrealloc(*buf, 1, (*off) + 1);
> -             (*buf)[(*off)++] = '\n';
> +             *buf = xrealloc(*buf, 1, (*off) + 
> strlen(join_modes[0+data->joinmode].delimiter));
> +             memcpy(*buf + *off, join_modes[0+data->joinmode].delimiter, 
> strlen(join_modes[0+data->joinmode].delimiter));
> +             *off += strlen(join_modes[0+data->joinmode].delimiter);
>       }
>  }
>  
> @@ -2250,3 +2289,11 @@ window_copy_right_prune(struct window_pane *wp)
>               window_copy_redraw_screen(wp);
>       }
>  }
> +
> +void
> +window_copy_change_joinmode(struct window_pane *wp)
> +{
> +     struct window_copy_mode_data    *data = wp->modedata;
> +     data->joinmode = (data->joinmode + 1) % WINDOW_COPY_JOIN_MAX;
> +     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

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