about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>1999-12-08 09:48:04 +0000
committerTanaka Akira <akr@users.sourceforge.net>1999-12-08 09:48:04 +0000
commit37b3d62f8e55b022b107ac0ef553e400202a6ee1 (patch)
tree7d2dff0a751c544165f5ebd7079bcb583dd5b16f
parentb8787e39cf78c9212a4816cbe978d77d3f63289f (diff)
downloadzsh-37b3d62f8e55b022b107ac0ef553e400202a6ee1.tar.gz
zsh-37b3d62f8e55b022b107ac0ef553e400202a6ee1.tar.xz
zsh-37b3d62f8e55b022b107ac0ef553e400202a6ee1.zip
zsh-workers/8939
-rw-r--r--Doc/Zsh/mod_complist.yo14
-rw-r--r--Src/Zle/comp.h3
-rw-r--r--Src/Zle/compcore.c10
-rw-r--r--Src/Zle/complist.c30
-rw-r--r--Src/Zle/compresult.c52
5 files changed, 71 insertions, 38 deletions
diff --git a/Doc/Zsh/mod_complist.yo b/Doc/Zsh/mod_complist.yo
index 53162d6b4..535da9267 100644
--- a/Doc/Zsh/mod_complist.yo
+++ b/Doc/Zsh/mod_complist.yo
@@ -149,11 +149,23 @@ After menu-selection is started, the matches will be listed. The
 matches to insert into the command line can be selected from this
 list. In the list one match is highlighted using the value for tt(ma)
 from the tt(ZLS_COLORS) or tt(ZLS_COLOURS) parameter. The default
