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
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-users