diff -r 4f495f8070af src/cmd/acme/dat.h --- a/src/cmd/acme/dat.h Mon Sep 12 12:36:30 2011 -0400 +++ b/src/cmd/acme/dat.h Wed Nov 23 16:26:45 2011 +0100 @@ -271,6 +271,7 @@ int taglines; Rectangle tagtop; QLock editoutlk; + int backwards; }; void wininit(Window*, Window*, Rectangle); diff -r 4f495f8070af src/cmd/acme/exec.c --- a/src/cmd/acme/exec.c Mon Sep 12 12:36:30 2011 -0400 +++ b/src/cmd/acme/exec.c Wed Nov 23 16:26:45 2011 +0100 @@ -49,6 +49,7 @@ void paste(Text*, Text*, Text*, int, int, Rune*, int); void put(Text*, Text*, Text*, int, int, Rune*, int); void putall(Text*, Text*, Text*, int, int, Rune*, int); +void rev(Text*, Text*, Text*, int, int, Rune*, int); void sendx(Text*, Text*, Text*, int, int, Rune*, int); void sort(Text*, Text*, Text*, int, int, Rune*, int); void tab(Text*, Text*, Text*, int, int, Rune*, int); @@ -87,6 +88,7 @@ static Rune LPut[] = { 'P', 'u', 't', 0 }; static Rune LPutall[] = { 'P', 'u', 't', 'a', 'l', 'l', 0 }; static Rune LRedo[] = { 'R', 'e', 'd', 'o', 0 }; +static Rune LRev[] = { 'R', 'e', 'v', 0 }; static Rune LSend[] = { 'S', 'e', 'n', 'd', 0 }; static Rune LSnarf[] = { 'S', 'n', 'a', 'r', 'f', 0 }; static Rune LSort[] = { 'S', 'o', 'r', 't', 0 }; @@ -118,6 +120,7 @@ { LPut, put, FALSE, XXX, XXX }, { LPutall, putall, FALSE, XXX, XXX }, { LRedo, undo, FALSE, FALSE, XXX }, + { LRev, rev, FALSE, FALSE, XXX }, { LSend, sendx, TRUE, XXX, XXX }, { LSnarf, cut, FALSE, TRUE, FALSE }, { LSort, sort, FALSE, XXX, XXX }, @@ -402,6 +405,22 @@ } void +rev(Text *et, Text *_1, Text *_2, int _3, int _4, Rune *_5, int _6) +{ + USED(_1); + USED(_2); + USED(_3); + USED(_4); + USED(_4); + USED(_6); + + if (et->w->backwards) + et->w->backwards = 0; + else + et->w->backwards = 1; +} + +void sort(Text *et, Text *_0, Text *_1, int _2, int _3, Rune *_4, int _5) { USED(_0); diff -r 4f495f8070af src/cmd/acme/fns.h --- a/src/cmd/acme/fns.h Mon Sep 12 12:36:30 2011 -0400 +++ b/src/cmd/acme/fns.h Wed Nov 23 16:26:45 2011 +0100 @@ -83,6 +83,7 @@ void *erealloc(void*, uint); char *estrdup(char*); Range address(uint, Text*, Range, Range, void*, uint, uint, int (*)(void*, uint), int*, uint*); +Range regexp(uint showerr, Text *t, Range lim, Range r, Rune *pat, int dir, int *foundp); int rxexecute(Text*, Rune*, uint, uint, Rangeset*); int rxbexecute(Text*, uint, Rangeset*); Window* makenewwindow(Text *t); diff -r 4f495f8070af src/cmd/acme/look.c --- a/src/cmd/acme/look.c Mon Sep 12 12:36:30 2011 -0400 +++ b/src/cmd/acme/look.c Wed Nov 23 16:26:45 2011 +0100 @@ -89,6 +89,10 @@ Plumbmsg *m; Runestr dir; char buf[32]; + // for backwards search + int eval; + Range ra; + Rune *pat; ct = seltext; if(ct == nil) @@ -182,6 +186,12 @@ bufread(&t->file->b, q0, r, q1-q0); m->data = runetobyte(r, q1-q0); m->ndata = strlen(m->data); + if (t->w != nil && t->w->backwards) { + pat = runemalloc(q1-q0+1); + for (eval = 0; eval < q1-q0; eval++) + pat[eval] = r[eval]; + pat[q1-q0] = 0; + } free(r); if(m->ndata= 0){ plumbfree(m); @@ -192,11 +202,27 @@ } /* interpret alphanumeric string ourselves */ - if(expanded == FALSE) + if(expanded == FALSE) { + if (t->w != nil && t->w->backwards) { + free(pat); + } return; + } if(e.name || e.u.at) openfile(t, &e); else{ + if (t->w != nil && t->w->backwards) { + ra = range(e.q0, e.q1); + ra = regexp(TRUE, t, range(-1,-1), ra, pat, '-', &eval); + if (ra.q0 < 0 || ra.q1 < 0) { + goto Return; + } + textshow(t, ra.q0, ra.q1, 1); + winsettag(t->w); + seltext = t; + moveto(mousectl, addpt(frptofchar(&t->fr, t->fr.p0), Pt(4, font->height-4))); + goto Return; + } if(t->w == nil) return; ct = &t->w->body; @@ -215,6 +241,9 @@ } Return: + if (t->w != nil && t->w->backwards) { + free(pat); + } free(e.name); free(e.bname); } @@ -640,7 +669,7 @@ e->jump = FALSE; } - if(expandfile(t, q0, q1, e)) + if(expandfile(t, q0, q1, e)) return TRUE; if(q0 == q1){ diff -r 4f495f8070af src/cmd/acme/wind.c --- a/src/cmd/acme/wind.c Mon Sep 12 12:36:30 2011 -0400 +++ b/src/cmd/acme/wind.c Wed Nov 23 16:26:45 2011 +0100 @@ -408,7 +408,7 @@ Rune *new, *old, *r; uint q0, q1; static Rune Ldelsnarf[] = { ' ', 'D', 'e', 'l', ' ', - 'S', 'n', 'a', 'r', 'f', 0 }; + 'S', 'n', 'a', 'r', 'f', ' ', 'R', 'e', 'v', 0 }; static Rune Lundo[] = { ' ', 'U', 'n', 'd', 'o', 0 }; static Rune Lredo[] = { ' ', 'R', 'e', 'd', 'o', 0 }; static Rune Lget[] = { ' ', 'G', 'e', 't', 0 }; @@ -439,8 +439,8 @@ i = 0; runemove(new+i, w->body.file->name, w->body.file->nname); i += w->body.file->nname; - runemove(new+i, Ldelsnarf, 10); - i += 10; + runemove(new+i, Ldelsnarf, 14); + i += 14; if(w->filemenu){ if(w->body.needundo || w->body.file->delta.nc>0 || w->body.ncache){ runemove(new+i, Lundo, 5);