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
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-cvs