mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-14 11:41:07 +02:00
fix scrolling in menu-selection with matches spanning multiple lines
This commit is contained in:
parent
7a53d36f39
commit
aa17f0db6d
4 changed files with 90 additions and 22 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2000-05-16 Sven Wischnowsky <wischnow@zsh.org>
|
||||||
|
|
||||||
|
* 11403(?): Completion/Core/_expand, Src/Zle/compcore.c,
|
||||||
|
Src/Zle/complist.c: fix scrolling in menu-selection with matches
|
||||||
|
spanning multiple lines
|
||||||
|
|
||||||
2000-05-16 Peter Stephenson <pws@cambridgesiliconradio.com>
|
2000-05-16 Peter Stephenson <pws@cambridgesiliconradio.com>
|
||||||
|
|
||||||
* pws: one hunk of 11381: Completion/Builtins/_vars_eq:
|
* pws: one hunk of 11381: Completion/Builtins/_vars_eq:
|
||||||
|
|
|
@ -108,9 +108,17 @@ if [[ -z "$compstate[insert]" ]] ;then
|
||||||
else
|
else
|
||||||
_tags all-expansions expansions original
|
_tags all-expansions expansions original
|
||||||
|
|
||||||
_requested all-expansions expl 'all expansions' &&
|
if _requested all-expansions expl 'all expansions'; then
|
||||||
compadd "$expl[@]" -UQ -qS "$suf" - "$exp"
|
local disp dstr
|
||||||
|
|
||||||
|
if [[ $#exp -ge COLUMNS ]]; then
|
||||||
|
disp=( -ld dstr )
|
||||||
|
dstr=( "${(r:COLUMNS-5:)exp} ..." )
|
||||||
|
else
|
||||||
|
disp=()
|
||||||
|
fi
|
||||||
|
compadd "$disp[@]" "$expl[@]" -UQ -qS "$suf" - "$exp"
|
||||||
|
fi
|
||||||
if [[ $#exp -gt 1 ]] && _requested expansions; then
|
if [[ $#exp -gt 1 ]] && _requested expansions; then
|
||||||
local i normal dir
|
local i normal dir
|
||||||
|
|
||||||
|
|
|
@ -507,6 +507,7 @@ after_complete(Hookdef dummy, Compldat dat)
|
||||||
if ((ret = runhookdef(MENUSTARTHOOK, (void *) &dat))) {
|
if ((ret = runhookdef(MENUSTARTHOOK, (void *) &dat))) {
|
||||||
menucmp = menuacc = 0;
|
menucmp = menuacc = 0;
|
||||||
if (ret == 2) {
|
if (ret == 2) {
|
||||||
|
fixsuffix();
|
||||||
cs = 0;
|
cs = 0;
|
||||||
foredel(ll);
|
foredel(ll);
|
||||||
inststr(origline);
|
inststr(origline);
|
||||||
|
|
|
@ -384,6 +384,7 @@ getcols(Listcols c)
|
||||||
static int noselect, mselect, inselect, mcol, mline, mcols, mlines, mmlen;
|
static int noselect, mselect, inselect, mcol, mline, mcols, mlines, mmlen;
|
||||||
static int selected, mlbeg = -1, mlend = 9999999, mscroll, mrestlines;
|
static int selected, mlbeg = -1, mlend = 9999999, mscroll, mrestlines;
|
||||||
static int mnew, mlastcols, mlastlines, mhasstat, mfirstl, mlastm;
|
static int mnew, mlastcols, mlastlines, mhasstat, mfirstl, mlastm;
|
||||||
|
static int mlprinted;
|
||||||
static char *mstatus, *mlistp;
|
static char *mstatus, *mlistp;
|
||||||
static Cmatch **mtab, **mmtabp;
|
static Cmatch **mtab, **mmtabp;
|
||||||
static Cmgroup *mgtab, *mgtabp;
|
static Cmgroup *mgtab, *mgtabp;
|
||||||
|
@ -533,7 +534,7 @@ clprintfmt(Listcols c, char *p, int ml)
|
||||||
static int
|
static int
|
||||||
clnicezputs(Listcols c, char *s, int ml)
|
clnicezputs(Listcols c, char *s, int ml)
|
||||||
{
|
{
|
||||||
int cc, i = 0, col = 0, ask;
|
int cc, i = 0, col = 0, ask, oml = ml;
|
||||||
char *t;
|
char *t;
|
||||||
|
|
||||||
initiscol(c);
|
initiscol(c);
|
||||||
|
@ -550,18 +551,22 @@ clnicezputs(Listcols c, char *s, int ml)
|
||||||
cc = *s++ ^ 32;
|
cc = *s++ ^ 32;
|
||||||
|
|
||||||
for (t = nicechar(cc); *t; t++) {
|
for (t = nicechar(cc); *t; t++) {
|
||||||
if (ml == mlend - 1 && col == columns - 1)
|
if (ml == mlend - 1 && col == columns - 1) {
|
||||||
|
mlprinted = ml - oml;
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
putc(*t, shout);
|
putc(*t, shout);
|
||||||
if (++col == columns) {
|
if (++col == columns) {
|
||||||
ml++;
|
ml++;
|
||||||
if (mscroll && !--mrestlines && (ask = asklistscroll(ml)))
|
if (mscroll && !--mrestlines && (ask = asklistscroll(ml))) {
|
||||||
|
mlprinted = ml - oml;
|
||||||
return ask;
|
return ask;
|
||||||
|
}
|
||||||
col = 0;
|
col = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mlprinted = ml - oml;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -727,8 +732,10 @@ compprintfmt(char *fmt, int n, int dopr, int doesc, int ml, int *stop)
|
||||||
|
|
||||||
if ((stat = !fmt)) {
|
if ((stat = !fmt)) {
|
||||||
if (mlbeg >= 0) {
|
if (mlbeg >= 0) {
|
||||||
if (!(fmt = mstatus))
|
if (!(fmt = mstatus)) {
|
||||||
|
mlprinted = 0;
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
cc = -1;
|
cc = -1;
|
||||||
} else
|
} else
|
||||||
fmt = mlistp;
|
fmt = mlistp;
|
||||||
|
@ -881,7 +888,7 @@ compprintfmt(char *fmt, int n, int dopr, int doesc, int ml, int *stop)
|
||||||
*stop = 1;
|
*stop = 1;
|
||||||
if (stat && n)
|
if (stat && n)
|
||||||
mfirstl = -1;
|
mfirstl = -1;
|
||||||
return l + (cc / columns);
|
return (mlprinted = l + (cc / columns));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -892,7 +899,7 @@ compprintfmt(char *fmt, int n, int dopr, int doesc, int ml, int *stop)
|
||||||
if (stat && n)
|
if (stat && n)
|
||||||
mfirstl = -1;
|
mfirstl = -1;
|
||||||
|
|
||||||
return l + (cc / columns);
|
return (mlprinted = l + (cc / columns));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is like zputs(), but allows scrolling. */
|
/* This is like zputs(), but allows scrolling. */
|
||||||
|
@ -932,7 +939,7 @@ compzputs(char const *s, int ml)
|
||||||
static int
|
static int
|
||||||
compnicezputs(char *s, int ml)
|
compnicezputs(char *s, int ml)
|
||||||
{
|
{
|
||||||
int c, col = 0, ask;
|
int c, col = 0, ask, oml = ml;
|
||||||
char *t;
|
char *t;
|
||||||
|
|
||||||
while ((c = *s++)) {
|
while ((c = *s++)) {
|
||||||
|
@ -946,18 +953,22 @@ compnicezputs(char *s, int ml)
|
||||||
c = *s++ ^ 32;
|
c = *s++ ^ 32;
|
||||||
|
|
||||||
for (t = nicechar(c); *t; t++) {
|
for (t = nicechar(c); *t; t++) {
|
||||||
if (ml == mlend - 1 && col == columns - 1)
|
if (ml == mlend - 1 && col == columns - 1) {
|
||||||
|
mlprinted = ml - oml;
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
putc(*t, shout);
|
putc(*t, shout);
|
||||||
if (++col == columns) {
|
if (++col == columns) {
|
||||||
ml++;
|
ml++;
|
||||||
if (mscroll && !--mrestlines && (ask = asklistscroll(ml)))
|
if (mscroll && !--mrestlines && (ask = asklistscroll(ml))) {
|
||||||
|
mlprinted = ml - oml;
|
||||||
return ask;
|
return ask;
|
||||||
|
}
|
||||||
col = 0;
|
col = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mlprinted = ml - oml;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1024,6 +1035,14 @@ compprintlist(int showall)
|
||||||
mfirstl = ml;
|
mfirstl = ml;
|
||||||
l = compprintfmt((*e)->str, (*e)->count, dolist(ml), 1,
|
l = compprintfmt((*e)->str, (*e)->count, dolist(ml), 1,
|
||||||
ml, &stop);
|
ml, &stop);
|
||||||
|
if (mselect >= 0) {
|
||||||
|
int mm = (mcols * ml), i;
|
||||||
|
|
||||||
|
for (i = mcols; i--; ) {
|
||||||
|
mtab[mm + i] = NULL;
|
||||||
|
mgtab[mm + i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (stop)
|
if (stop)
|
||||||
goto end;
|
goto end;
|
||||||
if (!lasttype && ml >= mlbeg) {
|
if (!lasttype && ml >= mlbeg) {
|
||||||
|
@ -1035,8 +1054,8 @@ compprintlist(int showall)
|
||||||
lastp = NULL;
|
lastp = NULL;
|
||||||
lastused = 1;
|
lastused = 1;
|
||||||
}
|
}
|
||||||
ml += l;
|
ml += mlprinted;
|
||||||
if (dolistcl(ml) && cl >= 0 && (cl -= l) <= 1) {
|
if (dolistcl(ml) && cl >= 0 && (cl -= mlprinted) <= 1) {
|
||||||
cl = -1;
|
cl = -1;
|
||||||
if (tccan(TCCLEAREOD))
|
if (tccan(TCCLEAREOD))
|
||||||
tcout(TCCLEAREOD);
|
tcout(TCCLEAREOD);
|
||||||
|
@ -1155,6 +1174,12 @@ compprintlist(int showall)
|
||||||
printed++;
|
printed++;
|
||||||
if (clprintm(g, p, 0, ml, 1, 0, NULL, NULL))
|
if (clprintm(g, p, 0, ml, 1, 0, NULL, NULL))
|
||||||
goto end;
|
goto end;
|
||||||
|
ml += mlprinted;
|
||||||
|
if (dolistcl(ml) && (cl -= mlprinted) <= 1) {
|
||||||
|
cl = -1;
|
||||||
|
if (tccan(TCCLEAREOD))
|
||||||
|
tcout(TCCLEAREOD);
|
||||||
|
}
|
||||||
pnl = 1;
|
pnl = 1;
|
||||||
}
|
}
|
||||||
if (!mnew && ml > mlend)
|
if (!mnew && ml > mlend)
|
||||||
|
@ -1220,6 +1245,12 @@ compprintlist(int showall)
|
||||||
|
|
||||||
if (dolist(ml))
|
if (dolist(ml))
|
||||||
printed++;
|
printed++;
|
||||||
|
ml += mlprinted;
|
||||||
|
if (dolistcl(ml) && (cl -= mlprinted) < 1) {
|
||||||
|
cl = -1;
|
||||||
|
if (tccan(TCCLEAREOD))
|
||||||
|
tcout(TCCLEAREOD);
|
||||||
|
}
|
||||||
if (mfirstl < 0)
|
if (mfirstl < 0)
|
||||||
mfirstl = ml;
|
mfirstl = ml;
|
||||||
|
|
||||||
|
@ -1321,6 +1352,7 @@ clprintm(Cmgroup g, Cmatch *mp, int mc, int ml, int lastc, int width,
|
||||||
putc(' ', shout);
|
putc(' ', shout);
|
||||||
zcoff();
|
zcoff();
|
||||||
}
|
}
|
||||||
|
mlprinted = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
m = *mp;
|
m = *mp;
|
||||||
|
@ -1334,8 +1366,10 @@ clprintm(Cmgroup g, Cmatch *mp, int mc, int ml, int lastc, int width,
|
||||||
mgtab[mm + i] = g;
|
mgtab[mm + i] = g;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!dolist(ml))
|
if (!dolist(ml)) {
|
||||||
|
mlprinted = printfmt(m->disp, 0, 0, 0) / columns;
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
if (m->gnum == mselect) {
|
if (m->gnum == mselect) {
|
||||||
int mm = (mcols * ml);
|
int mm = (mcols * ml);
|
||||||
mline = ml;
|
mline = ml;
|
||||||
|
@ -1377,8 +1411,10 @@ clprintm(Cmgroup g, Cmatch *mp, int mc, int ml, int lastc, int width,
|
||||||
mgtab[mx + mm + i] = g;
|
mgtab[mx + mm + i] = g;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!dolist(ml))
|
if (!dolist(ml)) {
|
||||||
|
mlprinted = niceztrlen(m->disp ? m->disp : m->str) / columns;
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
if (m->gnum == mselect) {
|
if (m->gnum == mselect) {
|
||||||
int mm = mcols * ml;
|
int mm = mcols * ml;
|
||||||
|
|
||||||
|
@ -1406,6 +1442,7 @@ clprintm(Cmgroup g, Cmatch *mp, int mc, int ml, int lastc, int width,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
len = niceztrlen(m->disp ? m->disp : m->str);
|
len = niceztrlen(m->disp ? m->disp : m->str);
|
||||||
|
mlprinted = len / columns;
|
||||||
|
|
||||||
if (isset(LISTTYPES) && buf) {
|
if (isset(LISTTYPES) && buf) {
|
||||||
if (m->gnum != mselect) {
|
if (m->gnum != mselect) {
|
||||||
|
@ -1571,7 +1608,7 @@ domenuselect(Hookdef dummy, Chdata dat)
|
||||||
Thingy cmd;
|
Thingy cmd;
|
||||||
Menustack u = NULL;
|
Menustack u = NULL;
|
||||||
int i = 0, acc = 0, wishcol = 0, setwish = 0, oe = onlyexpl, wasnext = 0;
|
int i = 0, acc = 0, wishcol = 0, setwish = 0, oe = onlyexpl, wasnext = 0;
|
||||||
int space, lbeg = 0, step = 1, wrap;
|
int space, lbeg = 0, step = 1, wrap, pl = nlnct;
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
if (fdat || (dummy && (!(s = getsparam("MENUSELECT")) ||
|
if (fdat || (dummy && (!(s = getsparam("MENUSELECT")) ||
|
||||||
|
@ -1620,11 +1657,13 @@ domenuselect(Hookdef dummy, Chdata dat)
|
||||||
if (y < mlines)
|
if (y < mlines)
|
||||||
mline = y;
|
mline = y;
|
||||||
}
|
}
|
||||||
space = lines - nlnct - mhasstat;
|
space = lines - pl - mhasstat;
|
||||||
while (mline < mlbeg)
|
while (mline < mlbeg)
|
||||||
if ((mlbeg -= step) < 0)
|
if ((mlbeg -= step) < 0)
|
||||||
mlbeg = 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) {
|
if (mlbeg && lbeg != mlbeg) {
|
||||||
Cmatch **p = mtab + ((mlbeg - 1) * columns), **q;
|
Cmatch **p = mtab + ((mlbeg - 1) * columns), **q;
|
||||||
int c;
|
int c;
|
||||||
|
@ -1639,10 +1678,24 @@ domenuselect(Hookdef dummy, Chdata dat)
|
||||||
mlbeg--;
|
mlbeg--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
while (mline >= mlbeg + space)
|
while (mline >= mlbeg + space)
|
||||||
if ((mlbeg += step) + space > mlines)
|
if ((mlbeg += step) + space > mlines)
|
||||||
mlbeg = mlines - space;
|
mlbeg = mlines - space;
|
||||||
|
if (lbeg != mlbeg) {
|
||||||
|
Cmatch **p = mtab + (mlbeg * columns), **q;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
while (mlbeg < mlines) {
|
||||||
|
for (q = p, c = columns; c; q++, c--)
|
||||||
|
if (*q)
|
||||||
|
break;
|
||||||
|
if (c)
|
||||||
|
break;
|
||||||
|
p += columns;
|
||||||
|
mlbeg++;
|
||||||
|
}
|
||||||
|
}
|
||||||
lbeg = mlbeg;
|
lbeg = mlbeg;
|
||||||
onlyexpl = 0;
|
onlyexpl = 0;
|
||||||
showinglist = -2;
|
showinglist = -2;
|
||||||
|
@ -1877,7 +1930,7 @@ domenuselect(Hookdef dummy, Chdata dat)
|
||||||
cmd == Th(z_viforwardword) ||
|
cmd == Th(z_viforwardword) ||
|
||||||
cmd == Th(z_viforwardwordend) ||
|
cmd == Th(z_viforwardwordend) ||
|
||||||
cmd == Th(z_forwardword)) {
|
cmd == Th(z_forwardword)) {
|
||||||
int i = lines - nlnct - 1, oi = i, ll = 0;
|
int i = lines - pl - 1, oi = i, ll = 0;
|
||||||
Cmatch **lp = NULL;
|
Cmatch **lp = NULL;
|
||||||
|
|
||||||
if (mline == mlines - 1)
|
if (mline == mlines - 1)
|
||||||
|
@ -1904,7 +1957,7 @@ domenuselect(Hookdef dummy, Chdata dat)
|
||||||
} else if (cmd == Th(z_emacsbackwardword) ||
|
} else if (cmd == Th(z_emacsbackwardword) ||
|
||||||
cmd == Th(z_vibackwardword) ||
|
cmd == Th(z_vibackwardword) ||
|
||||||
cmd == Th(z_backwardword)) {
|
cmd == Th(z_backwardword)) {
|
||||||
int i = lines - nlnct - 1, oi = i, ll = 0;
|
int i = lines - pl - 1, oi = i, ll = 0;
|
||||||
Cmatch **lp = NULL;
|
Cmatch **lp = NULL;
|
||||||
|
|
||||||
if (!mline)
|
if (!mline)
|
||||||
|
|
Loading…
Reference in a new issue