Revision: 2646
          http://tmux.svn.sourceforge.net/tmux/?rev=2646&view=rev
Author:   tcunha
Date:     2011-12-06 18:50:26 +0000 (Tue, 06 Dec 2011)
Log Message:
-----------
Sync OpenBSD patchset 986:

Support "jump to" like vi in copy mode using t and T keys. Also add x
and X for delete in edit mode.

>From Ben Boeckel, thanks.

Modified Paths:
--------------
    trunk/mode-key.c
    trunk/tmux.1
    trunk/tmux.h
    trunk/window-copy.c

Modified: trunk/mode-key.c
===================================================================
--- trunk/mode-key.c    2011-12-06 18:48:45 UTC (rev 2645)
+++ trunk/mode-key.c    2011-12-06 18:50:26 UTC (rev 2646)
@@ -98,6 +98,8 @@
        { 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" },
@@ -147,6 +149,7 @@
        { '$',                  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 +165,7 @@
        { '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 },
@@ -225,6 +229,7 @@
        { '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 },
@@ -246,6 +251,7 @@
        { '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 },
@@ -339,6 +345,7 @@
        { '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 },
@@ -363,6 +370,7 @@
        { '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 },

Modified: trunk/tmux.1
===================================================================
--- trunk/tmux.1        2011-12-06 18:48:45 UTC (rev 2645)
+++ trunk/tmux.1        2011-12-06 18:50:26 UTC (rev 2646)
@@ -14,7 +14,7 @@
 .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
 .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: November 15 2011 $
+.Dd $Mdocdate: December 4 2011 $
 .Dt TMUX 1
 .Os
 .Sh NAME
@@ -807,7 +807,9 @@
 .It Li "Half page down" Ta "C-d" Ta "M-Down"
 .It Li "Half page up" Ta "C-u" Ta "M-Up"
 .It Li "Jump forward" Ta "f" Ta "f"
+.It Li "Jump to forward" Ta "t" Ta ""
 .It Li "Jump backward" Ta "F" Ta "F"
+.It Li "Jump to backward" Ta "T" Ta ""
 .It Li "Jump again" Ta ";" Ta ";"
 .It Li "Jump again in reverse" Ta "," Ta ","
 .It Li "Next page" Ta "C-f" Ta "Page down"

Modified: trunk/tmux.h
===================================================================
--- trunk/tmux.h        2011-12-06 18:48:45 UTC (rev 2645)
+++ trunk/tmux.h        2011-12-06 18:50:26 UTC (rev 2646)
@@ -481,6 +481,8 @@
        MODEKEYCOPY_JUMPAGAIN,
        MODEKEYCOPY_JUMPREVERSE,
        MODEKEYCOPY_JUMPBACK,
+       MODEKEYCOPY_JUMPTO,
+       MODEKEYCOPY_JUMPTOBACK,
        MODEKEYCOPY_LEFT,
        MODEKEYCOPY_MIDDLELINE,
        MODEKEYCOPY_NEXTPAGE,

Modified: trunk/window-copy.c
===================================================================
--- trunk/window-copy.c 2011-12-06 18:48:45 UTC (rev 2645)
+++ trunk/window-copy.c 2011-12-06 18:50:26 UTC (rev 2646)
@@ -67,6 +67,8 @@
 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 *);
@@ -90,6 +92,8 @@
        WINDOW_COPY_SEARCHDOWN,
        WINDOW_COPY_JUMPFORWARD,
        WINDOW_COPY_JUMPBACK,
+       WINDOW_COPY_JUMPTOFORWARD,
+       WINDOW_COPY_JUMPTOBACK,
        WINDOW_COPY_GOTOLINE,
 };
 
@@ -132,7 +136,7 @@
 
        enum window_copy_input_type inputtype;
        const char     *inputprompt;
-       char           *inputstr;
+       char           *inputstr;
 
        int             numprefix;
 
@@ -367,16 +371,24 @@
                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;
@@ -581,6 +593,12 @@
                } 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:
@@ -590,6 +608,12 @@
                } 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:
@@ -598,6 +622,18 @@
                *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";
@@ -613,6 +649,8 @@
                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:
@@ -719,6 +757,8 @@
                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:
@@ -1713,6 +1753,62 @@
 }
 
 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;

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Cloud Services Checklist: Pricing and Packaging Optimization
This white paper is intended to serve as a reference, checklist and point of 
discussion for anyone considering optimizing the pricing and packaging model 
of a cloud services business. Read Now!
http://www.accelacomm.com/jaw/sfnl/114/51491232/
_______________________________________________
tmux-cvs mailing list
tmux-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-cvs

Reply via email to