-value for this it `tt(7)' which forces the selected match to be
+value for this is `tt(7)' which forces the selected match to be
 highlighted using standout mode on a vt100-compatible terminal. If
 neither tt(ZLS_COLORS) nor tt(ZLS_COLOURS) is set, the same terminal
 control sequence as for the `tt(%S)' escape in prompts is used.
 
+Normally, the completion code may decide to not show of the matches in 
+the list. These hidden matches are either matches for which the
+completion function which added them explicitly requested that they
+don't appear in the list (using the tt(-n) option of the tt(compadd)
+builtin command) or they are matches which show the the same string in 
+the list (because they differ only in things like prefixes or suffixes 
+that are never listed). In the list used for menu-selection, however,
+even these matches will be shown so that it is possible to select
+them. To be able to highlight such matches the tt(hi) and tt(mu)
+capabilities in the tt(ZLS_COLORS) and tt(ZLS_COLOURS) parameters are
+supported for hidden matches of the first and second kind, respectively.
+
 Selecting matches is done by moving the mark around using the zle movement
 functions. The zle functions tt(send-break) and tt(accept-line) can be used
 to leave menu-selection, leaving the match currently inserted into the line
diff --git a/Src/Zle/comp.h b/Src/Zle/comp.h
index a177be614..59ca5be06 100644
--- a/Src/Zle/comp.h
+++ b/Src/Zle/comp.h
@@ -120,6 +120,8 @@ struct cmatch {
 #define CMF_NOSPACE  (1<< 8)	/* don't add a space */
 #define CMF_PACKED   (1<< 9)	/* prefer LIST_PACKED */
 #define CMF_ROWS     (1<<10)	/* prefer LIST_ROWS_FIRST */
+#define CMF_MULT     (1<<11)	/* string appears more than once */
+#define CMF_FMULT    (1<<12)	/* first of multiple equal strings */
 
 /* Stuff for completion matcher control. */
 
@@ -269,6 +271,7 @@ struct cldata {
     int nlines;			/* number of lines needed */
     int hidden;			/* != 0 if there are hidden matches */
     int onlyexpl;		/* != 0 if only explanations to print */
+    int showall;		/* != 0 if hidden matches should be shown */
 };
 
 typedef void (*CLPrintFunc)(Cmgroup, Cmatch *, int, int, int, int,
diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c
index d6f21f46d..c2767f90c 100644
--- a/Src/Zle/compcore.c
+++ b/Src/Zle/compcore.c
@@ -2376,14 +2376,15 @@ makearray(LinkList l, int type, int flags, int *np, int *nlp, int *llp)
 		    /* Mark those, that would show the same string in the list. */
 		    for (; bp[1] && !(*ap)->disp && !(bp[1])->disp &&
 			     !strcmp((*ap)->str, (bp[1])->str); bp++)
-			(bp[1])->flags |= CMF_NOLIST;
+			(bp[1])->flags |= CMF_MULT;
+		    (*ap)->flags |= CMF_FMULT;
 		}
 		*cp = NULL;
 	    }
 	    for (ap = rp; *ap; ap++) {
 		if ((*ap)->disp && ((*ap)->flags & CMF_DISPLINE))
 		    ll++;
-		if ((*ap)->flags & CMF_NOLIST)
+		if ((*ap)->flags & (CMF_NOLIST | CMF_MULT))
 		    nl++;
 	    }
 	} else {
@@ -2404,14 +2405,15 @@ makearray(LinkList l, int type, int flags, int *np, int *nlp, int *llp)
 		    ap = bp;
 		    for (; bp[1] && !(*ap)->disp && !(bp[1])->disp &&
 			     !strcmp((*ap)->str, (bp[1])->str); bp++)
-			(bp[1])->flags |= CMF_NOLIST;
+			(bp[1])->flags |= CMF_MULT;
+		    (*ap)->flags |= CMF_FMULT;
 		}
 		*cp = NULL;
 	    }
 	    for (ap = rp; *ap; ap++) {
 		if ((*ap)->disp && ((*ap)->flags & CMF_DISPLINE))
 		    ll++;
-		if ((*ap)->flags & CMF_NOLIST)
+		if ((*ap)->flags & (CMF_NOLIST | CMF_MULT))
 		    nl++;
 	    }
 	}
diff --git a/Src/Zle/complist.c b/Src/Zle/complist.c
index 00d1fb954..6d4648446 100644
--- a/Src/Zle/complist.c
+++ b/Src/Zle/complist.c
@@ -57,8 +57,10 @@ static Keymap mskeymap;
 #define COL_TC 13
 #define COL_SP 14
 #define COL_MA 15
+#define COL_HI 16
+#define COL_MU 17
 
-#define NUM_COLS 16
+#define NUM_COLS 18
 
 /* Maximum number of in-string colours supported. */
 
@@ -68,14 +70,14 @@ static Keymap mskeymap;
 
 static char *colnames[] = {
     "no", "fi", "di", "ln", "pi", "so", "bd", "cd", "ex", "mi",
-    "lc", "rc", "ec", "tc", "sp", "ma", NULL
+    "lc", "rc", "ec", "tc", "sp", "ma", "hi", "mu", NULL
 };
 
 /* Default values. */
 
 static char *defcols[] = {
     "0", "0", "1;34", "1;36", "33", "1;35", "1;33", "1;33", "1;32", NULL,
-    "\033[", "m", NULL, "0", "0", "7"
+    "\033[", "m", NULL, "0", "0", "7", "0", "0"
 };
 
 /* This describes a terminal string for a file type. */
@@ -654,7 +656,11 @@ clprintm(Cmgroup g, Cmatch *mp, int mc, int ml, int lastc, int width,
 	    mgtabp = mgtab + mm;
 	    mmlen = mcols;
 	    zcputs(&mcolors, g->name, COL_MA);
-	} else
+	} else if (m->flags & CMF_NOLIST)
+	    zcputs(&mcolors, g->name, COL_HI);
+	else if (mselect >= 0 && (m->flags & (CMF_MULT | CMF_FMULT)))
+	    zcputs(&mcolors, g->name, COL_MU);
+	else
 	    subcols = putmatchcol(&mcolors, g->name, m->disp);
 	if (subcols)
 	    clprintfmt(&mcolors, m->disp);
@@ -689,7 +695,11 @@ clprintm(Cmgroup g, Cmatch *mp, int mc, int ml, int lastc, int width,
 	    mgtabp = mgtab + mx + mm;
 	    mmlen = width;
 	    zcputs(&mcolors, g->name, COL_MA);
-	} else if (buf)
+	} else if (m->flags & CMF_NOLIST)
+	    zcputs(&mcolors, g->name, COL_HI);
+	else if (mselect >= 0 && (m->flags & (CMF_MULT | CMF_FMULT)))
+	    zcputs(&mcolors, g->name, COL_MU);
+	else if (buf)
 	    subcols = putfilecol(&mcolors, g->name, path, buf->st_mode);
 	else
 	    subcols = putmatchcol(&mcolors, g->name, (m->disp ? m->disp : m->str));
@@ -739,7 +749,7 @@ complistmatches(Hookdef dummy, Chdata dat)
     }
     getcols(&mcolors);
 
-    calclist();
+    calclist(mselect >= 0);
 
     if (!listdat.nlines || (mselect >= 0 &&
 			    (!(isset(USEZLE) && !termflags &&
@@ -750,10 +760,6 @@ complistmatches(Hookdef dummy, Chdata dat)
 	amatches = oamatches;
 	return 1;
     }
-    if (listdat.hidden) {
-	noselect = 1;
-	mselect = -1;
-    }
     if (inselect)
 	clearflag = 0;
 
@@ -777,7 +783,7 @@ complistmatches(Hookdef dummy, Chdata dat)
     last_cap = (char *) zhalloc(max_caplen + 1);
     *last_cap = '\0';
 
-    if (!printlist(1, clprintm) || listdat.nlines >= lines)
+    if (!printlist(1, clprintm, (mselect >= 0)) || listdat.nlines >= lines)
 	noselect = 1;
 
     amatches = oamatches;
@@ -1159,6 +1165,8 @@ domenuselect(Hookdef dummy, Chdata dat)
 	if (!noselect) {
 	    showinglist = -2;
 	    onlyexpl = oe;
+	    if (!smatches)
+		clearlist = 1;
 	    zrefresh();
 	}
 	fdat = NULL;
diff --git a/Src/Zle/compresult.c b/Src/Zle/compresult.c
index 4aa171ea1..3bb7c60ce 100644
--- a/Src/Zle/compresult.c
+++ b/Src/Zle/compresult.c
@@ -1101,7 +1101,7 @@ list_lines(void)
     oam = amatches;
     amatches = pmatches;
     listdat.valid = 0;
-    calclist();
+    calclist(0);
     listdat.valid = 0;
     amatches = oam;
 
@@ -1122,10 +1122,13 @@ comp_list(char *v)
 
 /**/
 Cmatch *
-skipnolist(Cmatch *p)
+skipnolist(Cmatch *p, int showall)
 {
-    while (*p && (((*p)->flags & (CMF_NOLIST | CMF_HIDE)) ||
-		  ((*p)->disp && ((*p)->flags & (CMF_DISPLINE | CMF_HIDE)))))
+    int mask = (showall ? 0 : (CMF_NOLIST | CMF_MULT)) | CMF_HIDE;
+
+    while (*p && (((*p)->flags & mask) ||
+		  ((*p)->disp &&
+		   ((*p)->flags & (CMF_DISPLINE | CMF_HIDE)))))
 	p++;
 
     return p;
@@ -1133,7 +1136,7 @@ skipnolist(Cmatch *p)
 
 /**/
 mod_export void
-calclist(void)
+calclist(int showall)
 {
     Cmgroup g;
     Cmatch *p, m;
@@ -1143,7 +1146,7 @@ calclist(void)
     VARARR(int, mlens, nmatches + 1);
 
     if (listdat.valid && onlyexpl == listdat.onlyexpl &&
-	menuacc == listdat.menuacc &&
+	menuacc == listdat.menuacc && showall == listdat.showall &&
 	lines == listdat.lines && columns == listdat.columns)
 	return;
 
@@ -1169,8 +1172,8 @@ calclist(void)
 		while ((sptr = *pp)) {
 		    while (sptr && *sptr) {
 			nlines += (nlptr = strchr(sptr, '\n'))
-			    ? 1 + (nlptr-sptr)/columns
-			    : strlen(sptr)/columns;
+			    ? 1 + (nlptr-sptr) / columns
+			    : strlen(sptr) / columns;
 			sptr = nlptr ? nlptr+1 : NULL;
 		    }
 		    nlines++;
@@ -1217,7 +1220,7 @@ calclist(void)
 			g->flags &= ~CGF_PACKED;
 		    if (!(m->flags & CMF_ROWS))
 			g->flags &= ~CGF_ROWS;
-		} else if (!(m->flags & CMF_NOLIST)) {
+		} else if (showall || !(m->flags & (CMF_NOLIST | CMF_MULT))) {
 		    l = niceztrlen(m->str);
 		    ndisp++;
 		    if (l > glong)
@@ -1290,7 +1293,8 @@ calclist(void)
 			    if (m->disp) {
 				if (!(m->flags & CMF_DISPLINE))
 				    glines += 1 + (mlens[m->gnum] / columns);
-			    } else if (!(m->flags & CMF_NOLIST))
+			    } else if (showall ||
+				       !(m->flags & (CMF_NOLIST | CMF_MULT)))
 				glines += 1 + ((mlens[m->gnum]) / columns);
 			}
 		}
@@ -1385,7 +1389,7 @@ calclist(void)
 
 		    for (tcols = columns / g->shortest; tcols > g->cols;
 			 tcols--) {
-			p = first = skipnolist(g->matches);
+			p = first = skipnolist(g->matches, showall);
 			for (maxlen = width = maxlines = llines = tcol = 0,
 				 count = g->dcount;
 			     count > 0; count--) {
@@ -1394,7 +1398,7 @@ calclist(void)
 			    if (addlen > maxlen)
 				maxlen = addlen;
 			    for (i = tcols; i && *p; i--)
-				p = skipnolist(p + 1);
+				p = skipnolist(p + 1, showall);
 
 			    llines++;
 			    if (!*p) {
@@ -1407,7 +1411,7 @@ calclist(void)
 				ws[tcol++] = maxlen;
 				maxlen = 0;
 
-				p = first = skipnolist(first + 1);
+				p = first = skipnolist(first + 1, showall);
 			    }
 			}
 			if (tlines) {
@@ -1421,6 +1425,8 @@ calclist(void)
 			tlines = maxlines;
 		} else {
 		    int addlen;
+		    int smask = ((showall ? 0 : (CMF_NOLIST | CMF_MULT)) |
+				 CMF_HIDE);
 
 		    for (tlines = ((g->totl + columns) / columns);
 			 tlines < g->lins; tlines++) {
@@ -1429,7 +1435,7 @@ calclist(void)
 			     (m = *p); p++, nth++) {
 			    if (!(m->flags &
 				  (m->disp ? (CMF_DISPLINE | CMF_HIDE) :
-				   (CMF_NOLIST | CMF_HIDE)))) {
+				   smask))) {
 				addlen = mlens[m->gnum] + add;
 				if (addlen > maxlen)
 				    maxlen = addlen;
@@ -1481,6 +1487,7 @@ calclist(void)
     listdat.onlyexpl = onlyexpl;
     listdat.columns = columns;
     listdat.lines = lines;
+    listdat.showall = showall;
 }
 
 /**/
@@ -1531,7 +1538,7 @@ int asklist(void)
 
 /**/
 mod_export int
-printlist(int over, CLPrintFunc printm)
+printlist(int over, CLPrintFunc printm, int showall)
 {
     Cmgroup g;
     Cmatch *p, m;
@@ -1628,7 +1635,8 @@ printlist(int over, CLPrintFunc printm)
 		    pp += ((g->flags & CGF_ROWS) ? g->cols : 1);
 		}
 	    }
-	} else if (!listdat.onlyexpl && g->lcount) {
+	} else if (!listdat.onlyexpl &&
+		   (g->lcount || (showall && g->mcount))) {
 	    int n = g->dcount, nl, nc, i, j, wid;
 	    Cmatch *q;
 
@@ -1662,7 +1670,7 @@ printlist(int over, CLPrintFunc printm)
 			tcout(TCCLEAREOD);
 		}
 	    }
-	    for (p = skipnolist(g->matches); n && nl--;) {
+	    for (p = skipnolist(g->matches, showall); n && nl--;) {
 		i = g->cols;
 		mc = 0;
 		q = p;
@@ -1693,7 +1701,7 @@ printlist(int over, CLPrintFunc printm)
 		    if (--n)
 			for (j = ((g->flags & CGF_ROWS) ? 1 : nc);
 			     j && *q; j--)
-			    q = skipnolist(q + 1);
+			    q = skipnolist(q + 1, showall);
 		    mc++;
 		}
 		while (i-- > 0) {
@@ -1712,11 +1720,11 @@ printlist(int over, CLPrintFunc printm)
 		    if (nl)
 			for (j = ((g->flags & CGF_ROWS) ? g->cols : 1);
 			     j && *p; j--)
-			    p = skipnolist(p + 1);
+			    p = skipnolist(p + 1, showall);
 		}
 	    }
 	}
-	if (g->lcount)
+	if (g->lcount || (showall && g->mcount))
 	    pnl = 1;
 	g = g->next;
     }
@@ -1776,7 +1784,7 @@ iprintm(Cmgroup g, Cmatch *mp, int mc, int ml, int lastc, int width,
 int
 ilistmatches(Hookdef dummy, Chdata dat)
 {
-    calclist();
+    calclist(0);
 
     if (!listdat.nlines) {
 	showinglist = listshown = 0;
@@ -1785,7 +1793,7 @@ ilistmatches(Hookdef dummy, Chdata dat)
     if (asklist())
 	return 0;
 
-    printlist(0, iprintm);
+    printlist(0, iprintm, 0);
 
     return 0;
 }