diff options
author | Wayne Davison <wayned@users.sourceforge.net> | 2001-05-26 20:57:16 +0000 |
---|---|---|
committer | Wayne Davison <wayned@users.sourceforge.net> | 2001-05-26 20:57:16 +0000 |
commit | f18dca326686b7403757ba69b85590fb0f4ee85e (patch) | |
tree | 3dd3c2e542b61ff851a23262057f75132150251d | |
parent | 60df1f9eece3b0f9a03ef146f0d978c5768304e6 (diff) | |
download | zsh-f18dca326686b7403757ba69b85590fb0f4ee85e.tar.gz zsh-f18dca326686b7403757ba69b85590fb0f4ee85e.tar.xz zsh-f18dca326686b7403757ba69b85590fb0f4ee85e.zip |
Fixed acceptandinfernexthistory() to work when called repeatedly.
Also changed it to not accept the line if the infer fails. Ignore transient edits in the history when searching for an inference and grabbing the next line (affecting acceptandinfernexthistory(), infernexthistory(), and acceptlineanddownhistory()).
-rw-r--r-- | Src/Zle/zle_hist.c | 806 |
1 files changed, 433 insertions, 373 deletions
diff --git a/Src/Zle/zle_hist.c b/Src/Zle/zle_hist.c index 76e421c1c..a83ce7334 100644 --- a/Src/Zle/zle_hist.c +++ b/Src/Zle/zle_hist.c @@ -30,12 +30,6 @@ #include "zle.mdh" #include "zle_hist.pro" -/* Are references to earlier history lines permitted? == 0 if * - * editing or reading a standalone line, such as in vared or select. */ - -/**/ -int histallowed; - /* Column position of vi ideal cursor. -1 if it is unknown -- most * * movements and changes do this. */ @@ -47,27 +41,16 @@ int lastcol; /**/ int histline; -/* the last line in the history (the current one), metafied */ - -/**/ -char *curhistline; +#define ZLETEXT(X) ((X)->zle_text ? (X)->zle_text : (X)->text) /**/ void remember_edits(void) { - if (histline == curhist) { - zsfree(curhistline); - curhistline = metafy((char *) line, ll, META_DUP); - } - else { - Histent ent = gethistent(histline); - - if (metadiffer(ent->zle_text ? ent->zle_text : ent->text, - (char *) line, ll)) { - zsfree(ent->zle_text); - ent->zle_text = metafy((char *) line, ll, META_DUP); - } + Histent ent = quietgethist(histline); + if (metadiffer(ZLETEXT(ent), (char *) line, ll)) { + zsfree(ent->zle_text); + ent->zle_text = metafy((char *) line, ll, META_DUP); } } @@ -75,28 +58,26 @@ remember_edits(void) void forget_edits(void) { - int i; + Histent he; - for (i = 0; i < histentct; i++) { - zsfree(histentarr[i].zle_text); - histentarr[i].zle_text = NULL; + for (he = hist_ring; he; he = up_histent(he)) { + zsfree(he->zle_text); + he->zle_text = NULL; } } /**/ -void -uphistory(void) +int +uphistory(char **args) { - if (zmult < 0) { - zmult = -zmult; - downhistory(); - zmult = -zmult; - } else if(!zle_goto_hist(histline - zmult) && isset(HISTBEEP)) - feep(); + int nodups = isset(HISTIGNOREDUPS); + if (!zle_goto_hist(histline, -zmult, nodups) && isset(HISTBEEP)) + return 1; + return 0; } /**/ -int +static int upline(void) { int n = zmult; @@ -130,58 +111,57 @@ upline(void) } /**/ -void -uplineorhistory(void) +int +uplineorhistory(char **args) { int ocs = cs; int n = upline(); if (n) { - int m = zmult; + int m = zmult, ret; cs = ocs; - if (virangeflag || !histallowed) { - feep(); - return; - } + if (virangeflag || !(zlereadflags & ZLRF_HISTORY)) + return 1; zmult = n; - uphistory(); + ret = uphistory(args); zmult = m; + return ret; } + return 0; } /**/ -void -viuplineorhistory(void) +int +viuplineorhistory(char **args) { int col = lastcol; - uplineorhistory(); + uplineorhistory(args); lastcol = col; - vifirstnonblank(); + return vifirstnonblank(args); } - /**/ -void -uplineorsearch(void) +int +uplineorsearch(char **args) { int ocs = cs; int n = upline(); if (n) { - int m = zmult; + int m = zmult, ret; cs = ocs; - if (virangeflag || !histallowed) { - feep(); - return; - } + if (virangeflag || !(zlereadflags & ZLRF_HISTORY)) + return 1; zmult = n; - historysearchbackward(); + ret = historysearchbackward(args); zmult = m; + return ret; } + return 0; } /**/ -int +static int downline(void) { int n = zmult; @@ -215,189 +195,220 @@ downline(void) } /**/ -void -downlineorhistory(void) +int +downlineorhistory(char **args) { int ocs = cs; int n = downline(); if (n) { - int m = zmult; + int m = zmult, ret; cs = ocs; - if (virangeflag || !histallowed) { - feep(); - return; - } + if (virangeflag || !(zlereadflags & ZLRF_HISTORY)) + return 1; zmult = n; - downhistory(); + ret = downhistory(args); zmult = m; + return ret; } + return 0; } /**/ -void -vidownlineorhistory(void) +int +vidownlineorhistory(char **args) { int col = lastcol; - downlineorhistory(); + downlineorhistory(args); lastcol = col; - vifirstnonblank(); + return vifirstnonblank(zlenoargs); } /**/ -void -downlineorsearch(void) +int +downlineorsearch(char **args) { int ocs = cs; int n = downline(); if (n) { - int m = zmult; + int m = zmult, ret; cs = ocs; - if (virangeflag || !histallowed) { - feep(); - return; - } + if (virangeflag || !(zlereadflags & ZLRF_HISTORY)) + return 1; zmult = n; - historysearchforward(); + ret = historysearchforward(args); zmult = m; + return ret; } + return 0; } /**/ -void -acceptlineanddownhistory(void) +int +acceptlineanddownhistory(char **args) { - char *s; + Histent he; - if (!(s = zle_get_event(histline + 1))) { - feep(); - return; - } - pushnode(bufstack, ztrdup(s)); + if (!(he = movehistent(quietgethist(histline), 1, HIST_FOREIGN))) + return 1; + zpushnode(bufstack, ztrdup(he->text)); done = 1; - stackhist = histline + 1; + stackhist = he->histnum; + return 0; } /**/ -void -downhistory(void) +int +downhistory(char **args) { - if (zmult < 0) { - zmult = -zmult; - uphistory(); - zmult = -zmult; - } else if(!zle_goto_hist(histline + zmult) && isset(HISTBEEP)) - feep(); + int nodups = isset(HISTIGNOREDUPS); + if (!zle_goto_hist(histline, zmult, nodups) && isset(HISTBEEP)) + return 1; + return 0; } +static int histpos, srch_hl, srch_cs = -1; +static char *srch_str; + /**/ -void -historysearchbackward(void) +int +historysearchbackward(char **args) { - int histpos, histmpos, hl = histline; - int n = zmult; - char *s; + Histent he; + int n = zmult, hp; + char *s, *str; - if (!n) - return; - if (n < 0) { + if (zmult < 0) { + int ret; zmult = -n; - historysearchforward(); + ret = historysearchforward(args); zmult = n; - return; + return ret; } - for (histpos = histmpos = 0; histpos < ll && !iblank(line[histpos]); - histpos++, histmpos++) - if(imeta(line[histpos])) - histmpos++; - for (;;) { - hl--; - if (!(s = zle_get_event(hl))) { - feep(); - return; + if ((str = *args)) + hp = strlen(str); + else { + if (histline == curhist || histline != srch_hl || cs != srch_cs || + mark != 0 || memcmp(srch_str, line, histpos) != 0) { + zfree(srch_str, histpos); + for (histpos = 0; histpos < ll && !iblank(line[histpos]); histpos++) ; + if (histpos < ll) + histpos++; + srch_str = zalloc(histpos); + memcpy(srch_str, line, histpos); + } + str = srch_str; + hp = histpos; + } + he = quietgethist(histline); + while ((he = movehistent(he, -1, hist_skip_flags))) { + if (isset(HISTFINDNODUPS) && he->flags & HIST_DUP) + continue; + s = ZLETEXT(he); + if (metadiffer(s, str, hp) < 0 && + (*args || metadiffer(s, str, ll))) { + if (--n <= 0) { + zle_setline(he); + srch_hl = histline; + srch_cs = cs; + return 0; + } } - if (metadiffer(s, (char *) line, histpos) < 0 && - iblank(s[histmpos] == Meta ? s[histmpos+1]^32 : s[histmpos]) && - metadiffer(s, (char *) line, ll) && !--n) - break; } - zle_goto_hist(hl); + return 1; } /**/ -void -historysearchforward(void) +int +historysearchforward(char **args) { - int histpos, histmpos, hl = histline; - int n = zmult; - char *s; + Histent he; + int n = zmult, hp; + char *s, *str; - if (!n) - return; - if (n < 0) { + if (zmult < 0) { + int ret; zmult = -n; - historysearchbackward(); + ret = historysearchbackward(args); zmult = n; - return; + return ret; } - for (histpos = histmpos = 0; histpos < ll && !iblank(line[histpos]); - histpos++, histmpos++) - if(imeta(line[histpos])) - histmpos++; - for (;;) { - hl++; - if (!(s = zle_get_event(hl))) { - feep(); - return; + if ((str = *args)) + hp = strlen(str); + else { + if (histline == curhist || histline != srch_hl || cs != srch_cs || + mark != 0 || memcmp(srch_str, line, histpos) != 0) { + zfree(srch_str, histpos); + for (histpos = 0; histpos < ll && !iblank(line[histpos]); histpos++) ; + if (histpos < ll) + histpos++; + srch_str = zalloc(histpos); + memcpy(srch_str, line, histpos); + } + str = srch_str; + hp = histpos; + } + he = quietgethist(histline); + while ((he = movehistent(he, 1, hist_skip_flags))) { + if (isset(HISTFINDNODUPS) && he->flags & HIST_DUP) + continue; + s = ZLETEXT(he); + if (metadiffer(s, str, hp) < (he->histnum == curhist) && + (*args || metadiffer(s, str, ll))) { + if (--n <= 0) { + zle_setline(he); + srch_hl = histline; + srch_cs = cs; + return 0; + } } - if (metadiffer(s, (char *) line, histpos) < (histline == curhist) && - (!s[histmpos] || - iblank(s[histmpos] == Meta ? s[histmpos+1]^32 : s[histmpos])) && - metadiffer(s, (char *) line, ll) && !--n) - break; } - zle_goto_hist(hl); + return 1; } /**/ -void -beginningofbufferorhistory(void) +int +beginningofbufferorhistory(char **args) { if (findbol()) cs = 0; else - beginningofhistory(); + return beginningofhistory(args); + return 0; } /**/ -void -beginningofhistory(void) +int +beginningofhistory(char **args) { - if (!zle_goto_hist(firsthist()) && isset(HISTBEEP)) - feep(); + if (!zle_goto_hist(firsthist(), 0, 0) && isset(HISTBEEP)) + return 1; + return 0; } /**/ -void -endofbufferorhistory(void) +int +endofbufferorhistory(char **args) { if (findeol() != ll) cs = ll; else - endofhistory(); + return endofhistory(args); + return 0; } /**/ -void -endofhistory(void) +int +endofhistory(char **args) { - zle_goto_hist(curhist); + zle_goto_hist(curhist, 0, 0); + return 0; } /**/ -void -insertlastword(void) +int +insertlastword(char **args) { int n; char *s, *t; @@ -406,7 +417,7 @@ insertlastword(void) /* multiple calls will now search back through the history, pem */ static char *lastinsert; static int lasthist, lastpos; - int evhist = curhist - 1, save; + int evhist = addhistnum(curhist, -1, HIST_FOREIGN), save; if (lastinsert) { int lastlen = ztrlen(lastinsert); @@ -415,26 +426,22 @@ insertlastword(void) if (lastpos <= pos && lastlen == pos - lastpos && memcmp(lastinsert, (char *)&line[lastpos], lastlen) == 0) { - evhist = --lasthist; + evhist = addhistnum(lasthist, -1, HIST_FOREIGN); cs = lastpos; foredel(pos - cs); } zsfree(lastinsert); lastinsert = NULL; } - if (!(he = quietgethist(evhist)) || !he->nwords) { - feep(); - return; - } + if (!(he = quietgethist(evhist)) || !he->nwords) + return 1; if (zmult > 0) { n = he->nwords - (zmult - 1); } else { n = 1 - zmult; } - if (n < 1 || n > he->nwords) { - feep(); - return; - } + if (n < 1 || n > he->nwords) + return 1; s = he->text + he->words[2*n-2]; t = he->text + he->words[2*n-1]; save = *t; @@ -448,72 +455,77 @@ insertlastword(void) doinsert(s); zmult = n; *t = save; + return 0; } /**/ -char * -qgetevent(int ev) +void +zle_setline(Histent he) { - return ((ev == curhist) ? curhistline : quietgetevent(ev)); + remember_edits(); + mkundoent(); + histline = he->histnum; + setline(ZLETEXT(he)); + setlastline(); + clearlist = 1; } /**/ -char * -zle_get_event(int ev) +int +setlocalhistory(char **args) { - Histent ent; - - if (ev == curhist) - return curhistline; - if (! (ent = quietgethist(ev))) - return NULL; - if (ent->zle_text) - return ent->zle_text; - return ent->text; + if (zmod.flags & MOD_MULT) { + hist_skip_flags = zmult? HIST_FOREIGN : 0; + } else { + hist_skip_flags ^= HIST_FOREIGN; + } + return 0; } /**/ -static int -zle_goto_hist(int ev) +int +zle_goto_hist(int ev, int n, int skipdups) { - char *t; - - remember_edits(); - if(!(t = zle_get_event(ev))) + Histent he = movehistent(quietgethist(ev), n, hist_skip_flags); + if (skipdups && n) { + n = n < 0? -1 : 1; + while (he && !metadiffer(ZLETEXT(he), (char *) line, ll)) + he = movehistent(he, n, hist_skip_flags); + } + if (!he) return 0; - mkundoent(); - histline = ev; - setline(t); - setlastline(); + zle_setline(he); return 1; } /**/ -void -pushline(void) +int +pushline(char **args) { int n = zmult; if (n < 0) - return; - pushnode(bufstack, metafy((char *) line, ll, META_DUP)); + return 1; + zpushnode(bufstack, metafy((char *) line, ll, META_DUP)); while (--n) - pushnode(bufstack, ztrdup("")); + zpushnode(bufstack, ztrdup("")); stackcs = cs; *line = '\0'; ll = cs = 0; + clearlist = 1; + return 0; } /**/ -void -pushlineoredit(void) +int +pushlineoredit(char **args) { - int ics; + int ics, ret; unsigned char *s; char *hline = hgetline(); if (zmult < 0) - return; + return 1; if (hline && *hline) { ics = ztrlen(hline); sizeline(ics + ll + 1); @@ -523,34 +535,36 @@ pushlineoredit(void) ll += ics; cs += ics; } - pushline(); - if (!isfirstln) { + ret = pushline(args); + if (!isfirstln) errflag = done = 1; - } + clearlist = 1; + return ret; } /**/ -void -pushinput(void) +int +pushinput(char **args) { - int i; + int i, ret; if (zmult < 0) - return; + return 1; zmult += i = !isfirstln; - pushlineoredit(); + ret = pushlineoredit(args); zmult -= i; + return ret; } /**/ -void -getline(void) +int +getline(char **args) { char *s = (char *)getlinknode(bufstack); - if (!s) - feep(); - else { + if (!s) { + return 1; + } else { int cc; unmetafy(s, &cc); @@ -558,21 +572,25 @@ getline(void) memcpy((char *)line + cs, s, cc); cs += cc; free(s); + clearlist = 1; } + return 0; } /**/ -void -historyincrementalsearchbackward(void) +int +historyincrementalsearchbackward(char **args) { - doisearch(-1); + doisearch(args, -1); + return 0; } /**/ -void -historyincrementalsearchforward(void) +int +historyincrementalsearchforward(char **args) { - doisearch(1); + doisearch(args, 1); + return 0; } static struct isrch_spot { @@ -587,8 +605,6 @@ static struct isrch_spot { static int max_spot = 0; -#ifdef MODULE - /**/ void free_isrch_spots(void) @@ -596,8 +612,6 @@ free_isrch_spots(void) zfree(isrch_spots, max_spot * sizeof(*isrch_spots)); } -#endif /* MODULE */ - /**/ static void set_isrch_spot(int num, int hl, int pos, int cs, int len, int dir, int nomatch) @@ -638,22 +652,34 @@ get_isrch_spot(int num, int *hlp, int *posp, int *csp, int *lenp, int *dirp, int /**/ static void -doisearch(int dir) +doisearch(char **args, int dir) { - char *s, *ibuf = halloc(80), *sbuf = ibuf + FIRST_SEARCH_CHAR; + char *s, *ibuf = zhalloc(80), *sbuf = ibuf + FIRST_SEARCH_CHAR; int sbptr = 0, top_spot = 0, pos, sibuf = 80; int nomatch = 0, skip_line = 0, skip_pos = 0; int odir = dir, sens = zmult == 1 ? 3 : 1; - int hl = histline; + int hl = histline, savekeys = -1, feep = 0; Thingy cmd; char *okeymap = curkeymapname; static char *previous_search = NULL; static int previous_search_len = 0; + Histent he; + + clearlist = 1; + + if (*args) { + int len; + char *arg; + savekeys = kungetct; + arg = getkeystring(*args, &len, 2, NULL); + ungetkeys(arg, len); + } strcpy(ibuf, ISEARCH_PROMPT); memcpy(ibuf + NORM_PROMPT_POS, (dir == 1) ? "fwd" : "bck", 3); remember_edits(); - s = zle_get_event(hl); + he = quietgethist(hl); + s = ZLETEXT(he); selectkeymap("main", 1); pos = metalen(s, cs); for (;;) { @@ -687,31 +713,34 @@ doisearch(int dir) if (!skip_line && ((sbuf[0] == '^') ? (t = metadiffer(s, sbuf + 1, sbptr - 1) < sens ? s : NULL) : (t = hstrnstr(s, pos, sbuf, sbptr, dir, sens)))) { - zle_goto_hist(hl); + zle_setline(he); pos = t - s; cs = ztrsub(t, s) + (dir == 1? sbptr - (sbuf[0]=='^') : 0); nomatch = 0; statusline = ibuf + NORM_PROMPT_POS; break; } - hl += dir; - if (!(s = zle_get_event(hl))) { + if (!(he = movehistent(he, dir, hist_skip_flags))) { if (sbptr == (int)isrch_spots[top_spot-1].len && (isrch_spots[top_spot-1].flags & ISS_FAILING)) top_spot--; get_isrch_spot(top_spot, &hl, &pos, &cs, &sbptr, &dir, &nomatch); if (!nomatch) { - feep(); + feep = 1; nomatch = 1; } - s = last_line; + he = quietgethist(hl); + s = ZLETEXT(he); skip_line = 0; statusline = ibuf; break; } + hl = he->histnum; + s = ZLETEXT(he); pos = dir == 1? 0 : strlen(s); - skip_line = !strcmp(last_line, s); + skip_line = isset(HISTFINDNODUPS)? !!(he->flags & HIST_DUP) + : !strcmp(last_line, s); } } else { top_spot = 0; @@ -721,24 +750,25 @@ doisearch(int dir) sbuf[sbptr] = '_'; statusll = sbuf - statusline + sbptr + 1; ref: - refresh(); + zrefresh(); if (!(cmd = getkeycmd()) || cmd == Th(z_sendbreak)) { int i; get_isrch_spot(0, &hl, &pos, &i, &sbptr, &dir, &nomatch); - s = zle_get_event(hl); - zle_goto_hist(hl); + he = quietgethist(hl); + zle_setline(he); + s = ZLETEXT(he); cs = i; break; } if(cmd == Th(z_clearscreen)) { - clearscreen(); + clearscreen(zlenoargs); goto ref; } else if(cmd == Th(z_redisplay)) { - redisplay(); + redisplay(zlenoargs); goto ref; } else if(cmd == Th(z_vicmdmode)) { if(selectkeymap(invicmdmode() ? "main" : "vicmd", 0)) - feep(); + feep = 1; goto ref; } else if(cmd == Th(z_vibackwarddeletechar) || cmd == Th(z_backwarddeletechar)) { @@ -746,30 +776,31 @@ doisearch(int dir) get_isrch_spot(--top_spot, &hl, &pos, &cs, &sbptr, &dir, &nomatch); else - feep(); + feep = 1; if (nomatch) { statusline = ibuf; skip_pos = 1; } - s = zle_get_event(hl); + he = quietgethist(hl); + s = ZLETEXT(he); if (nomatch || !sbptr || (sbptr == 1 && sbuf[0] == '^')) { int i = cs; - zle_goto_hist(hl); + zle_setline(he); cs = i; } memcpy(ibuf + NORM_PROMPT_POS, (dir == 1) ? "fwd" : "bck", 3); continue; } else if(cmd == Th(z_acceptandhold)) { - acceptandhold(); + acceptandhold(zlenoargs); break; } else if(cmd == Th(z_acceptandinfernexthistory)) { - acceptandinfernexthistory(); + acceptandinfernexthistory(zlenoargs); break; } else if(cmd == Th(z_acceptlineanddownhistory)) { - acceptlineanddownhistory(); + acceptlineanddownhistory(zlenoargs); break; } else if(cmd == Th(z_acceptline)) { - acceptline(); + acceptline(zlenoargs); break; } else if(cmd == Th(z_historyincrementalsearchbackward)) { set_isrch_spot(top_spot++, hl, pos, cs, sbptr, dir, nomatch); @@ -809,10 +840,10 @@ doisearch(int dir) cmd == Th(z_quotedinsert)) { if(cmd == Th(z_viquotedinsert)) { sbuf[sbptr] = '^'; - refresh(); + zrefresh(); } if ((c = getkey(0)) == EOF) - feep(); + feep = 1; else goto ins; } else { @@ -830,7 +861,7 @@ doisearch(int dir) } ins: if (sbptr == PATH_MAX) { - feep(); + feep = 1; continue; } set_isrch_spot(top_spot++, hl, pos, cs, sbptr, dir, nomatch); @@ -841,7 +872,9 @@ doisearch(int dir) } sbuf[sbptr++] = c; } - handlefeep(); + if (feep) + handlefeep(zlenoargs); + feep = 0; } if (sbptr) { zfree(previous_search, previous_search_len); @@ -850,66 +883,69 @@ doisearch(int dir) } statusline = NULL; selectkeymap(okeymap, 1); + /* + * Don't allow unused characters provided as a string to the + * widget to overflow and be used as separated commands. + */ + if (savekeys >= 0 && kungetct > savekeys) + kungetct = savekeys; +} + +static Histent +infernexthist(Histent he, char **args) +{ + for (he = movehistent(he, -2, HIST_FOREIGN); + he; he = movehistent(he, -1, HIST_FOREIGN)) { + if (!metadiffer(he->text, (char *) line, ll)) + return movehistent(he, 1, HIST_FOREIGN); + } + return NULL; } /**/ -void -acceptandinfernexthistory(void) +int +acceptandinfernexthistory(char **args) { - int t0; - char *s; + Histent he; + if (!(he = infernexthist(hist_ring, args))) + return 1; + zpushnode(bufstack, ztrdup(he->text)); done = 1; - for (t0 = histline - 2;; t0--) { - if (!(s = qgetevent(t0))) - return; - if (!metadiffer(s, (char *) line, ll)) - break; - } - if (!(s = qgetevent(t0 + 1))) - return; - pushnode(bufstack, ztrdup(s)); - stackhist = t0 + 1; + stackhist = he->histnum; + return 0; } /**/ -void -infernexthistory(void) +int +infernexthistory(char **args) { - int t0; - char *s; + Histent he; - for (t0 = histline - 2;; t0--) { - if (!(s = qgetevent(t0))) { - feep(); - return; - } - if (! metadiffer(s, (char *) line, ll)) - break; - } - if (!(s = qgetevent(t0 + 1))) { - feep(); - return; - } - zle_goto_hist(t0 + 1); + if (!(he = infernexthist(quietgethist(histline), args))) + return 1; + zle_setline(he); + return 0; } /**/ -void -vifetchhistory(void) +int +vifetchhistory(char **args) { if (zmult < 0) - return; + return 1; if (histline == curhist) { if (!(zmod.flags & MOD_MULT)) { cs = ll; cs = findbol(); - return; + return 0; } } - if (!zle_goto_hist((zmod.flags & MOD_MULT) ? zmult : curhist) && - isset(HISTBEEP)) - feep(); + if (!zle_goto_hist((zmod.flags & MOD_MULT) ? zmult : curhist, 0, 0) && + isset(HISTBEEP)) { + return 1; + } + return 0; } /* the last vi search */ @@ -921,8 +957,8 @@ static int visrchsense; static int getvisrchstr(void) { - char *sbuf = halloc(80); - int sptr = 1, ret = 0, ssbuf = 80; + char *sbuf = zhalloc(80); + int sptr = 1, ret = 0, ssbuf = 80, feep = 0; Thingy cmd; char *okeymap = curkeymapname; @@ -930,13 +966,14 @@ getvisrchstr(void) zsfree(visrchstr); visrchstr = NULL; } + clearlist = 1; statusline = sbuf; sbuf[0] = (visrchsense == -1) ? '?' : '/'; selectkeymap("main", 1); while (sptr) { sbuf[sptr] = '_'; statusll = sptr + 1; - refresh(); + zrefresh(); if (!(cmd = getkeycmd()) || cmd == Th(z_sendbreak)) { ret = 0; break; @@ -946,9 +983,9 @@ getvisrchstr(void) cmd = Th(z_selfinsert); } if(cmd == Th(z_redisplay)) { - redisplay(); + redisplay(zlenoargs); } else if(cmd == Th(z_clearscreen)) { - clearscreen(); + clearscreen(zlenoargs); } else if(cmd == Th(z_acceptline) || cmd == Th(z_vicmdmode)) { sbuf[sptr] = 0; @@ -971,10 +1008,10 @@ getvisrchstr(void) } else if(cmd == Th(z_viquotedinsert) || cmd == Th(z_quotedinsert)) { if(cmd == Th(z_viquotedinsert)) { sbuf[sptr] = '^'; - refresh(); + zrefresh(); } if ((c = getkey(0)) == EOF) - feep(); + feep = 1; else goto ins; } else if(cmd == Th(z_selfinsertunmeta) || cmd == Th(z_selfinsert)) { @@ -985,15 +1022,17 @@ getvisrchstr(void) } ins: if(sptr == ssbuf - 1) { - char *newbuf = halloc(ssbuf *= 2); + char *newbuf = zhalloc(ssbuf *= 2); strcpy(newbuf, sbuf); statusline = sbuf = newbuf; } sbuf[sptr++] = c; } else { - feep(); + feep = 1; } - handlefeep(); + if (feep) + handlefeep(zlenoargs); + feep = 0; } statusline = NULL; selectkeymap(okeymap, 1); @@ -1001,68 +1040,89 @@ getvisrchstr(void) } /**/ -void -vihistorysearchforward(void) +int +vihistorysearchforward(char **args) { + if (*args) { + int ose = visrchsense, ret; + char *ost = visrchstr; + + visrchsense = 1; + visrchstr = *args; + ret = virepeatsearch(zlenoargs); + visrchsense = ose; + visrchstr = ost; + return ret; + } visrchsense = 1; if (getvisrchstr()) - virepeatsearch(); + return virepeatsearch(zlenoargs); + return 1; } /**/ -void -vihistorysearchbackward(void) +int +vihistorysearchbackward(char **args) { + if (*args) { + int ose = visrchsense, ret; + char *ost = visrchstr; + + visrchsense = -1; + visrchstr = *args; + ret = virepeatsearch(zlenoargs); + visrchsense = ose; + visrchstr = ost; + return ret; + } visrchsense = -1; if (getvisrchstr()) - virepeatsearch(); + return virepeatsearch(zlenoargs); + return 1; } /**/ -void -virepeatsearch(void) +int +virepeatsearch(char **args) { - int hl = histline, t0; + Histent he; + int t0; int n = zmult; char *s; - if (!visrchstr) { - feep(); - return; - } - if (!n) - return; - if (n < 0) { + if (!visrchstr) + return 1; + if (zmult < 0) { n = -n; visrchsense = -visrchsense; } t0 = strlen(visrchstr); - for (;;) { - hl += visrchsense; - if (!(s = zle_get_event(hl))) { - feep(); - return; - } - if (!metadiffer(s, (char *) line, ll)) - continue; - if (*visrchstr == '^') { - if (strncmp(s, visrchstr + 1, t0 - 1) != 0) - continue; - } else if (!hstrnstr(s, 0, visrchstr, t0, 1, 1)) + he = quietgethist(histline); + while ((he = movehistent(he, visrchsense, hist_skip_flags))) { + if (isset(HISTFINDNODUPS) && he->flags & HIST_DUP) continue; - if (--n <= 0) - break; + s = ZLETEXT(he); + if (metadiffer(s, (char *) line, ll) + && (*visrchstr == '^'? strncmp(s, visrchstr + 1, t0 - 1) == 0 + : hstrnstr(s, 0, visrchstr, t0, 1, 1) != 0)) { + if (--n <= 0) { + zle_setline(he); + return 0; + } + } } - zle_goto_hist(hl); + return 1; } /**/ -void -virevrepeatsearch(void) +int +virevrepeatsearch(char **args) { + int ret; visrchsense = -visrchsense; - virepeatsearch(); + ret = virepeatsearch(args); visrchsense = -visrchsense; + return ret; } /* Extra function added by A.R. Iano-Fletcher. */ @@ -1070,70 +1130,70 @@ virevrepeatsearch(void) /* history-beginning-search-backward */ /**/ -void -historybeginningsearchbackward(void) +int +historybeginningsearchbackward(char **args) { + Histent he; int cpos = cs; /* save cursor position */ - int hl = histline; int n = zmult; char *s; - if (!n) - return; - if (n < 0) { + if (zmult < 0) { + int ret; zmult = -n; - historybeginningsearchforward(); + ret = historybeginningsearchforward(args); zmult = n; - return; + return ret; } - for (;;) { - hl--; - if (!(s = zle_get_event(hl))) { - feep(); - return; - } + he = quietgethist(histline); + while ((he = movehistent(he, -1, hist_skip_flags))) { + if (isset(HISTFINDNODUPS) && he->flags & HIST_DUP) + continue; + s = ZLETEXT(he); if (metadiffer(s, (char *)line, cs) < 0 && - metadiffer(s, (char *)line, ll)) - if (--n <= 0) - break; + metadiffer(s, (char *)line, ll)) { + if (--n <= 0) { + zle_setline(he); + cs = cpos; + return 0; + } + } } - - zle_goto_hist(hl); - cs = cpos; + return 1; } /* Extra function added by A.R. Iano-Fletcher. */ /* history-beginning-search-forward */ /**/ -void -historybeginningsearchforward(void) +int +historybeginningsearchforward(char **args) { + Histent he; int cpos = cs; /* save cursor position */ - int hl = histline; int n = zmult; char *s; - if (!n) - return; - if (n < 0) { + if (zmult < 0) { + int ret; zmult = -n; - historybeginningsearchbackward(); + ret = historybeginningsearchbackward(args); zmult = n; - return; + return ret; } - for (;;) { - hl++; - if (!(s = zle_get_event(hl))) { - feep(); - return; + he = quietgethist(histline); + while ((he = movehistent(he, 1, hist_skip_flags))) { + if (isset(HISTFINDNODUPS) && he->flags & HIST_DUP) + continue; + s = ZLETEXT(he); + if (metadiffer(s, (char *)line, cs) < (he->histnum == curhist) && + metadiffer(s, (char *)line, ll)) { + if (--n <= 0) { + zle_setline(he); + cs = cpos; + return 0; + } } - if (metadiffer(s, (char *)line, cs) < (hl == curhist) && - metadiffer(s, (char *)line, ll)) - if (--n <= 0) - break; } - - zle_goto_hist(hl); - cs = cpos; + return 1; } |