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