From 8564aa5c0d77999138e4f46b496e2bbc2f48f718 Mon Sep 17 00:00:00 2001 From: Bart Schaefer Date: Tue, 30 May 2000 03:43:27 +0000 Subject: Wayne: Fix two history bugs that were causing the failure of `print -s'. --- ChangeLog | 5 +++++ Src/Modules/parameter.c | 4 ++-- Src/Zle/compctl.c | 2 +- Src/Zle/zle_main.c | 3 +++ Src/hist.c | 39 +++++++++++++++++++-------------------- 5 files changed, 30 insertions(+), 23 deletions(-) diff --git a/ChangeLog b/ChangeLog index 272383a29..2df4a4025 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2000-05-29 Bart Schaefer + * Wayne Davison: 11641: Src/hist.c, Src/Modules/parameter.c, + Src/Zle/compctl.c, Src/Zle/zle_main.c: Make sure `curline' has + sane values at more points during history manipulation, so that + "print -s" from a ZLE widget doesn't cause confusion. + * unposted: Completion/Core/_path_files: Add a comment to explain the change made in 11635. diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c index e46b14108..55fca09ac 100644 --- a/Src/Modules/parameter.c +++ b/Src/Modules/parameter.c @@ -1059,7 +1059,7 @@ scanpmhistory(HashTable ht, ScanFunc func, int flags) { struct param pm; int i = addhistnum(curhist, -1, HIST_FOREIGN); - Histent he = quietgethistent(i, GETHIST_UPWARD); + Histent he = gethistent(i, GETHIST_UPWARD); char buf[40]; pm.flags = PM_SCALAR | PM_READONLY; @@ -1096,7 +1096,7 @@ histwgetfn(Param pm) LinkList l = newlinklist(), ll; LinkNode n; int i = addhistnum(curhist, -1, HIST_FOREIGN), iw; - Histent he = quietgethistent(i, GETHIST_UPWARD); + Histent he = gethistent(i, GETHIST_UPWARD); ll = bufferwords(NULL, NULL, NULL); for (n = firstnode(ll); n; incnode(n)) diff --git a/Src/Zle/compctl.c b/Src/Zle/compctl.c index b443b7da5..0e1dc088c 100644 --- a/Src/Zle/compctl.c +++ b/Src/Zle/compctl.c @@ -3688,7 +3688,7 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd) Patprog pprogc = NULL; char *e, *h, hpatsav; int i = addhistnum(curhist,-1,HIST_FOREIGN), n = cc->hnum; - Histent he = quietgethistent(i, GETHIST_UPWARD); + Histent he = gethistent(i, GETHIST_UPWARD); /* Parse the pattern, if it isn't the null string. */ if (*(cc->hpat)) { diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c index a19f9b5db..49b682c18 100644 --- a/Src/Zle/zle_main.c +++ b/Src/Zle/zle_main.c @@ -641,8 +641,11 @@ execzlefunc(Thingy func, char **args) if(!(wflags & ZLE_LASTCOL)) lastcol = -1; if (wflags & WIDGET_NCOMP) { + int atcurhist = histline == curhist; compwidget = w; ret = completecall(args); + if (atcurhist) + histline = curhist; } else ret = w->u.fn(args); if (!(wflags & ZLE_NOTCOMMAND)) diff --git a/Src/hist.c b/Src/hist.c index a3d8fa7ef..3b3757b8d 100644 --- a/Src/hist.c +++ b/Src/hist.c @@ -853,6 +853,7 @@ movehistent(Histent he, int n, int xflags) if (!(he->flags & xflags)) n--; } + checkcurline(he); return he; } @@ -880,27 +881,26 @@ gethistent(int ev, int nearmatch) return NULL; if (ev - hist_ring->down->histnum < hist_ring->histnum - ev) { - for (he = hist_ring->down; he->histnum <= ev; he = he->down) { - if (he->histnum == ev) - return he; + for (he = hist_ring->down; he->histnum < ev; he = he->down) ; + if (nearmatch == 0) { + if (he->histnum != ev) + return NULL; } - if (nearmatch < 0) - return up_histent(he); - if (nearmatch > 0) - return he; + else if (nearmatch < 0 && (he = up_histent(he)) == NULL) + return NULL; } else { - for (he = hist_ring; he->histnum >= ev; he = he->up) { - if (he->histnum == ev) - return he; + for (he = hist_ring; he->histnum > ev; he = he->up) ; + if (nearmatch == 0) { + if (he->histnum != ev) + return NULL; } - if (nearmatch < 0) - return he; - if (nearmatch > 0) - return down_histent(he); + else if (nearmatch > 0 && (he = down_histent(he)) == NULL) + return NULL; } - return NULL; + checkcurline(he); + return he; } /**/ @@ -1452,22 +1452,21 @@ convamps(char *out, char *in, int inlen) } /**/ -mod_export Histent -quietgethistent(int ev, int nearmatch) +mod_export void +checkcurline(Histent he) { - if (ev == curhist && (histactive & HA_ACTIVE)) { + if (he->histnum == curhist && (histactive & HA_ACTIVE)) { curline.text = chline; curline.nwords = chwordpos/2; curline.words = chwords; } - return gethistent(ev, nearmatch); } /**/ mod_export Histent quietgethist(int ev) { - return quietgethistent(ev, GETHIST_EXACT); + return gethistent(ev, GETHIST_EXACT); } /**/ -- cgit 1.4.1