From 735cfaf09af70df60b90f0b3d64b7d4eb6e34612 Mon Sep 17 00:00:00 2001 From: Tiago Cunha Date: Thu, 28 Jan 2010 22:45:57 +0000 Subject: [PATCH] Sync OpenBSD patchset 621: Alter next-word to have vi-like movement behaviour, and add next-word-end with the existing emacs behaviour. From Micah Cowan. --- mode-key.c | 5 +++-- tmux.1 | 7 ++++--- tmux.h | 3 ++- window-copy.c | 42 +++++++++++++++++++++++++++++++++++++++++- 4 files changed, 50 insertions(+), 7 deletions(-) diff --git a/mode-key.c b/mode-key.c index d3815708..5b26e0f3 100644 --- a/mode-key.c +++ b/mode-key.c @@ -1,4 +1,4 @@ -/* $Id: mode-key.c,v 1.38 2010-01-28 22:41:45 tcunha Exp $ */ +/* $Id: mode-key.c,v 1.39 2010-01-28 22:45:57 tcunha Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott @@ -90,6 +90,7 @@ struct mode_key_cmdstr mode_key_cmdstr_copy[] = { { MODEKEYCOPY_MIDDLELINE, "middle-line" }, { MODEKEYCOPY_NEXTPAGE, "page-down" }, { MODEKEYCOPY_NEXTWORD, "next-word" }, + { MODEKEYCOPY_NEXTWORDEND, "next-word-end" }, { MODEKEYCOPY_PREVIOUSPAGE, "page-up" }, { MODEKEYCOPY_PREVIOUSWORD, "previous-word" }, { MODEKEYCOPY_RIGHT, "cursor-right" }, @@ -276,7 +277,7 @@ const struct mode_key_entry mode_key_emacs_copy[] = { { '\027' /* C-w */, 0, MODEKEYCOPY_COPYSELECTION }, { '\033' /* Escape */, 0, MODEKEYCOPY_CANCEL }, { 'b' | KEYC_ESCAPE, 0, MODEKEYCOPY_PREVIOUSWORD }, - { 'f' | KEYC_ESCAPE, 0, MODEKEYCOPY_NEXTWORD }, + { 'f' | KEYC_ESCAPE, 0, MODEKEYCOPY_NEXTWORDEND }, { 'g', 0, MODEKEYCOPY_GOTOLINE }, { 'm' | KEYC_ESCAPE, 0, MODEKEYCOPY_BACKTOINDENTATION }, { 'n', 0, MODEKEYCOPY_SEARCHAGAIN }, diff --git a/tmux.1 b/tmux.1 index a38ad1dc..90adcb6f 100644 --- a/tmux.1 +++ b/tmux.1 @@ -1,4 +1,4 @@ -.\" $Id: tmux.1,v 1.224 2010-01-28 22:41:45 tcunha Exp $ +.\" $Id: tmux.1,v 1.225 2010-01-28 22:45:57 tcunha Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -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: January 25 2010 $ +.Dd $Mdocdate: January 27 2010 $ .Dt TMUX 1 .Os .Sh NAME @@ -555,7 +555,8 @@ The following keys are supported as appropriate for the mode: .It Li "Half page down" Ta "C-d" Ta "M-Down" .It Li "Half page up" Ta "C-u" Ta "M-Up" .It Li "Next page" Ta "C-f" Ta "Page down" -.It Li "Next word" Ta "w" Ta "M-f" +.It Li "Next word" Ta "w" Ta "" +.It Li "Next word end" Ta "e" Ta "M-f" .It Li "Paste buffer" Ta "p" Ta "C-y" .It Li "Previous page" Ta "C-b" Ta "Page up" .It Li "Previous word" Ta "b" Ta "M-b" diff --git a/tmux.h b/tmux.h index a537a086..20220158 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.537 2010-01-28 22:41:45 tcunha Exp $ */ +/* $Id: tmux.h,v 1.538 2010-01-28 22:45:57 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -460,6 +460,7 @@ enum mode_key_cmd { MODEKEYCOPY_MIDDLELINE, MODEKEYCOPY_NEXTPAGE, MODEKEYCOPY_NEXTWORD, + MODEKEYCOPY_NEXTWORDEND, MODEKEYCOPY_PREVIOUSPAGE, MODEKEYCOPY_PREVIOUSWORD, MODEKEYCOPY_RIGHT, diff --git a/window-copy.c b/window-copy.c index 92fb5e4b..c3b07ce6 100644 --- a/window-copy.c +++ b/window-copy.c @@ -1,4 +1,4 @@ -/* $Id: window-copy.c,v 1.98 2010-01-28 22:43:24 tcunha Exp $ */ +/* $Id: window-copy.c,v 1.99 2010-01-28 22:45:57 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -64,6 +64,7 @@ void window_copy_cursor_right(struct window_pane *); void window_copy_cursor_up(struct window_pane *, int); void window_copy_cursor_down(struct window_pane *, int); void window_copy_cursor_next_word(struct window_pane *); +void window_copy_cursor_next_word_end(struct window_pane *); void window_copy_cursor_previous_word(struct window_pane *); void window_copy_scroll_up(struct window_pane *, u_int); void window_copy_scroll_down(struct window_pane *, u_int); @@ -336,6 +337,9 @@ window_copy_key(struct window_pane *wp, struct client *c, int key) case MODEKEYCOPY_NEXTWORD: window_copy_cursor_next_word(wp); break; + case MODEKEYCOPY_NEXTWORDEND: + window_copy_cursor_next_word_end(wp); + break; case MODEKEYCOPY_PREVIOUSWORD: window_copy_cursor_previous_word(wp); break; @@ -1169,6 +1173,42 @@ window_copy_cursor_next_word(struct window_pane *wp) xx = window_copy_find_length(wp, py); yy = screen_hsize(base_s) + screen_size_y(base_s) - 1; + /* Are we in a word? Skip it! */ + while (!window_copy_is_space(wp, px, py)) + px++; + + /* Find the start of a word. */ + while (px > xx || window_copy_is_space(wp, px, py)) { + /* Past the end of the line? Nothing but spaces. */ + if (px > xx) { + if (py == yy) + return; + window_copy_cursor_down(wp, 0); + px = 0; + + py = screen_hsize(base_s) + data->cy - data->oy; + xx = window_copy_find_length(wp, py); + } + px++; + } + + window_copy_update_cursor(wp, px, data->cy); + if (window_copy_update_selection(wp)) + window_copy_redraw_lines(wp, data->cy, 1); +} + +void +window_copy_cursor_next_word_end(struct window_pane *wp) +{ + struct window_copy_mode_data *data = wp->modedata; + struct screen *base_s = &wp->base; + u_int px, py, xx, yy; + + px = data->cx; + py = screen_hsize(base_s) + data->cy - data->oy; + xx = window_copy_find_length(wp, py); + yy = screen_hsize(base_s) + screen_size_y(base_s) - 1; + /* Are we on spaces? Skip 'em! */ while (px > xx || window_copy_is_space(wp, px, py)) { /* Nothing but spaces past the end of the line, so move down. */