From ab630f72ed7a076a3e49b6649a49f9d8764a861c Mon Sep 17 00:00:00 2001 From: nicm Date: Wed, 11 Dec 2019 18:23:34 +0000 Subject: [PATCH 1/2] Allow search across wrapped lines and fix some inconsistencies in how th position is represented, GitHub issue 2014 from Anindya Mukherjee. --- window-copy.c | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/window-copy.c b/window-copy.c index 16708d04..32e254b5 100644 --- a/window-copy.c +++ b/window-copy.c @@ -2082,16 +2082,24 @@ static int window_copy_search_lr(struct grid *gd, struct grid *sgd, u_int *ppx, u_int py, u_int first, u_int last, int cis) { - u_int ax, bx, px; + u_int ax, bx, px, pywrap, endline; int matched; + endline = gd->hsize + gd->sy - 1; for (ax = first; ax < last; ax++) { - if (ax + sgd->sx > gd->sx) - break; for (bx = 0; bx < sgd->sx; bx++) { px = ax + bx; - matched = window_copy_search_compare(gd, px, py, sgd, - bx, cis); + pywrap = py; + /* Wrap line. */ + while (px >= gd->sx && pywrap < endline) { + px -= gd->sx; + pywrap++; + } + /* We have run off the end of the grid. */ + if (px >= gd->sx) + break; + matched = window_copy_search_compare(gd, px, pywrap, + sgd, bx, cis); if (!matched) break; } @@ -2107,16 +2115,24 @@ static int window_copy_search_rl(struct grid *gd, struct grid *sgd, u_int *ppx, u_int py, u_int first, u_int last, int cis) { - u_int ax, bx, px; + u_int ax, bx, px, pywrap, endline; int matched; - for (ax = last + 1; ax > first; ax--) { - if (gd->sx - (ax - 1) < sgd->sx) - continue; + endline = gd->hsize + gd->sy - 1; + for (ax = last; ax > first; ax--) { for (bx = 0; bx < sgd->sx; bx++) { px = ax - 1 + bx; - matched = window_copy_search_compare(gd, px, py, sgd, - bx, cis); + pywrap = py; + /* Wrap line. */ + while (px >= gd->sx && pywrap < endline) { + px -= gd->sx; + pywrap++; + } + /* We have run off the end of the grid. */ + if (px >= gd->sx) + break; + matched = window_copy_search_compare(gd, px, pywrap, + sgd, bx, cis); if (!matched) break; } @@ -2135,7 +2151,7 @@ window_copy_move_left(struct screen *s, u_int *fx, u_int *fy, int wrapflag) if (*fy == 0) { /* top */ if (wrapflag) { *fx = screen_size_x(s) - 1; - *fy = screen_hsize(s) + screen_size_y(s); + *fy = screen_hsize(s) + screen_size_y(s) - 1; } return; } @@ -2149,7 +2165,7 @@ static void window_copy_move_right(struct screen *s, u_int *fx, u_int *fy, int wrapflag) { if (*fx == screen_size_x(s) - 1) { /* right */ - if (*fy == screen_hsize(s) + screen_size_y(s)) { /* bottom */ + if (*fy == screen_hsize(s) + screen_size_y(s) - 1) { /* bottom */ if (wrapflag) { *fx = 0; *fy = 0; @@ -2199,12 +2215,12 @@ window_copy_search_jump(struct window_mode_entry *wme, struct grid *gd, } else { for (i = fy + 1; endline < i; i--) { found = window_copy_search_rl(gd, sgd, &px, i - 1, 0, - fx, cis); + fx + 1, cis); if (found) { i--; break; } - fx = gd->sx; + fx = gd->sx - 1; } } From 64fb7e472a9e627ee486707ab9d30b607d76478a Mon Sep 17 00:00:00 2001 From: nicm Date: Wed, 11 Dec 2019 18:30:29 +0000 Subject: [PATCH 2/2] Tweak previous to check the wrapped flag and stop if not set. --- window-copy.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/window-copy.c b/window-copy.c index 32e254b5..4787fb27 100644 --- a/window-copy.c +++ b/window-copy.c @@ -2082,8 +2082,9 @@ static int window_copy_search_lr(struct grid *gd, struct grid *sgd, u_int *ppx, u_int py, u_int first, u_int last, int cis) { - u_int ax, bx, px, pywrap, endline; - int matched; + u_int ax, bx, px, pywrap, endline; + int matched; + struct grid_line *gl; endline = gd->hsize + gd->sy - 1; for (ax = first; ax < last; ax++) { @@ -2092,6 +2093,9 @@ window_copy_search_lr(struct grid *gd, pywrap = py; /* Wrap line. */ while (px >= gd->sx && pywrap < endline) { + gl = grid_get_line(gd, pywrap); + if (~gl->flags & GRID_LINE_WRAPPED) + break; px -= gd->sx; pywrap++; } @@ -2115,8 +2119,9 @@ static int window_copy_search_rl(struct grid *gd, struct grid *sgd, u_int *ppx, u_int py, u_int first, u_int last, int cis) { - u_int ax, bx, px, pywrap, endline; - int matched; + u_int ax, bx, px, pywrap, endline; + int matched; + struct grid_line *gl; endline = gd->hsize + gd->sy - 1; for (ax = last; ax > first; ax--) { @@ -2125,6 +2130,9 @@ window_copy_search_rl(struct grid *gd, pywrap = py; /* Wrap line. */ while (px >= gd->sx && pywrap < endline) { + gl = grid_get_line(gd, pywrap); + if (~gl->flags & GRID_LINE_WRAPPED) + break; px -= gd->sx; pywrap++; }