> > 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
Well, we already wait for escape silently. I don't really mind TBH, AFAIK emacs doesn't support this, or at least I never use it. > 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. Ok, applied, although I added to the man page as well. Jumping to before the character rather than after seems arse-backwards to me, but that's the way vi works so meh... ;-) > > --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 > ------------------------------------------------------------------------------ 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