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.
char search[80];
int searchlen = 0;
int search_notfound = 0;
+ int searchdir;
struct search_anchor {
struct search_anchor *next;
struct mpos pos;
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)
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):
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: