summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Src/Modules/parameter.c4
-rw-r--r--Src/Zle/compctl.c2
-rw-r--r--Src/Zle/zle_main.c3
-rw-r--r--Src/hist.c39
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 <schaefer@zsh.org>
+ * 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);
}
/**/