1
0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-11-10 10:34:47 +01:00
This commit is contained in:
Sven Wischnowsky 2001-07-27 12:56:57 +00:00
parent 0822510626
commit 4da5c1b2e0
4 changed files with 215 additions and 221 deletions

@ -1,3 +1,10 @@
2001-07-27 Sven Wischnowsky <wischnow@zsh.org>
* 15509: Completion/Base/Utility/_describe, Src/Zle/compresult.c,
Src/Zle/computil.c: improve grouped listings some more, so that
TABs walk along the first column first; improve list_packed
code
2001-07-27 Peter Stephenson <pws@csr.com>
* 15508: Completion/Unix/Command/_cvs: cvs tag told you it was

@ -78,9 +78,9 @@ while _tags; do
fi
if [[ -n $_mats ]]; then
compadd "$_opts[@]" "$_expl[@]" -O $_strs -D $_mats -s $_strs
compadd "$_opts[@]" "${(@)_expl:/-J/-2V}" -O $_strs -D $_mats -s $_strs
else
compadd "$_opts[@]" "$_expl[@]" -O $_strs -a $_strs
compadd "$_opts[@]" "${(@)_expl:/-J/-2V}" -O $_strs -a $_strs
fi
done
set - "$_argv[@]"
@ -97,6 +97,7 @@ while _tags; do
while compdescribe -g csl2 _args _tmpm _tmpd; do
compstate[list]="$csl $csl2"
[[ -n "$csl2" ]] && compstate[list]="${compstate[list]:s/rows//}"
compadd "$_args[@]" -d _tmpd -a _tmpm && _ret=0
done

