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

Reply via email to