> > 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

Reply via email to