@ -1588,214 +1588,142 @@ calclist(int showall)
ylens[i] = ztrlen(*pp) + add;
if (g->flags & CGF_ROWS) {
int count, tcol, first, maxlines = 0, llines;
int beg = columns / g->shortest, end = g->cols;
int nth, tcol, len;
while (1) {
tcols = (beg + end) >> 1;
for (tcols = columns / (g->shortest + add); tcols > g->cols;
tcols--) {
for (nth = first = maxlen = width = maxlines =
llines = tcol = 0,
count = g->dcount;
count > 0; count--) {
if (ylens[nth] > maxlen)
maxlen = ylens[nth];
nth += tcols;
tlines++;
if (nth >= g->dcount) {
if ((width += maxlen) >= columns)
break;
ws[tcol++] = maxlen;
maxlen = 0;
nth = ++first;
if (llines > maxlines)
maxlines = llines;
llines = 0;
}
}
if (nth < yl) {
ws[tcol++] = maxlen;
width += maxlen;
}
if (!count && width <= columns &&
(tcols <= 0 || beg == end))
break;
memset(ws, 0, tcols * sizeof(int));
if (beg == end) {
beg--;
end--;
} else if (width < columns) {
if ((end = tcols) == beg - 1)
end++;
} else {
if ((beg = tcols) - 1 == end)
end++;
}
}
if (tcols > g->cols)
tlines = maxlines;
for (width = nth = tcol = 0, tlines = 1;
width < columns && nth < g->dcount;
nth++, tcol++) {
m = *p;
if (tcol == tcols) {
tcol = 0;
tlines++;
}
len = ylens[nth];
if (len > ws[tcol]) {
width += len - ws[tcol];
ws[tcol] = len;
}
}
if (width < columns)
break;
}
} else {
int beg = ((g->totl + columns) / columns);
int end = g->lins;
int nth, tcol, tline, len;
while (1) {
tlines = (beg + end) >> 1;
for (tcols = columns / (g->shortest + add); tcols > g->cols;
tcols--) {
for (pp = g->ylist, nth = tline = width =
maxlen = tcols = 0;
*pp; pp++) {
if (ylens[nth] > maxlen)
maxlen = ylens[nth];
if (++tline == tlines) {
if ((width += maxlen) >= columns)
break;
ws[tcols++] = maxlen;
maxlen = tline = 0;
}
nth++;
}
if (tline) {
ws[tcols++] = maxlen;
width += maxlen;
}
if (nth == yl && width <= columns &&
(beg == end || tlines >= g->lins))
break;
if ((tlines = (g->dcount + tcols - 1) / tcols) <= 0)
tlines = 1;
if (beg == end) {
beg++;
end++;
} else if (width < columns) {
if ((end = tlines) == beg + 1)
end--;
} else {
if ((beg = tlines) + 1 == end)
end--;
}
}
if (tlines > g->lins)
tlines = g->lins;
memset(ws, 0, tcols * sizeof(int));
for (width = nth = tcol = tline = 0;
width < columns && nth < g->dcount;
nth++, tline++) {
m = *p;
if (tline == tlines) {
tcol++;
tline = 0;
}
if (tcol == tcols) {
tcol = 0;
tlines++;
}
len = ylens[nth];
if (len > ws[tcol]) {
width += len - ws[tcol];
ws[tcol] = len;
}
}
if (width < columns)
break;
}
}
}
} else if (g->width) {
if (g->flags & CGF_ROWS) {
int addlen, count, tcol, maxlines = 0, llines, i;
int beg = columns / g->shortest, end = g->cols, fe = 1;
Cmatch *first;
int nth, tcol, len;
while (1) {
tcols = (beg + end) >> 1;
for (tcols = columns / (g->shortest + add); tcols > g->cols;
tcols--) {
p = first = skipnolist(g->matches, showall);
for (maxlen = width = maxlines = llines = tcol = 0,
count = g->dcount;
count > 0; count--) {
m = *p;
addlen = (mlens[m->gnum] +
(tcol == tcols - 1 ? 0 : add));
if (addlen > maxlen)
maxlen = addlen;
for (i = tcols; i && *p; i--)
p = skipnolist(p + 1, showall);
memset(ws, 0, tcols * sizeof(int));
llines++;
if (!*p) {
if (llines > maxlines)
maxlines = llines;
llines = 0;
for (width = nth = tcol = 0, tlines = 1,
p = skipnolist(g->matches, showall);
*p && width < columns && nth < g->dcount;
nth++, p = skipnolist(p + 1, showall), tcol++) {
if ((width += maxlen) >= columns)
break;
ws[tcol++] = maxlen;
maxlen = 0;
m = *p;
p = first = skipnolist(first + 1, showall);
}
}
if (tlines) {
ws[tcol++] = maxlen;
width += maxlen;
}
if (!count && width <= columns &&
(tcols <= 0 || beg == end))
break;
if (beg == end) {
if (fe) {
beg += 2;
end += 2;
fe = 0;
} else {
beg--;
end--;
if (tcol == tcols) {
tcol = 0;
tlines++;
}
len = (mlens[m->gnum] +
(tcol == tcols - 1 ? 0 : add));
if (len > ws[tcol]) {
width += len - ws[tcol];
ws[tcol] = len;
}
} else if (width < columns) {
if ((end = tcols) == beg - 1)
end++;
} else {
if ((beg = tcols) - 1 == end)
end++;
}
}
if (tcols > g->cols)
tlines = maxlines;
if (width < columns)
break;
}
} else {
int addlen;
int smask = ((showall ? 0 : (CMF_NOLIST | CMF_MULT)) |
CMF_HIDE);
int beg = ((g->totl + columns) / columns);
int end = g->lins, fe = 1;
int nth, tcol, tline, len;
while (1) {
tlines = (beg + end) >> 1;
for (tcols = columns / (g->shortest + add); tcols > g->cols;
tcols--) {
for (p = g->matches, nth = tline = width =
maxlen = tcols = 0;
(m = *p); p++) {
if (!(m->flags &
(m->disp ? (CMF_DISPLINE | CMF_HIDE) :
smask))) {
addlen = mlens[m->gnum] + add;
if (addlen > maxlen)
maxlen = addlen;
if (++tline == tlines) {
if ((width += maxlen) >= columns)
break;
ws[tcols++] = maxlen;
maxlen = tline = 0;
}
nth++;
}
}
if (tline) {
ws[tcols++] = maxlen;
width += maxlen;
}
if (nth == g->dcount && width <= columns &&
(beg == end || tlines >= g->lins))
break;
if ((tlines = (g->dcount + tcols - 1) / tcols) <= 0)
tlines = 1;
if (beg == end) {
if (fe) {
beg -= 2;
end -= 2;
fe = 0;
} else {
beg++;
end++;
memset(ws, 0, tcols * sizeof(int));
for (width = nth = tcol = tline = 0,
p = skipnolist(g->matches, showall);
*p && width < columns && nth < g->dcount;
nth++, p = skipnolist(p + 1, showall), tline++) {
m = *p;
if (tline == tlines) {
tcol++;
tline = 0;
}
} else if (width < columns) {
if ((end = tlines) == beg + 1)
end--;
} else {
if ((beg = tlines) + 1 == end)
end--;
}
}
if (tlines > g->lins)
tlines = g->lins;
if (tcol == tcols) {
tcol = 0;
tlines++;
}
len = (mlens[m->gnum] +
(tcol == tcols - 1 ? 0 : add));
if (len > ws[tcol]) {
width += len - ws[tcol];
ws[tcol] = len;
}
}
if (width < columns)
break;
}
}
}
if (tcols <= g->cols)
tlines = g->lins;
if (tlines == g->lins) {
zfree(ws, columns * sizeof(int));
g->widths = NULL;

@ -74,6 +74,7 @@ struct cdrun {
#define CRT_DESC 1
#define CRT_SPEC 2
#define CRT_DUMMY 3
#define CRT_EXPL 4
struct cdset {
Cdset next; /* guess what */
@ -199,7 +200,9 @@ cd_prep()
VARARR(Cdstr, grps, lines);
VARARR(int, wids, cd_state.maxg);
Cdstr gs, gp, gn, *gpp;
int i, j;
int i, j, d;
Cdrun expl;
Cdstr *strp2;
memset(wids, 0, cd_state.maxg * sizeof(int));
strp = grps;
@ -236,22 +239,59 @@ cd_prep()
qsort(grps, lines, sizeof(Cdstr), cd_sort);
for (i = lines, strp = grps; i; i--, strp++) {
for (j = 0, gs = *strp; gs->other; gs = gs->other, j++) {
*runp = run = (Cdrun) zalloc(sizeof(*run));
runp = &(run->next);
run->type = CRT_SPEC;
run->strs = gs;
gs->run = NULL;
run->count = 1;
}
expl = (Cdrun) zalloc(sizeof(*run));
expl->type = CRT_EXPL;
expl->strs = grps[0];
expl->count = lines;
for (i = lines, strp = grps, strp2 = NULL; i; i--, strp++) {
str = *strp;
*strp = str->other;
if (strp2)
*strp2 = str;
strp2 = &(str->run);
*runp = run = (Cdrun) zalloc(sizeof(*run));
runp = &(run->next);
run->type = CRT_DUMMY + cd_state.maxg - j - 1;
run->strs = gs;
gs->run = NULL;
run->type = CRT_SPEC;
run->strs = str;
run->count = 1;
}
*strp2 = NULL;
for (i = cd_state.maxg - 1; i; i--) {
for (d = 0, j = lines, strp = grps; j; j--, strp++) {
if ((str = *strp)) {
if (d) {
*runp = run = (Cdrun) zalloc(sizeof(*run));
runp = &(run->next);
run->type = CRT_DUMMY;
run->strs = expl->strs;
run->count = d;
d = 0;
}
*runp = run = (Cdrun) zalloc(sizeof(*run));
runp = &(run->next);
run->type = CRT_SPEC;
run->strs = str;
run->strs->run = NULL;
run->count = 1;
*strp = str->other;
} else
d++;
}
if (d) {
*runp = run = (Cdrun) zalloc(sizeof(*run));
runp = &(run->next);
run->type = CRT_DUMMY;
run->strs = expl->strs;
run->count = d;
}
}
*runp = expl;
runp = &(expl->next);
for (set = cd_state.sets; set; set = set->next) {
for (i = 0, gs = NULL, gpp = &gs, str = set->strs;
str; str = str->next) {
@ -528,6 +568,7 @@ cd_get(char **params)
opts[0] = ztrdup("-l");
break;
}
case CRT_SPEC:
mats = (char **) zalloc(2 * sizeof(char *));
dpys = (char **) zalloc(2 * sizeof(char *));
@ -549,39 +590,56 @@ cd_get(char **params)
} else
opts[0] = ztrdup("-2V-default-");
csl = "packed rows";
csl = "packed";
break;
default:
case CRT_DUMMY:
{
int dlen = columns - cd_state.gpre - cd_state.slen;
VARARR(char, dbuf, dlen + cd_state.slen);
char buf[20];
int i = run->type - CRT_DUMMY;
sprintf(buf, "-E%d", i + 1);
sprintf(buf, "-E%d", run->count);
mats = (char **) zalloc(2 * sizeof(char *));
dpys = (char **) zalloc((3 + i) * sizeof(char *));
mats[0] = ztrdup(run->strs->match);
dpys[0] = ztrdup(run->strs->str);
for (dp = dpys + 1; i; i--, dp++)
*dp = ztrdup("");
memset(dbuf + cd_state.slen, ' ', dlen - 1);
dbuf[dlen + cd_state.slen - 1] = '\0';
strcpy(dbuf, cd_state.sep);
memcpy(dbuf + cd_state.slen,
run->strs->desc,
(strlen(run->strs->desc) >= dlen ? dlen - 1 :
strlen(run->strs->desc)));
*dp++ = ztrdup(dbuf);
mats[1] = *dp = NULL;
mats = (char **) zalloc(sizeof(char *));
dpys = (char **) zalloc(sizeof(char *));
mats[0] = dpys[0] = NULL;
opts = cd_arrdup(run->strs->set->opts);
opts[0] = ztrdup(buf);
csl = "packed rows";
csl = "packed";
}
break;
case CRT_EXPL:
{
int dlen = columns - cd_state.gpre - cd_state.slen;
VARARR(char, dbuf, dlen + cd_state.slen);
char buf[20];
int i = run->count;
sprintf(buf, "-E%d", i);
mats = (char **) zalloc(sizeof(char *));
dpys = (char **) zalloc((i + 1) * sizeof(char *));
for (dp = dpys, str = run->strs; str; str = str->run) {
memset(dbuf + cd_state.slen, ' ', dlen - 1);
dbuf[dlen + cd_state.slen - 1] = '\0';
strcpy(dbuf, cd_state.sep);
memcpy(dbuf + cd_state.slen,
str->desc,
(strlen(str->desc) >= dlen ? dlen - 1 :
strlen(str->desc)));
*dp++ = ztrdup(dbuf);
}
mats[0] = *dp = NULL;
opts = cd_arrdup(run->strs->set->opts);
opts[0] = ztrdup(buf);
csl = "packed";
}
break;
}
setsparam(params[0], ztrdup(csl));
setaparam(params[1], opts);