Fix two copy mode problems:

1. In vi mode the selection doesn't include the last character if you
   moved the cursor up or left.
2. In emacs mode the selection includes the last character if you moved
   the cursor to the left.

From Balazs Kezes.
This commit is contained in:
nicm 2014-08-11 22:18:16 +00:00
parent f518a077b1
commit 29d20a55b6
3 changed files with 20 additions and 5 deletions

View File

@ -276,6 +276,7 @@ int
screen_check_selection(struct screen *s, u_int px, u_int py)
{
struct screen_sel *sel = &s->sel;
u_int xx;
if (!sel->flag)
return (0);
@ -325,16 +326,24 @@ screen_check_selection(struct screen *s, u_int px, u_int py)
if (py < sel->sy || py > sel->ey)
return (0);
if ((py == sel->sy && px < sel->sx)
|| (py == sel->ey && px > sel->ex))
if (py == sel->sy && px < sel->sx)
return 0;
if (py == sel->ey && px > sel->ex)
return (0);
} else if (sel->sy > sel->ey) {
/* starting line > ending line -- upward selection. */
if (py > sel->sy || py < sel->ey)
return (0);
if ((py == sel->sy && px >= sel->sx)
|| (py == sel->ey && px < sel->ex))
if (py == sel->ey && px < sel->ex)
return (0);
if (sel->modekeys == MODEKEY_EMACS)
xx = sel->sx - 1;
else
xx = sel->sx;
if (py == sel->sy && px > xx)
return (0);
} else {
/* starting line == ending line. */
@ -343,7 +352,11 @@ screen_check_selection(struct screen *s, u_int px, u_int py)
if (sel->ex < sel->sx) {
/* cursor (ex) is on the left */
if (px > sel->sx || px < sel->ex)
if (sel->modekeys == MODEKEY_EMACS)
xx = sel->sx - 1;
else
xx = sel->sx;
if (px > xx || px < sel->ex)
return (0);
} else {
/* selection start (sx) is on the left */

1
tmux.h
View File

@ -794,6 +794,7 @@ LIST_HEAD(joblist, job);
struct screen_sel {
int flag;
int rectflag;
int modekeys;
u_int sx;
u_int sy;

View File

@ -199,6 +199,7 @@ window_copy_init(struct window_pane *wp)
mode_key_init(&data->mdata, &mode_key_tree_emacs_copy);
else
mode_key_init(&data->mdata, &mode_key_tree_vi_copy);
s->sel.modekeys = keys;
data->backing = NULL;