1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-29 06:51:03 +02:00

fix for a-a-m-c in menu selection; scroll explanations onto screen again (11487)

This commit is contained in:
Sven Wischnowsky 2000-05-22 08:47:30 +00:00
parent 3f9633e006
commit 007cfdff55
3 changed files with 60 additions and 34 deletions

View file

@ -1,3 +1,9 @@
2000-05-22 Sven Wischnowsky <wischnow@zsh.org>
* 11487: Completion/Core/_expand, Src/Zle/complist.c: fix for
a-a-m-c in menu selection; scroll explanations onto screen again
when cursor comes near them
2000-05-21 Bart Schaefer <schaefer@zsh.org>
* unposted: Doc/Zsh/options.yo: Missing () in a tt().

View file

@ -111,7 +111,7 @@ else
if _requested all-expansions expl 'all expansions'; then
local disp dstr
if [[ $#exp -ge COLUMNS ]]; then
if [[ "${#${exp}}" -ge COLUMNS ]]; then
disp=( -ld dstr )
dstr=( "${(r:COLUMNS-5:)exp} ..." )
else

View file

@ -390,6 +390,11 @@ static Cmatch **mtab, **mmtabp;
static Cmgroup *mgtab, *mgtabp;
static struct listcols mcolors;
/* Used in mtab/mgtab, for explanations. */
#define mtexpl ((Cmatch *) 1)
#define mgexpl ((Cmgroup) 1)
/* Information for in-string colours. */
static int nrefs;
@ -977,7 +982,7 @@ static int
compprintlist(int showall)
{
static int lasttype = 0, lastbeg = 0, lastml = 0;
static lastn = 0, lastnl = 0;
static int lastn = 0, lastnl = 0, lastnlnct = -1;
static Cmgroup lastg = NULL;
static Cmatch *lastp = NULL;
static Cexpl *lastexpl = NULL;
@ -994,9 +999,11 @@ compprintlist(int showall)
lastg = NULL;
lastexpl = NULL;
lastml = 0;
lastnlnct = -1;
}
cl = (listdat.nlines > lines - nlnct - mhasstat ?
lines - nlnct - mhasstat : listdat.nlines) - 1;
lines - nlnct - mhasstat : listdat.nlines) - (lastnlnct > nlnct);
lastnlnct = nlnct;
mrestlines = lines - 1;
if (cl < 2) {
@ -1039,8 +1046,8 @@ compprintlist(int showall)
int mm = (mcols * ml), i;
for (i = mcols; i--; ) {
mtab[mm + i] = NULL;
mgtab[mm + i] = NULL;
mtab[mm + i] = mtexpl;
mgtab[mm + i] = mgexpl;
}
}
if (stop)
@ -1563,8 +1570,8 @@ adjust_mcol(int wish, Cmatch ***tabp, Cmgroup **grp)
tab -= mcol;
for (p = wish; p >= 0 && !tab[p]; p--);
for (n = wish; n < mcols && !tab[n]; n++);
for (p = wish; p >= 0 && (!tab[p] || tab[p] == mtexpl); p--);
for (n = wish; n < mcols && (!tab[n] || tab[n] == mtexpl); n++);
if (n == mcols)
n = -1;
@ -1597,6 +1604,8 @@ struct menustack {
int cs, acc, nmatches, mline, mlbeg;
struct menuinfo info;
Cmgroup amatches, pmatches, lastmatches, lastlmatches;
char *origline;
int origcs, origll;
};
static int
@ -1608,7 +1617,7 @@ domenuselect(Hookdef dummy, Chdata dat)
Thingy cmd;
Menustack u = NULL;
int i = 0, acc = 0, wishcol = 0, setwish = 0, oe = onlyexpl, wasnext = 0;
int space, lbeg = 0, step = 1, wrap, pl = nlnct;
int space, lbeg = 0, step = 1, wrap, pl = nlnct, broken = 0;
char *s;
if (fdat || (dummy && (!(s = getsparam("MENUSELECT")) ||
@ -1649,7 +1658,7 @@ domenuselect(Hookdef dummy, Chdata dat)
for (y = 0; y < mlines; y++) {
for (x = mcols; x; x--, p++)
if (*p && **p && mselect == (**p)->gnum)
if (*p && *p != mtexpl && **p && mselect == (**p)->gnum)
break;
if (x)
break;
@ -1657,20 +1666,17 @@ domenuselect(Hookdef dummy, Chdata dat)
if (y < mlines)
mline = y;
}
space = lines - pl - mhasstat;
while (mline < mlbeg)
if ((mlbeg -= step) < 0)
mlbeg = 0;
#if 0
/* Attempt to ensure that the explanations for groups are scrolled
* in. Doesn't work because there are other NULL fields. */
if (mlbeg && lbeg != mlbeg) {
Cmatch **p = mtab + ((mlbeg - 1) * columns), **q;
int c;
while (mlbeg) {
for (q = p, c = columns; c; q++, c--)
if (*q)
if (*q && *q != mtexpl)
break;
if (c)
break;
@ -1678,10 +1684,10 @@ domenuselect(Hookdef dummy, Chdata dat)
mlbeg--;
}
}
#endif
while (mline >= mlbeg + space)
if ((mlbeg += step) + space > mlines)
mlbeg = mlines - space;
if ((space = lines - pl - mhasstat))
while (mline >= mlbeg + space)
if ((mlbeg += step) + space > mlines)
mlbeg = mlines - space;
if (lbeg != mlbeg) {
Cmatch **p = mtab + (mlbeg * columns), **q;
int c;
@ -1701,8 +1707,10 @@ domenuselect(Hookdef dummy, Chdata dat)
showinglist = -2;
zrefresh();
inselect = 1;
if (noselect)
if (noselect) {
broken = 1;
break;
}
selected = 1;
if (!i) {
i = mcols * mlines;
@ -1755,6 +1763,9 @@ domenuselect(Hookdef dummy, Chdata dat)
s->nbrbeg = nbrbeg;
s->nbrend = nbrend;
s->nmatches = nmatches;
s->origline = origline;
s->origcs = origcs;
s->origll = origll;
menucmp = menuacc = hasoldlist = 0;
fixsuffix();
validlist = 0;
@ -1792,6 +1803,9 @@ domenuselect(Hookdef dummy, Chdata dat)
s->nbrbeg = nbrbeg;
s->nbrend = nbrend;
s->nmatches = nmatches;
s->origline = origline;
s->origcs = origcs;
s->origll = origll;
accept_last();
do_menucmp(0);
mselect = (*(minfo.cur))->gnum;
@ -1805,7 +1819,10 @@ domenuselect(Hookdef dummy, Chdata dat)
break;
if (mcol != mcols)
break;
mline++;
if (++mline == mlines) {
mline = 0;
p -= mlines * mcols;
}
} while (mline != ol);
if (*p != minfo.cur) {
noselect = clearlist = listshown = 1;
@ -1847,6 +1864,9 @@ domenuselect(Hookdef dummy, Chdata dat)
brend = dupbrinfo(u->brend, &lastbrend, 0);
nbrbeg = u->nbrbeg;
nbrend = u->nbrend;
origline = u->origline;
origcs = u->origcs;
origll = u->origll;
u = u->prev;
clearlist = 1;
@ -1888,7 +1908,7 @@ domenuselect(Hookdef dummy, Chdata dat)
}
if (adjust_mcol(wishcol, &p, NULL))
continue;
} while (!*p);
} while (!*p || *p == mtexpl);
if (wrap == 1)
goto right;
@ -1922,7 +1942,7 @@ domenuselect(Hookdef dummy, Chdata dat)
}
if (adjust_mcol(wishcol, &p, NULL))
continue;
} while (!*p);
} while (!*p || *p == mtexpl);
if (wrap == 1)
goto left;
@ -1946,7 +1966,7 @@ domenuselect(Hookdef dummy, Chdata dat)
}
if (adjust_mcol(wishcol, &p, NULL))
continue;
if (*p) {
if (*p && *p != mtexpl) {
i--;
lp = p;
ll = mline;
@ -1973,7 +1993,7 @@ domenuselect(Hookdef dummy, Chdata dat)
}
if (adjust_mcol(wishcol, &p, NULL))
continue;
if (*p) {
if (*p || *p != mtexpl) {
i--;
lp = p;
ll = mline;
@ -1994,7 +2014,7 @@ domenuselect(Hookdef dummy, Chdata dat)
p -= mcols;
if (adjust_mcol(wishcol, &p, NULL))
continue;
if (*p) {
if (*p && *p != mtexpl) {
lp = p;
ll = mline;
}
@ -2014,7 +2034,7 @@ domenuselect(Hookdef dummy, Chdata dat)
p += mcols;
if (adjust_mcol(wishcol, &p, NULL))
continue;
if (*p) {
if (*p && *p != mtexpl) {
lp = p;
ll = mline;
}
@ -2046,7 +2066,7 @@ domenuselect(Hookdef dummy, Chdata dat)
mcol++;
p++;
}
} while (!*p || (mcol != omcol && *p == *op));
} while (!*p || *p == mtexpl || (mcol != omcol && *p == *op));
wishcol = mcol;
if (wrap == 2)
@ -2076,7 +2096,7 @@ domenuselect(Hookdef dummy, Chdata dat)
mcol--;
p--;
}
} while (!*p || (mcol != omcol && *p == *op));
} while (!*p || *p == mtexpl || (mcol != omcol && *p == *op));
wishcol = mcol;
if (wrap == 2)
@ -2087,7 +2107,7 @@ domenuselect(Hookdef dummy, Chdata dat)
cmd == Th(z_vibeginningofline)) {
p -= mcol;
mcol = 0;
while (!*p) {
while (!*p || *p == mtexpl) {
mcol++;
p++;
}
@ -2098,7 +2118,7 @@ domenuselect(Hookdef dummy, Chdata dat)
cmd == Th(z_viendofline)) {
p += mcols - mcol - 1;
mcol = mcols - 1;
while (!*p) {
while (!*p || *p == mtexpl) {
mcol--;
p--;
}
@ -2120,7 +2140,7 @@ domenuselect(Hookdef dummy, Chdata dat)
}
if (adjust_mcol(wishcol, &p, &pg))
continue;
} while (ol != mline && (*pg == g || !*pg));
} while (ol != mline && (*pg == g || !*pg || *pg == mgexpl));
} else if (cmd == Th(z_vibackwardblankword)) {
Cmgroup g = *pg;
int ol = mline;
@ -2137,7 +2157,7 @@ domenuselect(Hookdef dummy, Chdata dat)
}
if (adjust_mcol(wishcol, &p, &pg))
continue;
} while (ol != mline && (*pg == g || !*pg));
} while (ol != mline && (*pg == g || !*pg || *pg == mgexpl));
} else if (cmd == Th(z_completeword) ||
cmd == Th(z_expandorcomplete) ||
cmd == Th(z_expandorcompleteprefix) ||
@ -2184,7 +2204,7 @@ domenuselect(Hookdef dummy, Chdata dat)
menucmp = lastambig = hasoldlist = 0;
do_single(*(minfo.cur));
}
if (wasnext) {
if (wasnext || broken) {
menucmp = 2;
showinglist = -2;
minfo.asked = 0;
@ -2199,7 +2219,7 @@ domenuselect(Hookdef dummy, Chdata dat)
mlbeg = -1;
fdat = NULL;
return (dat ? (acc ? 1 : 2) : (!noselect ^ acc));
return ((dat && !broken) ? (acc ? 1 : 2) : (!noselect ^ acc));
}
/* The widget function. */