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."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
tmux-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-users