Ok, is this good to go?
On Wed, Apr 22, 2015 at 12:36:14AM +0100, Nicholas Marriott wrote: > Hi > > I made a few changes to your first diff, please take a look. Notably: > > - update to latest git > - renamed some functions and variables to be shorter > - split window_copy_move_coordinates into two functions to avoid so much ?: > - passing const int into a function is useless, just use int > - don't use backticks for quotation marks, they look awful > - otherwise reformat some comments > > Seems to work but please take a look, then I will apply it and we can > move from there with the next diff. > > > Index: window-copy.c > =================================================================== > RCS file: /cvs/src/usr.bin/tmux/window-copy.c,v > retrieving revision 1.129 > diff -u -p -r1.129 window-copy.c > --- window-copy.c 21 Apr 2015 15:16:06 -0000 1.129 > +++ window-copy.c 21 Apr 2015 23:34:57 -0000 > @@ -47,8 +47,14 @@ int window_copy_search_lr(struct grid *, > u_int, u_int, int); > int window_copy_search_rl(struct grid *, struct grid *, u_int *, u_int, > u_int, u_int, int); > -void window_copy_search_up(struct window_pane *, const char *); > -void window_copy_search_down(struct window_pane *, const char *); > +void window_copy_move_left(struct screen *, u_int *, u_int *); > +void window_copy_move_right(struct screen *, u_int *, u_int *); > +int window_copy_is_lowercase(const char *); > +void window_copy_search_jump(struct window_pane *, struct grid *, > + struct grid *, u_int, u_int, u_int, int, int, int); > +void window_copy_search(struct window_pane *, const char *, int, int); > +void window_copy_search_up(struct window_pane *, const char *, int); > +void window_copy_search_down(struct window_pane *, const char *, int); > void window_copy_goto_line(struct window_pane *, const char *); > void window_copy_update_cursor(struct window_pane *, u_int, u_int); > void window_copy_start_selection(struct window_pane *); > @@ -706,20 +712,20 @@ window_copy_key(struct window_pane *wp, > ss = data->searchstr; > if (cmd == MODEKEYCOPY_SEARCHAGAIN) { > for (; np != 0; np--) > - window_copy_search_up(wp, ss); > + window_copy_search_up(wp, ss, 1); > } else { > for (; np != 0; np--) > - window_copy_search_down(wp, ss); > + window_copy_search_down(wp, ss, 1); > } > break; > case WINDOW_COPY_SEARCHDOWN: > ss = data->searchstr; > if (cmd == MODEKEYCOPY_SEARCHAGAIN) { > for (; np != 0; np--) > - window_copy_search_down(wp, ss); > + window_copy_search_down(wp, ss, 1); > } else { > for (; np != 0; np--) > - window_copy_search_up(wp, ss); > + window_copy_search_up(wp, ss, 1); > } > break; > } > @@ -828,16 +834,16 @@ window_copy_key_input(struct window_pane > case WINDOW_COPY_NUMERICPREFIX: > break; > case WINDOW_COPY_SEARCHUP: > - for (; np != 0; np--) > - window_copy_search_up(wp, data->inputstr); > data->searchtype = data->inputtype; > data->searchstr = xstrdup(data->inputstr); > + for (; np != 0; np--) > + window_copy_search_up(wp, data->inputstr, 0); > break; > case WINDOW_COPY_SEARCHDOWN: > - for (; np != 0; np--) > - window_copy_search_down(wp, data->inputstr); > data->searchtype = data->inputtype; > data->searchstr = xstrdup(data->inputstr); > + for (; np != 0; np--) > + window_copy_search_down(wp, data->inputstr, 0); > break; > case WINDOW_COPY_NAMEDBUFFER: > window_copy_copy_selection(wp, data->inputstr); > @@ -989,89 +995,103 @@ window_copy_search_rl(struct grid *gd, > } > > void > -window_copy_search_up(struct window_pane *wp, const char *searchstr) > +window_copy_move_left(struct screen *s, u_int *fx, u_int *fy) > { > - struct window_copy_mode_data *data = wp->modedata; > - struct screen *s = data->backing, ss; > - struct screen_write_ctx ctx; > - struct grid *gd = s->grid, *sgd; > - struct grid_cell gc; > - size_t searchlen; > - u_int i, last, fx, fy, px; > - int utf8flag, n, wrapped, wrapflag, cis; > - const char *ptr; > - > - if (*searchstr == '\0') > - return; > - utf8flag = options_get_number(&wp->window->options, "utf8"); > - wrapflag = options_get_number(&wp->window->options, "wrap-search"); > - searchlen = screen_write_strlen(utf8flag, "%s", searchstr); > - > - screen_init(&ss, searchlen, 1, 0); > - screen_write_start(&ctx, NULL, &ss); > - memcpy(&gc, &grid_default_cell, sizeof gc); > - screen_write_nputs(&ctx, -1, &gc, utf8flag, "%s", searchstr); > - screen_write_stop(&ctx); > - > - fx = data->cx; > - fy = gd->hsize - data->oy + data->cy; > + if (*fx == 0) { /* left */ > + if (*fy == 0) /* top */ > + return; > + *fx = screen_size_x(s) - 1; > + *fy = *fy - 1; > + } else > + *fx = *fx - 1; > +} > > - if (fx == 0) { > - if (fy == 0) > +void > +window_copy_move_right(struct screen *s, u_int *fx, u_int *fy) > +{ > + if (*fx == screen_size_x(s) - 1) { /* right */ > + if (*fy == screen_hsize(s) + screen_size_y(s)) /* bottom */ > return; > - fx = gd->sx - 1; > - fy--; > + *fx = 0; > + *fy = *fy + 1; > } else > - fx--; > - n = wrapped = 0; > + *fx = *fx + 1; > +} > > - cis = 1; > - for (ptr = searchstr; *ptr != '\0'; ptr++) { > +int > +window_copy_is_lowercase(const char *ptr) > +{ > + while (*ptr != '\0') { > if (*ptr != tolower((u_char)*ptr)) { > - cis = 0; > - break; > + return 0; > } > + ++ptr; > } > + return 1; > +} > > -retry: > - sgd = ss.grid; > - for (i = fy + 1; i > 0; i--) { > - last = screen_size_x(s); > - if (i == fy + 1) > - last = fx; > - n = window_copy_search_rl(gd, sgd, &px, i - 1, 0, last, cis); > - if (n) { > - window_copy_scroll_to(wp, px, i - 1); > - break; > +/* > + * Search for text stored in sgd starting from position fx,fy up to endline. > If > + * found, jump to it. If cis then ignore case. The direction is 0 for > searching > + * up, down otherwise. If wrap then go to begin/end of grid and try again if > + * not found. > + */ > +void > +window_copy_search_jump(struct window_pane *wp, struct grid *gd, > + struct grid *sgd, u_int fx, u_int fy, u_int endline, int cis, int wrap, > + int direction) > +{ > + u_int i, px; > + int first = 1, found = 0; > + > + if (direction) { > + for (i = fy; i <= endline; ++i) { > + found = window_copy_search_lr(gd, sgd, &px, i, > + first ? fx : 0, gd->sx, cis); > + if (found) > + break; > + first = 0; > + } > + } else { > + for (i = fy + 1; endline < i; --i) { > + found = window_copy_search_rl(gd, sgd, &px, i - 1, 0, > + first ? fx : gd->sx, cis); > + if (found) { > + i--; > + break; > + } > + first = 0; > } > } > - if (wrapflag && !n && !wrapped) { > - fx = gd->sx - 1; > - fy = gd->hsize + gd->sy - 1; > - wrapped = 1; > - goto retry; > + if (found) > + window_copy_scroll_to(wp, px, i); > + else if (wrap) { > + /* Start searching from begin/end of grid. */ > + window_copy_search_jump(wp, gd, sgd, direction ? 0 : gd->sx - 1, > + direction ? 0 : gd->hsize + gd->sy - 1, fy, cis, 0, > + direction); > } > - > - screen_free(&ss); > } > > void > -window_copy_search_down(struct window_pane *wp, const char *searchstr) > +window_copy_search(struct window_pane *wp, const char *searchstr, int > direction, > + int moveflag) > { > struct window_copy_mode_data *data = wp->modedata; > struct screen *s = data->backing, ss; > struct screen_write_ctx ctx; > - struct grid *gd = s->grid, *sgd; > - struct grid_cell gc; > + struct grid *gd = s->grid; > + struct grid_cell gc; > size_t searchlen; > - u_int i, first, fx, fy, px; > - int utf8flag, n, wrapped, wrapflag, cis; > - const char *ptr; > + u_int fx, fy; > + int utf8flag, wrapflag, cis; > + > + fx = data->cx; > + fy = screen_hsize(data->backing) - data->oy + data->cy; > > - if (*searchstr == '\0') > - return; > utf8flag = options_get_number(&wp->window->options, "utf8"); > wrapflag = options_get_number(&wp->window->options, "wrap-search"); > + > searchlen = screen_write_strlen(utf8flag, "%s", searchstr); > > screen_init(&ss, searchlen, 1, 0); > @@ -1080,47 +1100,33 @@ window_copy_search_down(struct window_pa > screen_write_nputs(&ctx, -1, &gc, utf8flag, "%s", searchstr); > screen_write_stop(&ctx); > > - fx = data->cx; > - fy = gd->hsize - data->oy + data->cy; > - > - if (fx == gd->sx - 1) { > - if (fy == gd->hsize + gd->sy) > - return; > - fx = 0; > - fy++; > - } else > - fx++; > - n = wrapped = 0; > - > - cis = 1; > - for (ptr = searchstr; *ptr != '\0'; ptr++) { > - if (*ptr != tolower((u_char)*ptr)) { > - cis = 0; > - break; > - } > + if (moveflag) { > + if (direction) > + window_copy_move_right(s, &fx, &fy); > + else > + window_copy_move_left(s, &fx, &fy); > } > + window_copy_clear_selection(wp); > > -retry: > - sgd = ss.grid; > - for (i = fy + 1; i < gd->hsize + gd->sy + 1; i++) { > - first = 0; > - if (i == fy + 1) > - first = fx; > - n = window_copy_search_lr(gd, sgd, &px, i - 1, first, gd->sx, > - cis); > - if (n) { > - window_copy_scroll_to(wp, px, i - 1); > - break; > - } > - } > - if (wrapflag && !n && !wrapped) { > - fx = 0; > - fy = 0; > - wrapped = 1; > - goto retry; > - } > + cis = window_copy_is_lowercase(searchstr); > + window_copy_search_jump(wp, gd, ss.grid, fx, fy, > + direction ? gd->hsize + gd->sy - 1 : 0, cis, wrapflag, direction); > > screen_free(&ss); > +} > + > +void > +window_copy_search_up(struct window_pane *wp, const char *searchstr, > + int moveflag) > +{ > + window_copy_search(wp, searchstr, 0, moveflag); > +} > + > +void > +window_copy_search_down(struct window_pane *wp, const char *searchstr, > + int moveflag) > +{ > + window_copy_search(wp, searchstr, 1, moveflag); > } > > void > > > > > On Mon, Mar 09, 2015 at 12:47:55AM +0000, ??ukasz Pi??tkowski wrote: > > I finally got some time to sit down and test my changes again. It appears > > that no one was touching the part of code that I have been working on, so > > I am sending almost the same changes as last time. But this time I am > > attaching them to the email instead of sending in the message. > > Cheers > > Lukas > > 2014-11-01 0:35 GMT+00:00 **ukasz Pi**tkowski > > <[1]lukaspiatkow...@gmail.com>: > > > > Hi Felix, > > > > I didn't have time to work on this, last few months were really busy. I > > will try to rebase my changes on top of current revision and test them > > before sending the code again. I hope I will find some time before the > > end of year. > > > > Cheers > > Lukas > > > > On 1 Nov 2014 00:42, "Felix Rosencrantz" <[2]f.rosencra...@gmail.com> > > wrote: > > > > Was there any follow up to this thread?** Incremental search would be > > a great feature to have and is on the TODO list. > > Thanks. > > -FR > > On Fri, Aug 8, 2014 at 11:21 AM, Nicholas Marriott > > <[3]nicholas.marri...@gmail.com> wrote: > > > > Hi > > > > Your mailer has mangled the diffs, if you can't fix it so it works > > inline please send them as attachments instead. > > On Mon, Aug 04, 2014 at 07:47:28PM -0700, ??ukasz Pi??tkowski > > wrote: > > >** ** I have split up my changes into 3 diffs, first is > > refactoring > > search code > > >** ** in window-copy.c, second is adding incremental search and > > the > > last one is > > >** ** adding search highlighting. > > >** ** Cheers > > >** ** Lukas > > >** ** -- > > >** ** > > > > I**am**providing**code**in**this**repository**to**you**under**an**open**source**license.**Because**this**is**my**personal > > >** ** > > > > repository,**the**license**you**receive**to**my**code**is**from**me**and**not**from**my**employer**(Facebook). > > > > All contributions must be under the ISC license that is at the top > > of > > each file you modify. > > > > Thanks > > >** ** -- > > >** ** Refactor window-copy search functions > > >** ** ============================ > > >** ** diff --git window-copy.c window-copy.c > > >** ** index 0775bcb..1213380 100644 > > >** ** --- window-copy.c > > >** ** +++ window-copy.c > > >** ** @@ -47,8 +47,16 @@ int** window_copy_search_lr( > > >** ** **** ** ** **** **struct grid *, struct grid *, u_int *, > > u_int, u_int, u_int, > > >** ** int); > > >** ** **int** **window_copy_search_rl( > > >** ** **** ** ** **** **struct grid *, struct grid *, u_int *, > > u_int, u_int, u_int, > > >** ** int); > > >** ** -void** **window_copy_search_up(struct window_pane *, const > > char *); > > >** ** -void** **window_copy_search_down(struct window_pane *, > > const > > char *); > > >** ** +void** **window_copy_move_coordinates( > > >** ** +** ** ** ** ** **struct screen *, u_int *, u_int *, const > > int); > > >** ** +int** ** window_copy_is_lowercase(const char *); > > >** ** +void** **window_copy_jump_to_searched_string( > > >** ** +** ** ** ** ** **struct window_pane *, struct grid *, > > struct > > grid *, u_int, > > >** ** u_int, > > >** ** +** ** ** ** ** **u_int, int, int, const int); > > >** ** +void** **window_copy_search(struct window_pane *, const > > char > > *, > > >** ** +** ** ** ** ** **const int, const int); > > >** ** +void** **window_copy_search_up(struct window_pane *, const > > char *, const > > >** ** int); > > >** ** +void** **window_copy_search_down(struct window_pane *, > > const > > char *, const > > >** ** int); > > >** ** **void** window_copy_goto_line(struct window_pane *, const > > char *); > > >** ** **void** window_copy_update_cursor(struct window_pane *, > > u_int, u_int); > > >** ** **void** window_copy_start_selection(struct window_pane *); > > >** ** @@ -685,12 +693,12 @@ window_copy_key(struct window_pane > > *wp, > > struct > > >** ** session *sess, int key) > > >** ** **** ** ** ** ** ** ** ** ** ** ** if (cmd == > > MODEKEYCOPY_SEARCHAGAIN) { > > >** ** **** ** ** ** ** ** ** ** ** ** ** ** ** ** ** for (; np != > > 0; np--) { > > >** ** **** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > window_copy_search_up( > > >** ** -** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > ** **wp, data->searchstr); > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > ** ** ** **wp, data->searchstr, 1); > > >** ** **** ** ** ** ** ** ** ** ** ** ** ** ** ** ** } > > >** ** **** ** ** ** ** ** ** ** ** ** ** } else { > > >** ** **** ** ** ** ** ** ** ** ** ** ** ** ** ** ** for (; np != > > 0; np--) { > > >** ** **** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > window_copy_search_down( > > >** ** -** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > ** **wp, data->searchstr); > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > ** ** ** **wp, data->searchstr, 1); > > >** ** **** ** ** ** ** ** ** ** ** ** ** ** ** ** ** } > > >** ** **** ** ** ** ** ** ** ** ** ** ** } > > >** ** **** ** ** ** ** ** ** ** ** ** ** break; > > >** ** @@ -698,12 +706,12 @@ window_copy_key(struct window_pane > > *wp, > > struct > > >** ** session *sess, int key) > > >** ** **** ** ** ** ** ** ** ** ** ** ** if (cmd == > > MODEKEYCOPY_SEARCHAGAIN) { > > >** ** **** ** ** ** ** ** ** ** ** ** ** ** ** ** ** for (; np != > > 0; np--) { > > >** ** **** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > window_copy_search_down( > > >** ** -** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > ** **wp, data->searchstr); > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > ** ** ** **wp, data->searchstr, 1); > > >** ** **** ** ** ** ** ** ** ** ** ** ** ** ** ** ** } > > >** ** **** ** ** ** ** ** ** ** ** ** ** } else { > > >** ** **** ** ** ** ** ** ** ** ** ** ** ** ** ** ** for (; np != > > 0; np--) { > > >** ** **** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > window_copy_search_up( > > >** ** -** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > ** **wp, data->searchstr); > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > ** ** ** **wp, data->searchstr, 1); > > >** ** **** ** ** ** ** ** ** ** ** ** ** ** ** ** ** } > > >** ** **** ** ** ** ** ** ** ** ** ** ** } > > >** ** **** ** ** ** ** ** ** ** ** ** ** break; > > >** ** @@ -811,16 +819,16 @@ window_copy_key_input(struct > > window_pane *wp, int > > >** ** key) > > >** ** **** ** ** ** ** ** ** case WINDOW_COPY_NUMERICPREFIX: > > >** ** **** ** ** ** ** ** ** ** ** ** ** break; > > >** ** **** ** ** ** ** ** ** case WINDOW_COPY_SEARCHUP: > > >** ** -** ** ** ** ** ** ** ** ** ** ** **for (; np != 0; np--) > > >** ** -** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > **window_copy_search_up(wp, data->inputstr); > > >** ** **** ** ** ** ** ** ** ** ** ** ** data->searchtype = > > data->inputtype; > > >** ** **** ** ** ** ** ** ** ** ** ** ** data->searchstr = > > xstrdup(data->inputstr); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **for (; np != 0; np--) > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > **window_copy_search_up(wp, data->inputstr, > > >** ** 0); > > >** ** **** ** ** ** ** ** ** ** ** ** ** break; > > >** ** **** ** ** ** ** ** ** case WINDOW_COPY_SEARCHDOWN: > > >** ** -** ** ** ** ** ** ** ** ** ** ** **for (; np != 0; np--) > > >** ** -** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > **window_copy_search_down(wp, > > >** ** data->inputstr); > > >** ** **** ** ** ** ** ** ** ** ** ** ** data->searchtype = > > data->inputtype; > > >** ** **** ** ** ** ** ** ** ** ** ** ** data->searchstr = > > xstrdup(data->inputstr); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **for (; np != 0; np--) > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > **window_copy_search_down(wp, > > >** ** data->inputstr, 0); > > >** ** **** ** ** ** ** ** ** ** ** ** ** break; > > >** ** **** ** ** ** ** ** ** case WINDOW_COPY_NAMEDBUFFER: > > >** ** **** ** ** ** ** ** ** ** ** ** ** > > window_copy_copy_selection(wp, data->inputstr); > > >** ** @@ -1033,88 +1041,97 @@ window_copy_search_rl(struct grid > > *gd, > > >** ** **** ** ** return (0); > > >** ** **} > > >** ** +/* For direction == 0 move left, otherwise right; jump line > > if needed */ > > >** ** **void > > >** ** -window_copy_search_up(struct window_pane *wp, const char > > *searchstr) > > >** ** +window_copy_move_coordinates(struct screen *s, > > >** ** +** ** ** **u_int *fx, u_int *fy, const int direction) > > >** ** **{ > > >** ** -** ** ** **struct window_copy_mode_data** ** *data = > > wp->modedata; > > >** ** -** ** ** **struct screen** ** ** ** ** ** ** ** ** ***s = > > data->backing, ss; > > >** ** -** ** ** **struct screen_write_ctx** ** ** ** ** ** ** ** > > ** > > ctx; > > >** ** -** ** ** **struct grid** ** ** ** ** ** ** ** ** ** ***gd = > > s->grid, *sgd; > > >** ** -** ** ** **struct grid_cell** ** ** ** ** ** ** ** **gc; > > >** ** -** ** ** **size_t** ** ** ** ** ** ** ** ** ** ** ** ** > > **searchlen; > > >** ** -** ** ** **u_int** ** ** ** ** ** ** ** ** ** ** ** ** ** > > i, > > last, fx, fy, px; > > >** ** -** ** ** **int** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > utf8flag, n, wrapped, wrapflag, > > >** ** cis; > > >** ** -** ** ** **const char** ** ** ** ** ** ** ** ** ** ** *ptr; > > >** ** - > > >** ** -** ** ** **if (*searchstr == '\0') > > >** ** -** ** ** ** ** ** ** **return; > > >** ** -** ** ** **utf8flag = > > options_get_number(&wp->window->options, "utf8"); > > >** ** -** ** ** **wrapflag = > > options_get_number(&wp->window->options, > > >** ** "wrap-search"); > > >** ** -** ** ** **searchlen = screen_write_strlen(utf8flag, "%s", > > searchstr); > > >** ** - > > >** ** -** ** ** **screen_init(&ss, searchlen, 1, 0); > > >** ** -** ** ** **screen_write_start(&ctx, NULL, &ss); > > >** ** -** ** ** **memcpy(&gc, &grid_default_cell, sizeof gc); > > >** ** -** ** ** **screen_write_nputs(&ctx, -1, &gc, utf8flag, > > "%s", > > searchstr); > > >** ** -** ** ** **screen_write_stop(&ctx); > > >** ** - > > >** ** -** ** ** **fx = data->cx; > > >** ** -** ** ** **fy = gd->hsize - data->oy + data->cy; > > >** ** - > > >** ** -** ** ** **if (fx == 0) { > > >** ** -** ** ** ** ** ** ** **if (fy == 0) > > >** ** +** ** ** **/* If on left/right border */ > > >** ** +** ** ** **if (*fx == (direction ? screen_size_x(s) - 1 : > > 0)) { > > >** ** +** ** ** ** ** ** ** **/* If on top/bottom border */ > > >** ** +** ** ** ** ** ** ** **if (*fy == (direction ? > > screen_hsize(s) + screen_size_y(s) > > >** ** : 0)) > > >** ** +** ** ** ** ** ** ** ** ** ** ** **/* Nowhere to go */ > > >** ** **** ** ** ** ** ** ** ** ** ** ** return; > > >** ** -** ** ** ** ** ** ** **fx = gd->sx - 1; > > >** ** -** ** ** ** ** ** ** **fy--; > > >** ** -** ** ** **} else > > >** ** -** ** ** ** ** ** ** **fx--; > > >** ** -** ** ** **n = wrapped = 0; > > >** ** +** ** ** ** ** ** ** **/* Jump to beggin/end of lower/upper > > line */ > > >** ** +** ** ** ** ** ** ** ***fx = direction ? 0 : > > screen_size_x(s) - 1; > > >** ** +** ** ** ** ** ** ** ***fy = direction ? *fy + 1 : *fy - 1; > > >** ** +** ** ** **} else { > > >** ** +** ** ** ** ** ** ** ***fx = direction ? *fx + 1 : *fx - 1; > > >** ** +** ** ** **} > > >** ** +} > > >** ** -** ** ** **cis = 1; > > >** ** -** ** ** **for (ptr = searchstr; *ptr != '\0'; ptr++) { > > >** ** +int > > >** ** +window_copy_is_lowercase(const char *ptr) > > >** ** +{ > > >** ** +** ** ** **while (*ptr != '\0') { > > >** ** **** ** ** ** ** ** ** if (*ptr != tolower((u_char)*ptr)) { > > >** ** -** ** ** ** ** ** ** ** ** ** ** **cis = 0; > > >** ** -** ** ** ** ** ** ** ** ** ** ** **break; > > >** ** +** ** ** ** ** ** ** ** ** ** ** **return 0; > > >** ** **** ** ** ** ** ** ** } > > >** ** +** ** ** ** ** ** ** **++ptr; > > >** ** **** ** ** } > > >** ** +** ** ** **return 1; > > >** ** +} > > >** ** -retry: > > >** ** -** ** ** **sgd = ss.grid; > > >** ** -** ** ** **for (i = fy + 1; i > 0; i--) { > > >** ** -** ** ** ** ** ** ** **last = screen_size_x(s); > > >** ** -** ** ** ** ** ** ** **if (i == fy + 1) > > >** ** -** ** ** ** ** ** ** ** ** ** ** **last = fx; > > >** ** -** ** ** ** ** ** ** **n = window_copy_search_rl(gd, sgd, > > &px, i - 1, 0, last, > > >** ** cis); > > >** ** -** ** ** ** ** ** ** **if (n) { > > >** ** -** ** ** ** ** ** ** ** ** ** ** > > **window_copy_scroll_to(wp, > > px, i - 1); > > >** ** -** ** ** ** ** ** ** ** ** ** ** **break; > > >** ** +/* Search in grid `gd` for text stored in grid `sgd` > > starting from > > >** ** position > > >** ** + * (`fx`, `fy`) up to line `endline` and if found then jump > > to it. > > >** ** + * If `cis` do it case-insensitive. > > >** ** + * `direction` 0 for searching up, down otherwise > > >** ** + * If `wrap` then go to begin/end of grid and try again up > > to line `fy` > > >** ** */ > > >** ** +void > > >** ** +window_copy_jump_to_searched_string(struct window_pane *wp, > > >** ** + ** **struct grid *gd, struct grid *sgd, u_int fx, u_int > > fy, > > >** ** + ** **u_int endline, int cis, int wrap, const int > > direction) > > >** ** +{ > > >** ** +** ** ** **u_int** ** ** ** ** ** ** ** ** ** ** ** ** ** > > i, > > px; > > >** ** +** ** ** **int** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > firstIteration, found; > > >** ** + > > >** ** +** ** ** **firstIteration = 1; > > >** ** +** ** ** **if (direction) { > > >** ** +** ** ** ** ** ** ** **for (i = fy; i <= endline; ++i) { > > >** ** +** ** ** ** ** ** ** ** ** ** ** **found = > > window_copy_search_lr(gd, sgd, &px, i, > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > **firstIteration ? fx : 0, gd->sx, cis); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **if (found) break; > > >** ** +** ** ** ** ** ** ** ** ** ** ** **firstIteration = 0; > > >** ** +** ** ** ** ** ** ** **} > > >** ** +** ** ** **} else { > > >** ** +** ** ** ** ** ** ** **for (i = fy + 1; endline < i; --i) { > > >** ** +** ** ** ** ** ** ** ** ** ** ** **found = > > window_copy_search_rl(gd, sgd, &px, i - 1, > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **0, > > firstIteration ? fx : gd->sx, cis); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **if (found) { > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **--i; > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **break; > > >** ** +** ** ** ** ** ** ** ** ** ** ** **} > > >** ** +** ** ** ** ** ** ** ** ** ** ** **firstIteration = 0; > > >** ** **** ** ** ** ** ** ** } > > >** ** **** ** ** } > > >** ** -** ** ** **if (wrapflag && !n && !wrapped) { > > >** ** -** ** ** ** ** ** ** **fx = gd->sx - 1; > > >** ** -** ** ** ** ** ** ** **fy = gd->hsize + gd->sy - 1; > > >** ** -** ** ** ** ** ** ** **wrapped = 1; > > >** ** -** ** ** ** ** ** ** **goto retry; > > >** ** +** ** ** **if (found) { > > >** ** +** ** ** ** ** ** ** **window_copy_scroll_to(wp, px, i); > > >** ** +** ** ** **} else if (wrap) { > > >** ** +** ** ** ** ** ** ** **/* Start searching from begin/end of > > grid up to `fy` line > > >** ** */ > > >** ** +** ** ** ** ** ** ** > > **window_copy_jump_to_searched_string(wp, gd, sgd, > > >** ** +** ** ** ** ** ** ** ** ** ** ** **direction ? 0 : gd->sx - > > 1, > > >** ** +** ** ** ** ** ** ** ** ** ** ** **direction ? 0 : > > gd->hsize > > + gd->sy - 1, > > >** ** +** ** ** ** ** ** ** ** ** ** ** **fy, cis, 0, direction); > > >** ** **** ** ** } > > >** ** - > > >** ** -** ** ** **screen_free(&ss); > > >** ** **} > > >** ** **void > > >** ** -window_copy_search_down(struct window_pane *wp, const char > > *searchstr) > > >** ** +window_copy_search(struct window_pane *wp, > > >** ** + ** **const char *searchstr, const int direction, const int > > move) > > >** ** **{ > > >** ** **** ** ** struct window_copy_mode_data** ** *data = > > wp->modedata; > > >** ** **** ** ** struct screen** ** ** ** ** ** ** ** ** ***s = > > data->backing, ss; > > >** ** **** ** ** struct screen_write_ctx** ** ** ** ** ** ** ** ** > > ctx; > > >** ** -** ** ** **struct grid** ** ** ** ** ** ** ** ** ** ***gd = > > s->grid, *sgd; > > >** ** -** ** ** **struct grid_cell** ** ** ** ** ** ** ** **gc; > > >** ** +** ** ** **struct grid** ** ** ** ** ** ** ** ** ** ***gd = > > s->grid; > > >** ** +** ** ** **struct grid_cell** ** ** ** ** ** ** ** **gc; > > >** ** **** ** ** size_t** ** ** ** ** ** ** ** ** ** ** ** ** > > **searchlen; > > >** ** -** ** ** **u_int** ** ** ** ** ** ** ** ** ** ** ** ** ** > > i, > > first, fx, fy, px; > > >** ** -** ** ** **int** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > utf8flag, n, wrapped, wrapflag, > > >** ** cis; > > >** ** -** ** ** **const char** ** ** ** ** ** ** ** ** ** ** *ptr; > > >** ** +** ** ** **u_int** ** ** ** ** ** ** ** ** ** ** ** ** ** > > fx, fy; > > >** ** +** ** ** **int** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > utf8flag, wrapflag, cis; > > >** ** + > > >** ** +** ** ** **/* current cursor coordinates */ > > >** ** +** ** ** **fx = data->cx; > > >** ** +** ** ** **fy = screen_hsize(data->backing) - data->oy + > > data->cy; > > >** ** -** ** ** **if (*searchstr == '\0') > > >** ** -** ** ** ** ** ** ** **return; > > >** ** **** ** ** utf8flag = > > options_get_number(&wp->window->options, "utf8"); > > >** ** **** ** ** wrapflag = > > options_get_number(&wp->window->options, > > >** ** "wrap-search"); > > >** ** **** ** ** searchlen = screen_write_strlen(utf8flag, "%s", > > searchstr); > > >** ** @@ -1125,50 +1142,35 @@ window_copy_search_down(struct > > window_pane *wp, > > >** ** const char *searchstr) > > >** ** **** ** ** screen_write_nputs(&ctx, -1, &gc, utf8flag, "%s", > > searchstr); > > >** ** **** ** ** screen_write_stop(&ctx); > > >** ** -** ** ** **fx = data->cx; > > >** ** -** ** ** **fy = gd->hsize - data->oy + data->cy; > > >** ** - > > >** ** -** ** ** **if (fx == gd->sx - 1) { > > >** ** -** ** ** ** ** ** ** **if (fy == gd->hsize + gd->sy) > > >** ** -** ** ** ** ** ** ** ** ** ** ** **return; > > >** ** -** ** ** ** ** ** ** **fx = 0; > > >** ** -** ** ** ** ** ** ** **fy++; > > >** ** -** ** ** **} else > > >** ** -** ** ** ** ** ** ** **fx++; > > >** ** -** ** ** **n = wrapped = 0; > > >** ** - > > >** ** -** ** ** **cis = 1; > > >** ** -** ** ** **for (ptr = searchstr; *ptr != '\0'; ptr++) { > > >** ** -** ** ** ** ** ** ** **if (*ptr != tolower((u_char)*ptr)) { > > >** ** -** ** ** ** ** ** ** ** ** ** ** **cis = 0; > > >** ** -** ** ** ** ** ** ** ** ** ** ** **break; > > >** ** -** ** ** ** ** ** ** **} > > >** ** +** ** ** **if (move) { > > >** ** +** ** ** ** ** ** ** **window_copy_move_coordinates(s, &fx, > > &fy, direction); > > >** ** **** ** ** } > > >** ** -retry: > > >** ** -** ** ** **sgd = ss.grid; > > >** ** -** ** ** **for (i = fy + 1; i < gd->hsize + gd->sy + 1; > > i++) > > { > > >** ** -** ** ** ** ** ** ** **first = 0; > > >** ** -** ** ** ** ** ** ** **if (i == fy + 1) > > >** ** -** ** ** ** ** ** ** ** ** ** ** **first = fx; > > >** ** -** ** ** ** ** ** ** **n = window_copy_search_lr(gd, sgd, > > &px, i - 1, first, > > >** ** gd->sx, > > >** ** -** ** ** ** ** ** ** ** ** **cis); > > >** ** -** ** ** ** ** ** ** **if (n) { > > >** ** -** ** ** ** ** ** ** ** ** ** ** > > **window_copy_scroll_to(wp, > > px, i - 1); > > >** ** -** ** ** ** ** ** ** ** ** ** ** **break; > > >** ** -** ** ** ** ** ** ** **} > > >** ** -** ** ** **} > > >** ** -** ** ** **if (wrapflag && !n && !wrapped) { > > >** ** -** ** ** ** ** ** ** **fx = 0; > > >** ** -** ** ** ** ** ** ** **fy = 0; > > >** ** -** ** ** ** ** ** ** **wrapped = 1; > > >** ** -** ** ** ** ** ** ** **goto retry; > > >** ** -** ** ** **} > > >** ** +** ** ** **cis = window_copy_is_lowercase(searchstr); > > >** ** +** ** ** **window_copy_clear_selection(wp); > > >** ** + > > >** ** +** ** ** **window_copy_jump_to_searched_string(wp, gd, > > ss.grid, fx, fy, > > >** ** +** ** ** ** ** ** ** **direction ? gd->hsize + gd->sy - 1 : > > 0, > > >** ** +** ** ** ** ** ** ** **cis, wrapflag, direction); > > >** ** **** ** ** screen_free(&ss); > > >** ** **} > > >** ** **void > > >** ** +window_copy_search_up(struct window_pane *wp, const char > > *searchstr, > > >** ** +** ** ** **const int move) > > >** ** +{ > > >** ** +** ** ** **window_copy_search(wp, searchstr, 0, move); > > >** ** +} > > >** ** + > > >** ** +void > > >** ** +window_copy_search_down(struct window_pane *wp, const char > > *searchstr, > > >** ** +** ** ** **const int move) > > >** ** +{ > > >** ** +** ** ** **window_copy_search(wp, searchstr, 1, move); > > >** ** +} > > >** ** + > > >** ** +void > > >** ** **window_copy_goto_line(struct window_pane *wp, const char > > *linestr) > > >** ** **{ > > >** ** **** ** ** struct window_copy_mode_data** ** *data = > > wp->modedata; > > >** ** Incremental search in window-copy mode > > >** ** ============================== > > >** ** diff --git window-copy.c window-copy.c > > >** ** index 1213380..243c755 100644 > > >** ** --- window-copy.c > > >** ** +++ window-copy.c > > >** ** @@ -53,6 +53,9 @@ int** **window_copy_is_lowercase(const > > char > > *); > > >** ** **void** window_copy_jump_to_searched_string( > > >** ** **** ** ** **** **struct window_pane *, struct grid *, > > struct > > grid *, u_int, > > >** ** u_int, > > >** ** **** ** ** **** **u_int, int, int, const int); > > >** ** +int** ** window_copy_coord_from_hist(struct window_pane > > *wp, > > >** ** +** ** ** ** ** **const size_t searchlen, u_int *fx, u_int > > *fy); > > >** ** +void** **window_copy_clear_search_hist(struct window_pane > > *, > > u_int *, u_int > > >** ** *); > > >** ** **void** window_copy_search(struct window_pane *, const char > > *, > > >** ** **** ** ** **** **const int, const int); > > >** ** **void** window_copy_search_up(struct window_pane *, const > > char *, const > > >** ** int); > > >** ** @@ -115,6 +118,22 @@ enum window_copy_input_type { > > >** ** **}; > > >** ** **/* > > >** ** + * x, y - coordinates from which the search was made > > >** ** + * found - if the text was found > > >** ** + * searchlen - lenght of text that was searched > > >** ** + * prev - data of previous searches > > >** ** + */ > > >** ** +struct window_copy_search_hist { > > >** ** +** ** ** **u_int** ** ** ** ** **x; > > >** ** +** ** ** **u_int** ** ** ** ** **y; > > >** ** +** ** ** **int** ** ** ** ** ** **found; > > >** ** + > > >** ** +** ** ** **size_t** ** ** ** ** searchlen; > > >** ** + > > >** ** +** ** ** **struct window_copy_search_hist ***prev; > > >** ** +}; > > >** ** + > > >** ** +/* > > >** ** ** * Copy-mode's visible screen (the "screen" field) is > > filled from one of > > >** ** ** * two sources: the original contents of the pane (used > > when we > > >** ** ** * actually enter via the "copy-mode" command, to copy the > > contents of > > >** ** @@ -159,6 +178,7 @@ struct window_copy_mode_data { > > >** ** **** ** ** enum window_copy_input_type searchtype; > > >** ** **** ** ** char** ** **** ** ** *searchstr; > > >** ** +** ** ** **struct window_copy_search_hist** *searchhist; > > >** ** **** ** ** enum window_copy_input_type jumptype; > > >** ** **** ** ** char** ** ** ** ** ** jumpchar; > > >** ** @@ -190,6 +210,7 @@ window_copy_init(struct window_pane *wp) > > >** ** **** ** ** data->searchtype = WINDOW_COPY_OFF; > > >** ** **** ** ** data->searchstr = NULL; > > >** ** +** ** ** **data->searchhist = NULL; > > >** ** **** ** ** if (wp->fd != -1) > > >** ** **** ** ** ** ** ** ** bufferevent_disable(wp->event, > > EV_READ|EV_WRITE); > > >** ** @@ -259,6 +280,7 @@ window_copy_free(struct window_pane *wp) > > >** ** **** ** ** free(data->searchstr); > > >** ** **** ** ** free(data->inputstr); > > >** ** +** ** ** **window_copy_clear_search_hist(wp, NULL, NULL); > > >** ** **** ** ** if (data->backing != &wp->base) { > > >** ** **** ** ** ** ** ** ** screen_free(data->backing); > > >** ** @@ -672,10 +694,12 @@ window_copy_key(struct window_pane > > *wp, > > struct > > >** ** session *sess, int key) > > >** ** **** ** ** case MODEKEYCOPY_SEARCHUP: > > >** ** **** ** ** ** ** ** ** data->inputtype = > > WINDOW_COPY_SEARCHUP; > > >** ** **** ** ** ** ** ** ** data->inputprompt = "Search Up"; > > >** ** +** ** ** ** ** ** ** ***data->inputstr = '\0'; > > >** ** **** ** ** ** ** ** ** goto input_on; > > >** ** **** ** ** case MODEKEYCOPY_SEARCHDOWN: > > >** ** **** ** ** ** ** ** ** data->inputtype = > > WINDOW_COPY_SEARCHDOWN; > > >** ** **** ** ** ** ** ** ** data->inputprompt = "Search Down"; > > >** ** +** ** ** ** ** ** ** ***data->inputstr = '\0'; > > >** ** **** ** ** ** ** ** ** goto input_on; > > >** ** **** ** ** case MODEKEYCOPY_SEARCHAGAIN: > > >** ** **** ** ** case MODEKEYCOPY_SEARCHREVERSE: > > >** ** @@ -778,6 +802,7 @@ window_copy_key_input(struct window_pane > > *wp, int key) > > >** ** **** ** ** int** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > np; > > >** ** **** ** ** struct paste_buffer** ** ** ** ** ** ***pb; > > >** ** **** ** ** u_char** ** ** ** ** ** ** ** ** ** ** ** ** > > **ch; > > >** ** +** ** ** **u_int** ** ** ** ** ** ** ** ** ** ** ** ** ** > > fx, fy; > > >** ** **** ** ** switch (mode_key_lookup(&data->mdata, key, NULL)) > > { > > >** ** **** ** ** case MODEKEYEDIT_CANCEL: > > >** ** @@ -787,9 +812,29 @@ window_copy_key_input(struct > > window_pane > > *wp, int > > >** ** key) > > >** ** **** ** ** ** ** ** ** inputlen = strlen(data->inputstr); > > >** ** **** ** ** ** ** ** ** if (inputlen > 0) > > >** ** **** ** ** ** ** ** ** ** ** ** ** data->inputstr[inputlen - > > 1] = '\0'; > > >** ** +** ** ** ** ** ** ** **switch (data->inputtype) { > > >** ** +** ** ** ** ** ** ** **case WINDOW_COPY_SEARCHUP: > > >** ** +** ** ** ** ** ** ** ** ** ** ** **data->searchtype = > > data->inputtype; > > >** ** +** ** ** ** ** ** ** ** ** ** ** **free(data->searchstr); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **data->searchstr = > > xstrdup(data->inputstr); > > >** ** +** ** ** ** ** ** ** ** ** ** ** > > **window_copy_search_up(wp, > > data->inputstr, 0); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **break; > > >** ** +** ** ** ** ** ** ** **case WINDOW_COPY_SEARCHDOWN: > > >** ** +** ** ** ** ** ** ** ** ** ** ** **data->searchtype = > > data->inputtype; > > >** ** +** ** ** ** ** ** ** ** ** ** ** **free(data->searchstr); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **data->searchstr = > > xstrdup(data->inputstr); > > >** ** +** ** ** ** ** ** ** ** ** ** ** > > **window_copy_search_down(wp, data->inputstr, 0); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **break; > > >** ** +** ** ** ** ** ** ** **default: > > >** ** +** ** ** ** ** ** ** ** ** ** ** **break; > > >** ** +** ** ** ** ** ** ** **} > > >** ** **** ** ** ** ** ** ** break; > > >** ** **** ** ** case MODEKEYEDIT_DELETELINE: > > >** ** **** ** ** ** ** ** ** *data->inputstr = '\0'; > > >** ** +** ** ** ** ** ** ** **fx = data->cx; > > >** ** +** ** ** ** ** ** ** **fy = screen_hsize(data->backing) - > > data->oy + data->cy; > > >** ** +** ** ** ** ** ** ** **window_copy_clear_search_hist(wp, > > &fx, &fy); > > >** ** +** ** ** ** ** ** ** **window_copy_scroll_to(wp, fx, fy); > > >** ** **** ** ** ** ** ** ** break; > > >** ** **** ** ** case MODEKEYEDIT_PASTE: > > >** ** **** ** ** ** ** ** ** if ((pb = paste_get_top()) == NULL) > > >** ** @@ -820,15 +865,17 @@ window_copy_key_input(struct > > window_pane *wp, int > > >** ** key) > > >** ** **** ** ** ** ** ** ** ** ** ** ** break; > > >** ** **** ** ** ** ** ** ** case WINDOW_COPY_SEARCHUP: > > >** ** **** ** ** ** ** ** ** ** ** ** ** data->searchtype = > > data->inputtype; > > >** ** +** ** ** ** ** ** ** ** ** ** ** **free(data->searchstr); > > >** ** **** ** ** ** ** ** ** ** ** ** ** data->searchstr = > > xstrdup(data->inputstr); > > >** ** -** ** ** ** ** ** ** ** ** ** ** **for (; np != 0; np--) > > >** ** -** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > **window_copy_search_up(wp, data->inputstr, > > >** ** 0); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **for (; np > 1; np--) > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > **window_copy_search_up(wp, data->inputstr, > > >** ** 1); > > >** ** **** ** ** ** ** ** ** ** ** ** ** break; > > >** ** **** ** ** ** ** ** ** case WINDOW_COPY_SEARCHDOWN: > > >** ** **** ** ** ** ** ** ** ** ** ** ** data->searchtype = > > data->inputtype; > > >** ** +** ** ** ** ** ** ** ** ** ** ** **free(data->searchstr); > > >** ** **** ** ** ** ** ** ** ** ** ** ** data->searchstr = > > xstrdup(data->inputstr); > > >** ** -** ** ** ** ** ** ** ** ** ** ** **for (; np != 0; np--) > > >** ** -** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > **window_copy_search_down(wp, > > >** ** data->inputstr, 0); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **for (; np > 1; np--) > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > **window_copy_search_down(wp, > > >** ** data->inputstr, 1); > > >** ** **** ** ** ** ** ** ** ** ** ** ** break; > > >** ** **** ** ** ** ** ** ** case WINDOW_COPY_NAMEDBUFFER: > > >** ** **** ** ** ** ** ** ** ** ** ** ** > > window_copy_copy_selection(wp, data->inputstr); > > >** ** @@ -850,6 +897,22 @@ window_copy_key_input(struct > > window_pane > > *wp, int > > >** ** key) > > >** ** **** ** ** ** ** ** ** data->inputstr = > > xrealloc(data->inputstr, 1, inputlen); > > >** ** **** ** ** ** ** ** ** data->inputstr[inputlen - 2] = key; > > >** ** **** ** ** ** ** ** ** data->inputstr[inputlen - 1] = '\0'; > > >** ** +** ** ** ** ** ** ** **switch (data->inputtype) { > > >** ** +** ** ** ** ** ** ** **case WINDOW_COPY_SEARCHUP: > > >** ** +** ** ** ** ** ** ** ** ** ** ** **data->searchtype = > > data->inputtype; > > >** ** +** ** ** ** ** ** ** ** ** ** ** **free(data->searchstr); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **data->searchstr = > > xstrdup(data->inputstr); > > >** ** +** ** ** ** ** ** ** ** ** ** ** > > **window_copy_search_up(wp, > > data->inputstr, 0); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **break; > > >** ** +** ** ** ** ** ** ** **case WINDOW_COPY_SEARCHDOWN: > > >** ** +** ** ** ** ** ** ** ** ** ** ** **data->searchtype = > > data->inputtype; > > >** ** +** ** ** ** ** ** ** ** ** ** ** **free(data->searchstr); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **data->searchstr = > > xstrdup(data->inputstr); > > >** ** +** ** ** ** ** ** ** ** ** ** ** > > **window_copy_search_down(wp, data->inputstr, 0); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **break; > > >** ** +** ** ** ** ** ** ** **default: > > >** ** +** ** ** ** ** ** ** ** ** ** ** **break; > > >** ** +** ** ** ** ** ** ** **} > > >** ** **** ** ** ** ** ** ** break; > > >** ** **** ** ** default: > > >** ** **** ** ** ** ** ** ** break; > > >** ** @@ -1082,6 +1145,8 @@ > > window_copy_jump_to_searched_string(struct > > >** ** window_pane *wp, > > >** ** ** ** **struct grid *gd, struct grid *sgd, u_int fx, u_int > > fy, > > >** ** ** ** **u_int endline, int cis, int wrap, const int > > direction) > > >** ** **{ > > >** ** +** ** ** **struct window_copy_mode_data** ** *data = > > wp->modedata; > > >** ** +** ** ** **struct window_copy_search_hist** *searchhist = > > data->searchhist; > > >** ** **** ** ** u_int** ** ** ** ** ** ** ** ** ** ** ** ** ** i, > > px; > > >** ** **** ** ** int** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > firstIteration, found; > > >** ** @@ -1112,6 +1177,60 @@ > > window_copy_jump_to_searched_string(struct > > >** ** window_pane *wp, > > >** ** **** ** ** ** ** ** ** ** ** ** ** direction ? 0 : gd->sx - > > 1, > > >** ** **** ** ** ** ** ** ** ** ** ** ** direction ? 0 : gd->hsize > > + gd->sy - 1, > > >** ** **** ** ** ** ** ** ** ** ** ** ** fy, cis, 0, direction); > > >** ** +** ** ** **} else { > > >** ** +** ** ** ** ** ** ** **if (searchhist != NULL) { > > >** ** +** ** ** ** ** ** ** ** ** ** ** **searchhist->found = 0; > > >** ** +** ** ** ** ** ** ** **} > > >** ** +** ** ** **} > > >** ** +} > > >** ** + > > >** ** +/* If it returns 0 then, according to search history, last > > time we > > >** ** searched > > >** ** + * a shorter string we haven't found anything, so there is > > no point in > > >** ** + * incremental-searching a longer string (just an > > optimization) */ > > >** ** +int > > >** ** +window_copy_coord_from_hist(struct window_pane *wp, > > >** ** + ** **const size_t searchlen, u_int *fx, u_int *fy) > > >** ** +{ > > >** ** +** ** ** **struct window_copy_mode_data** ** *data = > > wp->modedata; > > >** ** +** ** ** **struct window_copy_search_hist** *searchhist = > > data->searchhist; > > >** ** + > > >** ** +** ** ** **if (searchhist == NULL || searchhist->searchlen > > < > > searchlen) { > > >** ** +** ** ** ** ** ** ** **searchhist = xmalloc(sizeof (struct > > >** ** window_copy_search_hist)); > > >** ** +** ** ** ** ** ** ** **searchhist->x = data->cx; > > >** ** +** ** ** ** ** ** ** **searchhist->y = > > >** ** +** ** ** ** ** ** ** ** ** ** ** > > **screen_hsize(data->backing) - data->oy + data->cy; > > >** ** +** ** ** ** ** ** ** **searchhist->searchlen = searchlen; > > >** ** +** ** ** ** ** ** ** **searchhist->found = data->searchhist > > == NULL ? > > >** ** +** ** ** ** ** ** ** ** ** ** ** **1 : > > data->searchhist->found; > > >** ** + > > >** ** +** ** ** ** ** ** ** **searchhist->prev = data->searchhist; > > >** ** +** ** ** ** ** ** ** **data->searchhist = searchhist; > > >** ** + > > >** ** +** ** ** ** ** ** ** ***fx = searchhist->x; > > >** ** +** ** ** ** ** ** ** ***fy = searchhist->y; > > >** ** +** ** ** **} else { > > >** ** +** ** ** ** ** ** ** ***fx = searchhist->x; > > >** ** +** ** ** ** ** ** ** ***fy = searchhist->y; > > >** ** +** ** ** ** ** ** ** **searchhist = data->searchhist->prev; > > >** ** +** ** ** ** ** ** ** **free(data->searchhist); > > >** ** +** ** ** ** ** ** ** **data->searchhist = searchhist; > > >** ** +** ** ** **} > > >** ** + > > >** ** +** ** ** **return searchhist == NULL ? 1 : > > searchhist->found; > > >** ** +} > > >** ** + > > >** ** +void > > >** ** +window_copy_clear_search_hist(struct window_pane *wp, u_int > > *fx, u_int > > >** ** *fy) > > >** ** +{ > > >** ** +** ** ** **struct window_copy_mode_data** ** *data = > > wp->modedata; > > >** ** +** ** ** **struct window_copy_search_hist** *searchhist = > > data->searchhist; > > >** ** + > > >** ** +** ** ** **while (searchhist != NULL) { > > >** ** +** ** ** ** ** ** ** **if (fx != NULL) *fx = searchhist->x; > > >** ** +** ** ** ** ** ** ** **if (fy != NULL) *fy = searchhist->y; > > >** ** +** ** ** ** ** ** ** **searchhist = searchhist->prev; > > >** ** +** ** ** ** ** ** ** **free(data->searchhist); > > >** ** +** ** ** ** ** ** ** **data->searchhist = searchhist; > > >** ** **** ** ** } > > >** ** **} > > >** ** @@ -1132,6 +1251,14 @@ window_copy_search(struct window_pane > > *wp, > > >** ** **** ** ** fx = data->cx; > > >** ** **** ** ** fy = screen_hsize(data->backing) - data->oy + > > data->cy; > > >** ** +** ** ** **/* User deleted all searched text, jump to the > > initial cursor > > >** ** +** ** ** ** * position and delete the searchhistory */ > > >** ** +** ** ** **if ((searchstr == NULL) || (*searchstr == '\0')) > > { > > >** ** +** ** ** ** ** ** ** **window_copy_clear_search_hist(wp, > > &fx, &fy); > > >** ** +** ** ** ** ** ** ** **window_copy_scroll_to(wp, fx, fy); > > >** ** +** ** ** ** ** ** ** **return; > > >** ** +** ** ** **} > > >** ** + > > >** ** **** ** ** utf8flag = > > options_get_number(&wp->window->options, "utf8"); > > >** ** **** ** ** wrapflag = > > options_get_number(&wp->window->options, > > >** ** "wrap-search"); > > >** ** **** ** ** searchlen = screen_write_strlen(utf8flag, "%s", > > searchstr); > > >** ** @@ -1142,8 +1269,19 @@ window_copy_search(struct window_pane > > *wp, > > >** ** **** ** ** screen_write_nputs(&ctx, -1, &gc, utf8flag, "%s", > > searchstr); > > >** ** **** ** ** screen_write_stop(&ctx); > > >** ** +** ** ** **/* > > >** ** +** ** ** ** * `move` is useful for incremental searching. > > When we do > > >** ** incremental, > > >** ** +** ** ** ** * **we don't want to jump to the next matching > > word if we already > > >** ** stand > > >** ** +** ** ** ** * **on one, so `move=0`. > > >** ** +** ** ** ** * **But when user wants the next result, then > > we > > use `move=1`, so > > >** ** +** ** ** ** * **we start searching from the place next to > > the current cursor > > >** ** +** ** ** ** * **position */ > > >** ** **** ** ** if (move) { > > >** ** **** ** ** ** ** ** ** window_copy_move_coordinates(s, &fx, > > &fy, direction); > > >** ** +** ** ** **} else { > > >** ** +** ** ** ** ** ** ** **if (!window_copy_coord_from_hist(wp, > > searchlen, &fx, &fy)) > > >** ** { > > >** ** +** ** ** ** ** ** ** ** ** ** ** **return; > > >** ** +** ** ** ** ** ** ** **} > > >** ** **** ** ** } > > >** ** **** ** ** cis = window_copy_is_lowercase(searchstr); > > >** ** Highlight last search in window-copy mode > > >** ** =============================== > > >** ** diff --git options-table.c options-table.c > > >** ** index 8d680b3..79ecae3 100644 > > >** ** --- options-table.c > > >** ** +++ options-table.c > > >** ** @@ -619,6 +619,11 @@ const struct options_table_entry > > >** ** window_options_table[] = { > > >** ** **** ** ** ****.default_str = "bg=yellow,fg=black" > > >** ** **** ** ** }, > > >** ** +** ** ** **{ .name = "highlight-style", > > >** ** +** ** ** ** **.type = OPTIONS_TABLE_STYLE, > > >** ** +** ** ** ** **.default_str = "bg=green,fg=black" > > >** ** +** ** ** **}, > > >** ** + > > >** ** **** ** ** { .name = "monitor-activity", > > >** ** **** ** ** ****.type = OPTIONS_TABLE_FLAG, > > >** ** **** ** ** ****.default_num = 0 > > >** ** @@ -802,6 +807,11 @@ const struct options_table_entry > > >** ** window_options_table[] = { > > >** ** **** ** ** ****.default_num = 1 > > >** ** **** ** ** }, > > >** ** +** ** ** **{ .name = "highlight-search", > > >** ** +** ** ** ** **.type = OPTIONS_TABLE_FLAG, > > >** ** +** ** ** ** **.default_num = 1 > > >** ** +** ** ** **}, > > >** ** + > > >** ** **** ** ** { .name = "xterm-keys", > > >** ** **** ** ** ****.type = OPTIONS_TABLE_FLAG, > > >** ** **** ** ** ****.default_num = 0 > > >** ** diff --git screen-write.c screen-write.c > > >** ** index 325fb9a..a36a1f2 100644 > > >** ** --- screen-write.c > > >** ** +++ screen-write.c > > >** ** @@ -902,7 +902,7 @@ screen_write_cell(struct > > screen_write_ctx > > *ctx, const > > >** ** struct grid_cell *gc) > > >** ** **** ** ** struct grid** ** ** ** ** ** ***gd = s->grid; > > >** ** **** ** ** struct tty_ctx** ** ** ** ** **ttyctx; > > >** ** **** ** ** u_int** ** ** ** ** ** ** ** ** ** width, xx, > > last; > > >** ** -** ** ** **struct grid_cell** ** ** ** **tmp_gc, *tmp_gcp; > > >** ** +** ** ** **struct grid_cell** ** ** ** **tmp_gc, *tmp_gcp, > > *cell = NULL; > > >** ** **** ** ** struct utf8_data** ** ** ** **ud; > > >** ** **** ** ** int** ** ** ** ** ** ** ** ** ** ** insert; > > >** ** @@ -995,6 +995,15 @@ screen_write_cell(struct > > screen_write_ctx *ctx, const > > >** ** struct grid_cell *gc) > > >** ** **** ** ** ** ** ** ** **** > > **(GRID_FLAG_FG256|GRID_FLAG_BG256); > > >** ** **** ** ** ** ** ** ** ttyctx.cell = &tmp_gc; > > >** ** **** ** ** ** ** ** ** tty_write(tty_cmd_cell, &ttyctx); > > >** ** +** ** ** **} else if (screen_check_highlight(s, s->cx - > > width, s->cy, &cell)) > > >** ** { > > >** ** +** ** ** ** ** ** ** **memcpy(&tmp_gc, cell, sizeof > > tmp_gc); > > >** ** +** ** ** ** ** ** ** **grid_cell_get(gc, &ud); > > >** ** +** ** ** ** ** ** ** **grid_cell_set(&tmp_gc, &ud); > > >** ** +** ** ** ** ** ** ** **tmp_gc.flags = gc->flags & > > >** ** ~(GRID_FLAG_FG256|GRID_FLAG_BG256); > > >** ** +** ** ** ** ** ** ** **tmp_gc.flags |= cell->flags & > > >** ** +** ** ** ** ** ** ** ** ** > > **(GRID_FLAG_FG256|GRID_FLAG_BG256); > > >** ** +** ** ** ** ** ** ** **ttyctx.cell = &tmp_gc; > > >** ** +** ** ** ** ** ** ** **tty_write(tty_cmd_cell, &ttyctx); > > >** ** **** ** ** } else { > > >** ** **** ** ** ** ** ** ** ttyctx.cell = gc; > > >** ** **** ** ** ** ** ** ** tty_write(tty_cmd_cell, &ttyctx); > > >** ** diff --git screen.c screen.c > > >** ** index 7bfc015..734b38e 100644 > > >** ** --- screen.c > > >** ** +++ screen.c > > >** ** @@ -44,6 +44,7 @@ screen_init(struct screen *s, u_int sx, > > u_int sy, u_int > > >** ** hlimit) > > >** ** **** ** ** s->cstyle = 0; > > >** ** **** ** ** s->ccolour = xstrdup(""); > > >** ** **** ** ** s->tabs = NULL; > > >** ** +** ** ** **s->hls = NULL; > > >** ** **** ** ** screen_reinit(s); > > >** ** **} > > >** ** @@ -65,6 +66,7 @@ screen_reinit(struct screen *s) > > >** ** **** ** ** grid_clear_lines(s->grid, s->grid->hsize, > > s->grid->sy); > > >** ** **** ** ** screen_clear_selection(s); > > >** ** +** ** ** **screen_clear_highlight(s); > > >** ** **} > > >** ** **/* Destroy a screen. */ > > >** ** @@ -75,6 +77,7 @@ screen_free(struct screen *s) > > >** ** **** ** ** free(s->title); > > >** ** **** ** ** free(s->ccolour); > > >** ** **** ** ** grid_destroy(s->grid); > > >** ** +** ** ** **screen_clear_highlight(s); > > >** ** **} > > >** ** **/* Reset tabs to default, eight spaces apart. */ > > >** ** @@ -357,6 +360,56 @@ screen_check_selection(struct screen > > *s, > > u_int px, > > >** ** u_int py) > > >** ** **** ** ** return (1); > > >** ** **} > > >** ** +/* Set highlight. */ > > >** ** +void > > >** ** +screen_set_highlight(struct screen *s, > > >** ** +** ** ** **u_int sx, u_int ex, u_int y, struct grid_cell > > *gc) > > >** ** +{ > > >** ** +** ** ** **struct screen_hls** ** ** ***hls = > > xmalloc(sizeof > > (struct > > >** ** screen_hls)); > > >** ** + > > >** ** +** ** ** **hls->sx = sx; > > >** ** +** ** ** **hls->ex = ex; > > >** ** +** ** ** **hls->y = y; > > >** ** +** ** ** **hls->next = s->hls; > > >** ** + > > >** ** +** ** ** **memcpy(&hls->cell, gc, sizeof hls->cell); > > >** ** + > > >** ** +** ** ** **s->hls = hls; > > >** ** +} > > >** ** + > > >** ** +/* Clear highlights. */ > > >** ** +void > > >** ** +screen_clear_highlight(struct screen *s) > > >** ** +{ > > >** ** +** ** ** **struct screen_hls** ** ** ***hls = s->hls, > > *hlsPrev; > > >** ** + > > >** ** +** ** ** **while (hls != NULL) { > > >** ** +** ** ** ** ** ** ** **hlsPrev = hls; > > >** ** +** ** ** ** ** ** ** **hls = hls->next; > > >** ** +** ** ** ** ** ** ** **free(hlsPrev); > > >** ** +** ** ** **} > > >** ** + > > >** ** +** ** ** **s->hls = NULL; > > >** ** +} > > >** ** + > > >** ** +/* Check if cell in highlight. */ > > >** ** +int > > >** ** +screen_check_highlight(struct screen *s, u_int px, u_int > > py, > > >** ** +** ** ** **struct grid_cell **cell) > > >** ** +{ > > >** ** +** ** ** **struct screen_hls** ** ** ***hls = s->hls; > > >** ** + > > >** ** +** ** ** **while (hls != NULL) { > > >** ** +** ** ** ** ** ** ** **if (hls->sx <= px && px <= hls->ex > > && > > hls->y == py) { > > >** ** +** ** ** ** ** ** ** ** ** ** ** ***cell = &hls->cell; > > >** ** +** ** ** ** ** ** ** ** ** ** ** **return 1; > > >** ** +** ** ** ** ** ** ** **} > > >** ** +** ** ** ** ** ** ** **hls = hls->next; > > >** ** +** ** ** **} > > >** ** + > > >** ** +** ** ** **return 0; > > >** ** +} > > >** ** + > > >** ** **/* Reflow wrapped lines. */ > > >** ** **void > > >** ** **screen_reflow(struct screen *s, u_int new_x) > > >** ** diff --git tmux.h tmux.h > > >** ** index c4c5236..6fc5fd0 100644 > > >** ** --- tmux.h > > >** ** +++ tmux.h > > >** ** @@ -766,6 +766,17 @@ struct screen_sel { > > >** ** **** ** ** struct grid_cell cell; > > >** ** **}; > > >** ** +/* Screen highlights. */ > > >** ** +struct screen_hls { > > >** ** +** ** ** **u_int** ** ** ** ** ** sx; > > >** ** +** ** ** **u_int** ** ** ** ** ** ex; > > >** ** + > > >** ** +** ** ** **u_int** ** ** ** ** ** y; > > >** ** + > > >** ** +** ** ** **struct grid_cell cell; > > >** ** +** ** ** **struct screen_hls *next; > > >** ** +}; > > >** ** + > > >** ** **/* Virtual screen. */ > > >** ** **struct screen { > > >** ** **** ** ** char** ** ** ** ** ** *title; > > >** ** @@ -786,6 +797,7 @@ struct screen { > > >** ** **** ** ** bitstr_t** ** ** ** *tabs; > > >** ** **** ** ** struct screen_sel sel; > > >** ** +** ** ** **struct screen_hls *hls; > > >** ** **}; > > >** ** **/* Screen write context. */ > > >** ** @@ -2118,6 +2130,11 @@ void** ** ** > > screen_set_selection(struct screen *, > > >** ** **** ** ** **** ** u_int, u_int, u_int, u_int, u_int, struct > > grid_cell *); > > >** ** **void** **screen_clear_selection(struct screen *); > > >** ** **int** ** screen_check_selection(struct screen *, u_int, > > u_int); > > >** ** +void** ** screen_set_highlight(struct screen *, > > >** ** +** ** ** ** ** ** u_int, u_int, u_int, struct grid_cell *); > > >** ** +void** ** screen_clear_highlight(struct screen *); > > >** ** +int** ** **screen_check_highlight(struct screen *, u_int, > > u_int, > > >** ** +** ** ** ** ** ** struct grid_cell **); > > >** ** **void** **screen_reflow(struct screen *, u_int); > > >** ** **/* window.c */ > > >** ** diff --git tty.c tty.c > > >** ** index 7688e90..4511533 100644 > > >** ** --- tty.c > > >** ** +++ tty.c > > >** ** @@ -614,7 +614,7 @@ tty_draw_line(struct tty *tty, struct > > screen *s, u_int > > >** ** py, u_int ox, u_int oy) > > >** ** **{ > > >** ** **** ** ** const struct grid_cell** *gc; > > >** ** **** ** ** struct grid_line** ** ** ** *gl; > > >** ** -** ** ** **struct grid_cell** ** ** ** **tmpgc; > > >** ** +** ** ** **struct grid_cell** ** ** ** **tmpgc, *cell = > > NULL; > > >** ** **** ** ** struct utf8_data** ** ** ** **ud; > > >** ** **** ** ** u_int** ** ** ** ** ** ** ** ** ** i, sx; > > >** ** @@ -649,6 +649,15 @@ tty_draw_line(struct tty *tty, struct > > screen *s, > > >** ** u_int py, u_int ox, u_int oy) > > >** ** **** ** ** ** ** ** ** ** ** ** ** tmpgc.flags |= > > s->sel.cell.flags & > > >** ** **** ** ** ** ** ** ** ** ** ** ** **** > > **(GRID_FLAG_FG256|GRID_FLAG_BG256); > > >** ** **** ** ** ** ** ** ** ** ** ** ** tty_cell(tty, &tmpgc); > > >** ** +** ** ** ** ** ** ** **} else if (screen_check_highlight(s, > > i, py, &cell)) { > > >** ** +** ** ** ** ** ** ** ** ** ** ** **memcpy(&tmpgc, cell, > > sizeof tmpgc); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **grid_cell_get(gc, &ud); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **grid_cell_set(&tmpgc, > > &ud); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **tmpgc.flags = gc->flags > > & > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** > > **~(GRID_FLAG_FG256|GRID_FLAG_BG256); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **tmpgc.flags |= > > cell->flags & > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** > > **(GRID_FLAG_FG256|GRID_FLAG_BG256); > > >** ** +** ** ** ** ** ** ** ** ** ** ** **tty_cell(tty, &tmpgc); > > >** ** **** ** ** ** ** ** ** } else > > >** ** **** ** ** ** ** ** ** ** ** ** ** tty_cell(tty, gc); > > >** ** **** ** ** } > > >** ** diff --git window-copy.c window-copy.c > > >** ** index 243c755..00cdc3f 100644 > > >** ** --- window-copy.c > > >** ** +++ window-copy.c > > >** ** @@ -28,10 +28,13 @@ struct screen *window_copy_init(struct > > window_pane *); > > >** ** **void** window_copy_free(struct window_pane *); > > >** ** **void** window_copy_resize(struct window_pane *, u_int, > > u_int); > > >** ** **void** window_copy_key(struct window_pane *, struct > > session > > *, int); > > >** ** +void** **window_copy_key_internal(struct window_pane *, > > struct session *, > > >** ** int); > > >** ** **int** **window_copy_key_input(struct window_pane *, int); > > >** ** **int** **window_copy_key_numeric_prefix(struct window_pane > > *, int); > > >** ** **void** window_copy_mouse( > > >** ** **** ** ** **** **struct window_pane *, struct session *, > > struct mouse_event > > >** ** *); > > >** ** +void** **window_copy_mouse_internal( > > >** ** +** ** ** ** ** **struct window_pane *, struct session *, > > struct mouse_event > > >** ** *); > > >** ** **void** window_copy_redraw_lines(struct window_pane *, > > u_int, u_int); > > >** ** **void** window_copy_redraw_screen(struct window_pane *); > > >** ** @@ -53,6 +56,7 @@ int** **window_copy_is_lowercase(const > > char > > *); > > >** ** **void** window_copy_jump_to_searched_string( > > >** ** **** ** ** **** **struct window_pane *, struct grid *, > > struct > > grid *, u_int, > > >** ** u_int, > > >** ** **** ** ** **** **u_int, int, int, const int); > > >** ** +void** **window_copy_highlight_search(struct window_pane > > *); > > >** ** **int** **window_copy_coord_from_hist(struct window_pane > > *wp, > > >** ** **** ** ** **** **const size_t searchlen, u_int *fx, u_int > > *fy); > > >** ** **void** window_copy_clear_search_hist(struct window_pane *, > > u_int *, u_int > > >** ** *); > > >** ** @@ -397,6 +401,16 @@ window_copy_resize(struct window_pane > > *wp, u_int sx, > > >** ** u_int sy) > > >** ** **void > > >** ** **window_copy_key(struct window_pane *wp, struct session > > *sess, int key) > > >** ** **{ > > >** ** +** ** ** **window_copy_key_internal(wp, sess, key); > > >** ** + > > >** ** +** ** ** **if (wp->mode != NULL) { > > >** ** +** ** ** ** ** ** ** **window_copy_highlight_search(wp); > > >** ** +** ** ** **} > > >** ** +} > > >** ** + > > >** ** +void > > >** ** +window_copy_key_internal(struct window_pane *wp, struct > > session *sess, > > >** ** int key) > > >** ** +{ > > >** ** **** ** ** const char** ** ** ** ** ** ** ** ** ** ** > > *word_separators; > > >** ** **** ** ** struct window_copy_mode_data** ** *data = > > wp->modedata; > > >** ** **** ** ** struct screen** ** ** ** ** ** ** ** ** ***s = > > &data->screen; > > >** ** @@ -944,6 +958,17 @@ void > > >** ** **window_copy_mouse( > > >** ** ** ** **struct window_pane *wp, struct session *sess, struct > > mouse_event > > >** ** *m) > > >** ** **{ > > >** ** +** ** ** **window_copy_mouse_internal(wp, sess, m); > > >** ** + > > >** ** +** ** ** **if (wp->mode != NULL) { > > >** ** +** ** ** ** ** ** ** **window_copy_highlight_search(wp); > > >** ** +** ** ** **} > > >** ** +} > > >** ** + > > >** ** +void > > >** ** +window_copy_mouse_internal( > > >** ** + ** **struct window_pane *wp, struct session *sess, struct > > mouse_event > > >** ** *m) > > >** ** +{ > > >** ** **** ** ** struct window_copy_mode_data** ** *data = > > wp->modedata; > > >** ** **** ** ** struct screen** ** ** ** ** ** ** ** ** ***s = > > &data->screen; > > >** ** **** ** ** u_int** ** ** ** ** ** ** ** ** ** ** ** ** ** i; > > >** ** @@ -1184,6 +1209,68 @@ > > window_copy_jump_to_searched_string(struct > > >** ** window_pane *wp, > > >** ** **** ** ** } > > >** ** **} > > >** ** +void > > >** ** +window_copy_highlight_search(struct window_pane *wp) > > >** ** +{ > > >** ** +** ** ** **struct window_copy_mode_data** ** *data = > > wp->modedata; > > >** ** +** ** ** **struct screen** ** ** ** ** ** ** ** ** ***s = > > data->backing, ss; > > >** ** +** ** ** **struct screen_write_ctx** ** ** ** ** ** ** ** > > ** > > ctx; > > >** ** +** ** ** **struct grid** ** ** ** ** ** ** ** ** ** ***gd = > > s->grid; > > >** ** +** ** ** **struct grid_cell** ** ** ** ** ** ** ** **gc; > > >** ** +** ** ** **struct options** ** ** ** ** ** ** ** ** *oo = > > &wp->window->options; > > >** ** +** ** ** **const char** ** ** ** ** ** ** ** ** ** ** > > *searchstr = data->searchstr; > > >** ** +** ** ** **size_t** ** ** ** ** ** ** ** ** ** ** ** ** > > **searchlen; > > >** ** +** ** ** **u_int** ** ** ** ** ** ** ** ** ** ** ** ** ** > > i, > > px, last, beginline, endline; > > >** ** +** ** ** **int** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > found, utf8flag, cis, highlight; > > >** ** + > > >** ** +** ** ** **highlight = options_get_number( > > >** ** +** ** ** ** ** ** ** **&wp->window->options, > > "highlight-search"); > > >** ** +** ** ** **if (!highlight) { > > >** ** +** ** ** ** ** ** ** **return; > > >** ** +** ** ** **} > > >** ** + > > >** ** +** ** ** **screen_clear_highlight(&data->screen); > > >** ** + > > >** ** +** ** ** **if ((searchstr != NULL) && (*searchstr != '\0')) > > { > > >** ** +** ** ** ** ** ** ** **utf8flag = > > options_get_number(&wp->window->options, > > >** ** "utf8"); > > >** ** +** ** ** ** ** ** ** **searchlen = > > screen_write_strlen(utf8flag, "%s", > > >** ** searchstr); > > >** ** + > > >** ** +** ** ** ** ** ** ** **screen_init(&ss, searchlen, 1, 0); > > >** ** +** ** ** ** ** ** ** **screen_write_start(&ctx, NULL, &ss); > > >** ** +** ** ** ** ** ** ** **memcpy(&gc, &grid_default_cell, > > sizeof gc); > > >** ** +** ** ** ** ** ** ** **screen_write_nputs(&ctx, -1, &gc, > > utf8flag, "%s", > > >** ** searchstr); > > >** ** +** ** ** ** ** ** ** **screen_write_stop(&ctx); > > >** ** + > > >** ** +** ** ** ** ** ** ** **cis = > > window_copy_is_lowercase(searchstr); > > >** ** + > > >** ** +** ** ** ** ** ** ** **/* Set colours. */ > > >** ** +** ** ** ** ** ** ** **style_apply(&gc, oo, > > "highlight-style"); > > >** ** + > > >** ** +** ** ** ** ** ** ** **beginline = screen_hsize(s) - > > data->oy; > > >** ** +** ** ** ** ** ** ** **endline = screen_hsize(s) - data->oy > > + screen_size_y(s) - > > >** ** 1; > > >** ** + > > >** ** +** ** ** ** ** ** ** **for (i = beginline; i <= endline; > > ++i) { > > >** ** +** ** ** ** ** ** ** ** ** ** ** **last = 0; > > >** ** +** ** ** ** ** ** ** ** ** ** ** **do { > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **found = > > window_copy_search_lr(gd, ss.grid, > > >** ** &px, > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > **i, last, gd->sx, cis); > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **if (found) { > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > **screen_set_highlight( > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > ** ** ** **&data->screen, > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > ** ** ** **px, > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > ** ** ** **px + searchlen - 1, > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > ** ** ** **i - (screen_hsize(s) > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > ** ** ** ** ** ** - data->oy), > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > ** ** ** **&gc); > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** > > **last += searchlen; > > >** ** +** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **} > > >** ** +** ** ** ** ** ** ** ** ** ** ** **} while (found); > > >** ** +** ** ** ** ** ** ** **} > > >** ** +** ** ** **} > > >** ** + > > >** ** +** ** ** **window_copy_redraw_screen(wp); > > >** ** +} > > >** ** + > > >** ** **/* If it returns 0 then, according to search history, last > > time we > > >** ** searched > > >** ** ** * a shorter string we haven't found anything, so there is > > no point in > > >** ** ** * incremental-searching a longer string (just an > > optimization) */ > > > > > > > > > ------------------------------------------------------------------------------ > > > Want fast and easy access to all the code in your enterprise? > > Index and > > > search up to 200,000 lines of code with a free copy of Black Duck > > > Code Sight - the same software that powers the world's largest > > code > > > search on Ohloh, the Black Duck Open Hub! Try it now. > > > [4]http://p.sf.net/sfu/bds > > > > > _______________________________________________ > > > tmux-users mailing list > > > [5]tmux-users@lists.sourceforge.net > > > [6]https://lists.sourceforge.net/lists/listinfo/tmux-users > > > > > > ------------------------------------------------------------------------------ > > Want fast and easy access to all the code in your enterprise? Index > > and > > search up to 200,000 lines of code with a free copy of Black Duck > > Code Sight - the same software that powers the world's largest code > > search on Ohloh, the Black Duck Open Hub! Try it now. > > [7]http://p.sf.net/sfu/bds > > _______________________________________________ > > tmux-users mailing list > > [8]tmux-users@lists.sourceforge.net > > [9]https://lists.sourceforge.net/lists/listinfo/tmux-users > > > > References > > > > Visible links > > 1. mailto:lukaspiatkow...@gmail.com > > 2. mailto:f.rosencra...@gmail.com > > 3. mailto:nicholas.marri...@gmail.com > > 4. http://p.sf.net/sfu/bds > > 5. mailto:tmux-users@lists.sourceforge.net > > 6. https://lists.sourceforge.net/lists/listinfo/tmux-users > > 7. http://p.sf.net/sfu/bds > > 8. mailto:tmux-users@lists.sourceforge.net > > 9. https://lists.sourceforge.net/lists/listinfo/tmux-users > > > > ------------------------------------------------------------------------------ One dashboard for servers and applications across Physical-Virtual-Cloud Widest out-of-the-box monitoring support with 50+ applications Performance metrics, stats and reports that give you Actionable Insights Deep dive visibility with transaction tracing using APM Insight. http://ad.doubleclick.net/ddm/clk/290420510;117567292;y _______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users