On Sun, Nov 27, 2011 at 03:00:50 +0000, Nicholas Marriott wrote: > Don't n and N etc remember it already? I can just keep pressing N to > search... > > I don't mind remembering anything else too.
Ah, yep. I missed that in the code. I can't remember what made me think it wasn't done... > > As a side note, I have 't' and 'T' implemented for copy mode here > > (testing them before doing work to bring the window_copy_cursor_jump* > > functions together (since adding jump_to and jump_to_back makes it four > > copies of really similar code) into one. I'll work on adding the > > movements to the status line as well (though these might be overkill). > > Ok cool. I got the window copy part of it done. I don't know how the status one should work...there's no way to get the character to jump to without using the status line (or to wait for it silently like vi, but that may be unwanted). Word jumping and number modified 'h' and 'l' should suffice I'd think. Patches attached. I also added bindings for 'x' and 'X' in vi normal mode for the status line to be delete and backspace, respectively. --Ben
From f3939af7571983f646fbcdbd505d3d8240f9937d Mon Sep 17 00:00:00 2001 From: Ben Boeckel <maths...@gmail.com> Date: Wed, 30 Nov 2011 21:43:16 -0500 Subject: [PATCH 1/5] Add bindings for jump-to and jump-to-back --- trunk/mode-key.c | 6 ++++++ trunk/tmux.h | 2 ++ trunk/window-copy.c | 2 ++ 3 files changed, 10 insertions(+), 0 deletions(-) diff --git a/trunk/mode-key.c b/trunk/mode-key.c index e45f1c6..c848b79 100644 --- a/trunk/mode-key.c +++ b/trunk/mode-key.c @@ -98,6 +98,8 @@ const struct mode_key_cmdstr mode_key_cmdstr_copy[] = { { MODEKEYCOPY_JUMPAGAIN, "jump-again" }, { MODEKEYCOPY_JUMPREVERSE, "jump-reverse" }, { MODEKEYCOPY_JUMPBACK, "jump-backward" }, + { MODEKEYCOPY_JUMPTO, "jump-to-forward" }, + { MODEKEYCOPY_JUMPTOBACK, "jump-to-backward" }, { MODEKEYCOPY_LEFT, "cursor-left" }, { MODEKEYCOPY_RECTANGLETOGGLE, "rectangle-toggle" }, { MODEKEYCOPY_MIDDLELINE, "middle-line" }, @@ -223,6 +225,7 @@ const struct mode_key_entry mode_key_vi_copy[] = { { 'L', 0, MODEKEYCOPY_BOTTOMLINE }, { 'M', 0, MODEKEYCOPY_MIDDLELINE }, { 'N', 0, MODEKEYCOPY_SEARCHREVERSE }, + { 'T', 0, MODEKEYCOPY_JUMPTOBACK }, { 'W', 0, MODEKEYCOPY_NEXTSPACE }, { '\002' /* C-b */, 0, MODEKEYCOPY_PREVIOUSPAGE }, { '\003' /* C-c */, 0, MODEKEYCOPY_CANCEL }, @@ -244,6 +247,7 @@ const struct mode_key_entry mode_key_vi_copy[] = { { 'k', 0, MODEKEYCOPY_UP }, { 'l', 0, MODEKEYCOPY_RIGHT }, { 'n', 0, MODEKEYCOPY_SEARCHAGAIN }, + { 't', 0, MODEKEYCOPY_JUMPTO }, { 'q', 0, MODEKEYCOPY_CANCEL }, { 'v', 0, MODEKEYCOPY_RECTANGLETOGGLE }, { 'w', 0, MODEKEYCOPY_NEXTWORD }, @@ -335,6 +339,7 @@ const struct mode_key_entry mode_key_emacs_copy[] = { { 'N', 0, MODEKEYCOPY_SEARCHREVERSE }, { 'R' | KEYC_ESCAPE, 0, MODEKEYCOPY_TOPLINE }, { 'R', 0, MODEKEYCOPY_RECTANGLETOGGLE }, + { 'T', 0, MODEKEYCOPY_JUMPTOBACK }, { '\000' /* C-Space */, 0, MODEKEYCOPY_STARTSELECTION }, { '\001' /* C-a */, 0, MODEKEYCOPY_STARTOFLINE }, { '\002' /* C-b */, 0, MODEKEYCOPY_LEFT }, @@ -359,6 +364,7 @@ const struct mode_key_entry mode_key_emacs_copy[] = { { 'n', 0, MODEKEYCOPY_SEARCHAGAIN }, { 'q', 0, MODEKEYCOPY_CANCEL }, { 'r' | KEYC_ESCAPE, 0, MODEKEYCOPY_MIDDLELINE }, + { 't', 0, MODEKEYCOPY_JUMPTO }, { 'v' | KEYC_ESCAPE, 0, MODEKEYCOPY_PREVIOUSPAGE }, { 'w' | KEYC_ESCAPE, 0, MODEKEYCOPY_COPYSELECTION }, { KEYC_DOWN | KEYC_CTRL,0, MODEKEYCOPY_SCROLLDOWN }, diff --git a/trunk/tmux.h b/trunk/tmux.h index 8c9f9e7..dc168c9 100644 --- a/trunk/tmux.h +++ b/trunk/tmux.h @@ -481,6 +481,8 @@ enum mode_key_cmd { MODEKEYCOPY_JUMPAGAIN, MODEKEYCOPY_JUMPREVERSE, MODEKEYCOPY_JUMPBACK, + MODEKEYCOPY_JUMPTO, + MODEKEYCOPY_JUMPTOBACK, MODEKEYCOPY_LEFT, MODEKEYCOPY_MIDDLELINE, MODEKEYCOPY_NEXTPAGE, diff --git a/trunk/window-copy.c b/trunk/window-copy.c index b41ca7e..a140562 100644 --- a/trunk/window-copy.c +++ b/trunk/window-copy.c @@ -90,6 +90,8 @@ enum window_copy_input_type { WINDOW_COPY_SEARCHDOWN, WINDOW_COPY_JUMPFORWARD, WINDOW_COPY_JUMPBACK, + WINDOW_COPY_JUMPTOFORWARD, + WINDOW_COPY_JUMPTOBACK, WINDOW_COPY_GOTOLINE, }; -- 1.7.6.4
From 34187d95690cddbef61bcb8d2b0ebbbdec8d71aa Mon Sep 17 00:00:00 2001 From: Ben Boeckel <maths...@gmail.com> Date: Wed, 30 Nov 2011 21:43:34 -0500 Subject: [PATCH 2/5] Whitespace fixes --- trunk/mode-key.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) diff --git a/trunk/mode-key.c b/trunk/mode-key.c index c848b79..b65b8ad 100644 --- a/trunk/mode-key.c +++ b/trunk/mode-key.c @@ -175,11 +175,11 @@ struct mode_key_tree mode_key_tree_vi_edit; /* vi choice selection keys. */ const struct mode_key_entry mode_key_vi_choice[] = { - { '\002' /* C-b */, 0, MODEKEYCHOICE_PAGEUP }, + { '\002' /* C-b */, 0, MODEKEYCHOICE_PAGEUP }, { '\003' /* C-c */, 0, MODEKEYCHOICE_CANCEL }, - { '\005' /* C-e */, 0, MODEKEYCHOICE_SCROLLDOWN }, - { '\006' /* C-f */, 0, MODEKEYCHOICE_PAGEDOWN }, - { '\031' /* C-y */, 0, MODEKEYCHOICE_SCROLLUP }, + { '\005' /* C-e */, 0, MODEKEYCHOICE_SCROLLDOWN }, + { '\006' /* C-f */, 0, MODEKEYCHOICE_PAGEDOWN }, + { '\031' /* C-y */, 0, MODEKEYCHOICE_SCROLLUP }, { '\r', 0, MODEKEYCHOICE_CHOOSE }, { 'j', 0, MODEKEYCHOICE_DOWN }, { 'k', 0, MODEKEYCHOICE_UP }, @@ -239,7 +239,7 @@ const struct mode_key_entry mode_key_vi_copy[] = { { '\r', 0, MODEKEYCOPY_COPYSELECTION }, { '^', 0, MODEKEYCOPY_BACKTOINDENTATION }, { 'b', 0, MODEKEYCOPY_PREVIOUSWORD }, - { 'e', 0, MODEKEYCOPY_NEXTWORDEND }, + { 'e', 0, MODEKEYCOPY_NEXTWORDEND }, { 'f', 0, MODEKEYCOPY_JUMP }, { 'g', 0, MODEKEYCOPY_HISTORYTOP }, { 'h', 0, MODEKEYCOPY_LEFT }, @@ -333,8 +333,8 @@ const struct mode_key_entry mode_key_emacs_copy[] = { { '7' | KEYC_ESCAPE, 0, MODEKEYCOPY_STARTNUMBERPREFIX }, { '8' | KEYC_ESCAPE, 0, MODEKEYCOPY_STARTNUMBERPREFIX }, { '9' | KEYC_ESCAPE, 0, MODEKEYCOPY_STARTNUMBERPREFIX }, - { '<' | KEYC_ESCAPE, 0, MODEKEYCOPY_HISTORYTOP }, - { '>' | KEYC_ESCAPE, 0, MODEKEYCOPY_HISTORYBOTTOM }, + { '<' | KEYC_ESCAPE, 0, MODEKEYCOPY_HISTORYTOP }, + { '>' | KEYC_ESCAPE, 0, MODEKEYCOPY_HISTORYBOTTOM }, { 'F', 0, MODEKEYCOPY_JUMPBACK }, { 'N', 0, MODEKEYCOPY_SEARCHREVERSE }, { 'R' | KEYC_ESCAPE, 0, MODEKEYCOPY_TOPLINE }, @@ -368,14 +368,14 @@ const struct mode_key_entry mode_key_emacs_copy[] = { { 'v' | KEYC_ESCAPE, 0, MODEKEYCOPY_PREVIOUSPAGE }, { 'w' | KEYC_ESCAPE, 0, MODEKEYCOPY_COPYSELECTION }, { KEYC_DOWN | KEYC_CTRL,0, MODEKEYCOPY_SCROLLDOWN }, - { KEYC_DOWN | KEYC_ESCAPE, 0, MODEKEYCOPY_HALFPAGEDOWN }, + { KEYC_DOWN | KEYC_ESCAPE,0, MODEKEYCOPY_HALFPAGEDOWN }, { KEYC_DOWN, 0, MODEKEYCOPY_DOWN }, { KEYC_LEFT, 0, MODEKEYCOPY_LEFT }, { KEYC_NPAGE, 0, MODEKEYCOPY_NEXTPAGE }, { KEYC_PPAGE, 0, MODEKEYCOPY_PREVIOUSPAGE }, { KEYC_RIGHT, 0, MODEKEYCOPY_RIGHT }, { KEYC_UP | KEYC_CTRL, 0, MODEKEYCOPY_SCROLLUP }, - { KEYC_UP | KEYC_ESCAPE, 0, MODEKEYCOPY_HALFPAGEUP }, + { KEYC_UP | KEYC_ESCAPE,0, MODEKEYCOPY_HALFPAGEUP }, { KEYC_UP, 0, MODEKEYCOPY_UP }, { 0, -1, 0 } -- 1.7.6.4
From 4b325f84111c1ca7ac199341a87d5364cb640be9 Mon Sep 17 00:00:00 2001 From: Ben Boeckel <maths...@gmail.com> Date: Wed, 30 Nov 2011 21:43:58 -0500 Subject: [PATCH 3/5] Implement till movement --- trunk/window-copy.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 97 insertions(+), 3 deletions(-) diff --git a/trunk/window-copy.c b/trunk/window-copy.c index a140562..a8b7d25 100644 --- a/trunk/window-copy.c +++ b/trunk/window-copy.c @@ -67,6 +67,8 @@ void window_copy_cursor_up(struct window_pane *, int); void window_copy_cursor_down(struct window_pane *, int); void window_copy_cursor_jump(struct window_pane *); void window_copy_cursor_jump_back(struct window_pane *); +void window_copy_cursor_jump_to(struct window_pane *); +void window_copy_cursor_jump_to_back(struct window_pane *); void window_copy_cursor_next_word(struct window_pane *, const char *); void window_copy_cursor_next_word_end(struct window_pane *, const char *); void window_copy_cursor_previous_word(struct window_pane *, const char *); @@ -134,7 +136,7 @@ struct window_copy_mode_data { enum window_copy_input_type inputtype; const char *inputprompt; - char *inputstr; + char *inputstr; int numprefix; @@ -369,16 +371,24 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key) np = 1; if (data->inputtype == WINDOW_COPY_JUMPFORWARD || - data->inputtype == WINDOW_COPY_JUMPBACK) { + data->inputtype == WINDOW_COPY_JUMPBACK || + data->inputtype == WINDOW_COPY_JUMPTOFORWARD || + data->inputtype == WINDOW_COPY_JUMPTOBACK) { /* Ignore keys with modifiers. */ if ((key & KEYC_MASK_MOD) == 0) { data->jumpchar = key; if (data->inputtype == WINDOW_COPY_JUMPFORWARD) { for (; np != 0; np--) window_copy_cursor_jump(wp); - } else { + } else if (data->inputtype == WINDOW_COPY_JUMPBACK) { for (; np != 0; np--) window_copy_cursor_jump_back(wp); + } else if (data->inputtype == WINDOW_COPY_JUMPTOFORWARD) { + for (; np != 0; np--) + window_copy_cursor_jump_to(wp); + } else if (data->inputtype == WINDOW_COPY_JUMPTOBACK) { + for (; np != 0; np--) + window_copy_cursor_jump_to_back(wp); } } data->jumptype = data->inputtype; @@ -583,6 +593,12 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key) } else if (data->jumptype == WINDOW_COPY_JUMPBACK) { for (; np != 0; np--) window_copy_cursor_jump_back(wp); + } else if (data->jumptype == WINDOW_COPY_JUMPTOFORWARD) { + for (; np != 0; np--) + window_copy_cursor_jump_to(wp); + } else if (data->jumptype == WINDOW_COPY_JUMPTOBACK) { + for (; np != 0; np--) + window_copy_cursor_jump_to_back(wp); } break; case MODEKEYCOPY_JUMPREVERSE: @@ -592,6 +608,12 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key) } else if (data->jumptype == WINDOW_COPY_JUMPBACK) { for (; np != 0; np--) window_copy_cursor_jump(wp); + } else if (data->jumptype == WINDOW_COPY_JUMPTOFORWARD) { + for (; np != 0; np--) + window_copy_cursor_jump_to_back(wp); + } else if (data->jumptype == WINDOW_COPY_JUMPTOBACK) { + for (; np != 0; np--) + window_copy_cursor_jump_to(wp); } break; case MODEKEYCOPY_JUMPBACK: @@ -600,6 +622,18 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key) *data->inputstr = '\0'; window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1); return; /* skip numprefix reset */ + case MODEKEYCOPY_JUMPTO: + data->inputtype = WINDOW_COPY_JUMPTOFORWARD; + data->inputprompt = "Jump To"; + *data->inputstr = '\0'; + window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1); + return; /* skip numprefix reset */ + case MODEKEYCOPY_JUMPTOBACK: + data->inputtype = WINDOW_COPY_JUMPTOBACK; + data->inputprompt = "Jump To Back"; + *data->inputstr = '\0'; + window_copy_redraw_lines(wp, screen_size_y(s) - 1, 1); + return; /* skip numprefix reset */ case MODEKEYCOPY_SEARCHUP: data->inputtype = WINDOW_COPY_SEARCHUP; data->inputprompt = "Search Up"; @@ -615,6 +649,8 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key) case WINDOW_COPY_GOTOLINE: case WINDOW_COPY_JUMPFORWARD: case WINDOW_COPY_JUMPBACK: + case WINDOW_COPY_JUMPTOFORWARD: + case WINDOW_COPY_JUMPTOBACK: case WINDOW_COPY_NUMERICPREFIX: break; case WINDOW_COPY_SEARCHUP: @@ -721,6 +757,8 @@ window_copy_key_input(struct window_pane *wp, int key) case WINDOW_COPY_OFF: case WINDOW_COPY_JUMPFORWARD: case WINDOW_COPY_JUMPBACK: + case WINDOW_COPY_JUMPTOFORWARD: + case WINDOW_COPY_JUMPTOBACK: case WINDOW_COPY_NUMERICPREFIX: break; case WINDOW_COPY_SEARCHUP: @@ -1715,6 +1753,62 @@ window_copy_cursor_jump_back(struct window_pane *wp) } void +window_copy_cursor_jump_to(struct window_pane *wp) +{ + struct window_copy_mode_data *data = wp->modedata; + struct screen *back_s = data->backing; + const struct grid_cell *gc; + u_int px, py, xx; + + px = data->cx + 1; + py = screen_hsize(back_s) + data->cy - data->oy; + xx = window_copy_find_length(wp, py); + + while (px < xx) { + gc = grid_peek_cell(back_s->grid, px, py); + if ((gc->flags & (GRID_FLAG_PADDING|GRID_FLAG_UTF8)) == 0 + && gc->data == data->jumpchar) { + + window_copy_update_cursor(wp, px - 1, data->cy); + if (window_copy_update_selection(wp)) + window_copy_redraw_lines(wp, data->cy, 1); + return; + } + px++; + } +} + +void +window_copy_cursor_jump_to_back(struct window_pane *wp) +{ + struct window_copy_mode_data *data = wp->modedata; + struct screen *back_s = data->backing; + const struct grid_cell *gc; + u_int px, py; + + px = data->cx; + py = screen_hsize(back_s) + data->cy - data->oy; + + if (px > 0) + px--; + + for (;;) { + gc = grid_peek_cell(back_s->grid, px, py); + if ((gc->flags & (GRID_FLAG_PADDING|GRID_FLAG_UTF8)) == 0 + && gc->data == data->jumpchar) { + + window_copy_update_cursor(wp, px + 1, data->cy); + if (window_copy_update_selection(wp)) + window_copy_redraw_lines(wp, data->cy, 1); + return; + } + if (px == 0) + break; + px--; + } +} + +void window_copy_cursor_next_word(struct window_pane *wp, const char *separators) { struct window_copy_mode_data *data = wp->modedata; -- 1.7.6.4
From 0115f26983d9fabae6355bd820843a5ecaab27c8 Mon Sep 17 00:00:00 2001 From: Ben Boeckel <maths...@gmail.com> Date: Thu, 1 Dec 2011 22:30:03 -0500 Subject: [PATCH 4/5] Add 'x' and 'X' bindings to vi status editing x and X are delete and backspace in normal mode in vi, respectively. --- trunk/mode-key.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/trunk/mode-key.c b/trunk/mode-key.c index b65b8ad..5d0b719 100644 --- a/trunk/mode-key.c +++ b/trunk/mode-key.c @@ -147,6 +147,7 @@ const struct mode_key_entry mode_key_vi_edit[] = { { '$', 1, MODEKEYEDIT_ENDOFLINE }, { '0', 1, MODEKEYEDIT_STARTOFLINE }, { 'D', 1, MODEKEYEDIT_DELETETOENDOFLINE }, + { 'X', 1, MODEKEYEDIT_BACKSPACE }, { '\003' /* C-c */, 1, MODEKEYEDIT_CANCEL }, { '\010' /* C-h */, 1, MODEKEYEDIT_BACKSPACE }, { '\r', 1, MODEKEYEDIT_ENTER }, @@ -162,6 +163,7 @@ const struct mode_key_entry mode_key_vi_edit[] = { { 'l', 1, MODEKEYEDIT_CURSORRIGHT }, { 'p', 1, MODEKEYEDIT_PASTE }, { 'w', 1, MODEKEYEDIT_NEXTWORD }, + { 'x', 1, MODEKEYEDIT_DELETE }, { KEYC_BSPACE, 1, MODEKEYEDIT_BACKSPACE }, { KEYC_DC, 1, MODEKEYEDIT_DELETE }, { KEYC_DOWN, 1, MODEKEYEDIT_HISTORYDOWN }, -- 1.7.6.4
pgpiOy2RVWSsS.pgp
Description: PGP signature
------------------------------------------------------------------------------ All the data continuously generated in your IT infrastructure contains a definitive record of customers, application performance, security threats, fraudulent activity, and more. Splunk takes this data and makes sense of it. IT sense. And common sense. http://p.sf.net/sfu/splunk-novd2d
_______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users