From 0deb3fdd3783b98af11e5070325c407f7d2d6120 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Sat, 3 Jun 2006 12:04:48 +0000 Subject: [PATCH] Support searching backwards too. Signed-off-by: Neil Brown --- TODO | 3 +++ vpatch.c | 31 ++++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/TODO b/TODO index 7f9cceb..ab6012f 100644 --- a/TODO +++ b/TODO @@ -183,6 +183,9 @@ DONE - blank after end and before begining DONE next/prev diff next/prev conflict incr-search + find char pos in search and highlight + multiple finds per line + switch from forward to reverse. DONE page up/down DONE beginning/end of line left-right to handle line breaks. diff --git a/vpatch.c b/vpatch.c index f1defef..9f33b85 100644 --- a/vpatch.c +++ b/vpatch.c @@ -1361,6 +1361,7 @@ void merge_window(struct plist *p, FILE *f, int reverse) char search[80]; int searchlen = 0; int search_notfound = 0; + int searchdir; struct search_anchor { struct search_anchor *next; struct mpos pos; @@ -1507,6 +1508,7 @@ void merge_window(struct plist *p, FILE *f, int reverse) if (num>=0) { char buf[10]; sprintf(buf, "%d ", num); addstr(buf);} if (meta & META(0)) addstr("ESC..."); if (meta & SEARCH(0)) { + if (searchdir) addstr("Backwards "); addstr("Search: "); addstr(search); if (search_notfound) @@ -1557,14 +1559,28 @@ void merge_window(struct plist *p, FILE *f, int reverse) meta = SEARCH(0); searchlen = 0; search[searchlen] = 0; + searchdir = 0; + break; + case '\\': + case 'R'-64: + /* incr search backwards */ + meta = SEARCH(0); + searchlen = 0; + search[searchlen] = 0; + searchdir = 1; break; case SEARCH('G'-64): case SEARCH('S'-64): /* search again */ meta = SEARCH(0); tpos = pos; trow = row; - trow++; - next_mline(&tpos, fm,fb,fa,ci.merger,mode); + if (searchdir) { + trow--; + prev_mline(&tpos, fm,fb,fa,ci.merger,mode); + } else { + trow++; + next_mline(&tpos, fm,fb,fa,ci.merger,mode); + } goto search_again; case SEARCH('H'-64): @@ -1605,9 +1621,14 @@ void merge_window(struct plist *p, FILE *f, int reverse) search_notfound = 0; break; } - trow++; - next_mline(&tpos, fm,fb,fa,ci.merger,mode); - } while (ci.merger[tpos.p.m].type != End); + if (searchdir) { + trow--; + prev_mline(&tpos, fm,fb,fa,ci.merger,mode); + } else { + trow++; + next_mline(&tpos, fm,fb,fa,ci.merger,mode); + } + } while (tpos.p.m >= 0 && ci.merger[tpos.p.m].type != End); break; case 'L'-64: -- 2.39.5