summaryrefslogtreecommitdiff
path: root/Src/Zle
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Zle')
-rw-r--r--Src/Zle/comp.h1
-rw-r--r--Src/Zle/compcore.c62
-rw-r--r--Src/Zle/compctl.c6
-rw-r--r--Src/Zle/complist.c9
-rw-r--r--Src/Zle/compresult.c15
5 files changed, 43 insertions, 50 deletions
diff --git a/Src/Zle/comp.h b/Src/Zle/comp.h
index c06e7aa7e..9d92b4a5c 100644
--- a/Src/Zle/comp.h
+++ b/Src/Zle/comp.h
@@ -38,6 +38,7 @@ typedef struct cmatch *Cmatch;
/* This is for explantion strings. */
struct cexpl {
+ int always; /* display even without matches */
char *str; /* the string */
int count; /* the number of matches */
int fcount; /* number of matches with fignore ignored */
diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c
index 7db5ffd13..748a01f6c 100644
--- a/Src/Zle/compcore.c
+++ b/Src/Zle/compcore.c
@@ -1618,6 +1618,18 @@ addmatches(Cadata dat, char **argv)
Brinfo bp, bpl = brbeg, obpl, bsl = brend, obsl;
Heap oldheap;
+ SWITCHHEAPS(oldheap, compheap) {
+ if (dat->mesg || dat->exp) {
+ curexpl = (Cexpl) zhalloc(sizeof(struct cexpl));
+ curexpl->always = !!dat->mesg;
+ curexpl->count = curexpl->fcount = 0;
+ curexpl->str = dupstring(dat->mesg ? dat->mesg : dat->exp);
+ if (dat->mesg)
+ addexpl(1);
+ } else
+ curexpl = NULL;
+ } SWITCHBACKHEAPS(oldheap);
+
if (!*argv && !dat->dummies && !(dat->aflags & CAF_ALL)) {
SWITCHHEAPS(oldheap, compheap) {
/* Select the group in which to store the matches. */
@@ -1631,8 +1643,6 @@ addmatches(Cadata dat, char **argv)
endcmgroup(NULL);
begcmgroup("default", 0);
}
- if (dat->mesg)
- addmesg(dat->mesg);
} SWITCHBACKHEAPS(oldheap);
return 1;
@@ -1689,13 +1699,6 @@ addmatches(Cadata dat, char **argv)
dparr = NULL;
dparl = newlinklist();
}
- if (dat->exp) {
- curexpl = (Cexpl) zhalloc(sizeof(struct cexpl));
- curexpl->count = curexpl->fcount = 0;
- curexpl->str = dupstring(dat->exp);
- } else
- curexpl = NULL;
-
/* Store the matcher in our stack of matchers. */
if (dat->match) {
mst.next = mstack;
@@ -1889,8 +1892,6 @@ addmatches(Cadata dat, char **argv)
endcmgroup(NULL);
begcmgroup("default", 0);
}
- if (dat->mesg)
- addmesg(dat->mesg);
if (*argv) {
if (dat->pre)
dat->pre = dupstring(dat->pre);
@@ -2057,7 +2058,7 @@ addmatches(Cadata dat, char **argv)
if (dat->dpar)
set_list_array(dat->dpar, dparl);
if (dat->exp)
- addexpl();
+ addexpl(0);
if (!hasallmatch && (dat->aflags & CAF_ALL)) {
addmatch("<all>", dat->flags | CMF_ALL, &disp, 1);
hasallmatch = 1;
@@ -2496,45 +2497,31 @@ endcmgroup(char **ylist)
/**/
mod_export void
-addexpl(void)
+addexpl(int always)
{
LinkNode n;
Cexpl e;
for (n = firstnode(expls); n; incnode(n)) {
e = (Cexpl) getdata(n);
- if (e->count >= 0 && !strcmp(curexpl->str, e->str)) {
+ if (!strcmp(curexpl->str, e->str)) {
e->count += curexpl->count;
e->fcount += curexpl->fcount;
-
+ if (always) {
+ e->always = 1;
+ nmessages++;
+ newmatches = 1;
+ mgroup->new = 1;
+ }
return;
}
}
addlinknode(expls, curexpl);
newmatches = 1;
-}
-
-/* Add a message to the current group. Make sure it is shown. */
-
-/**/
-mod_export void
-addmesg(char *mesg)
-{
- LinkNode n;
- Cexpl e;
-
- for (n = firstnode(expls); n; incnode(n)) {
- e = (Cexpl) getdata(n);
- if (e->count < 0 && !strcmp(mesg, e->str))
- return;
+ if (always) {
+ mgroup->new = 1;
+ nmessages++;
}
- e = (Cexpl) zhalloc(sizeof(*e));
- e->count = e->fcount = -1;
- e->str = dupstring(mesg);
- addlinknode(expls, e);
- newmatches = 1;
- mgroup->new = 1;
- nmessages++;
}
/* The comparison function for matches (used for sorting). */
@@ -2852,6 +2839,7 @@ permmatches(int last)
for (eq = g->expls; (o = *eq); eq++, ep++) {
*ep = e = (Cexpl) zcalloc(sizeof(struct cexpl));
e->count = (fi ? o->fcount : o->count);
+ e->always = o->always;
e->fcount = 0;
e->str = ztrdup(o->str);
}
diff --git a/Src/Zle/compctl.c b/Src/Zle/compctl.c
index b4981a842..cc0aebf04 100644
--- a/Src/Zle/compctl.c
+++ b/Src/Zle/compctl.c
@@ -3808,9 +3808,9 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
if (cc->gname) {
endcmgroup(yaptr);
begcmgroup(cc->gname, gflags);
- addexpl();
+ addexpl(0);
} else {
- addexpl();
+ addexpl(0);
endcmgroup(yaptr);
begcmgroup("default", 0);
}
@@ -3825,7 +3825,7 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
untokenize(tt);
}
curexpl->str = tt;
- addexpl();
+ addexpl(0);
}
if (cc->subcmd) {
/* Handle -l sub-completion. */
diff --git a/Src/Zle/complist.c b/Src/Zle/complist.c
index 14cb16d4c..e38ffe33b 100644
--- a/Src/Zle/complist.c
+++ b/Src/Zle/complist.c
@@ -1042,9 +1042,9 @@ compprintlist(int showall)
lastused = 1;
}
while (*e) {
- if ((*e)->count &&
+ if (((*e)->count || (*e)->always) &&
(!listdat.onlyexpl ||
- (listdat.onlyexpl & ((*e)->count > 0 ? 1 : 2)))) {
+ (listdat.onlyexpl & ((*e)->always > 0 ? 2 : 1)))) {
if (pnl) {
if (dolistnl(ml) && compprintnl(ml))
goto end;
@@ -1058,8 +1058,9 @@ compprintlist(int showall)
}
if (mlbeg < 0 && mfirstl < 0)
mfirstl = ml;
- l = compprintfmt((*e)->str, (*e)->count, dolist(ml), 1,
- ml, &stop);
+ l = compprintfmt((*e)->str,
+ ((*e)->always ? -1 : (*e)->count),
+ dolist(ml), 1, ml, &stop);
if (mselect >= 0) {
int mm = (mcols * ml), i;
diff --git a/Src/Zle/compresult.c b/Src/Zle/compresult.c
index 13b9edd72..44a40f0fb 100644
--- a/Src/Zle/compresult.c
+++ b/Src/Zle/compresult.c
@@ -1494,10 +1494,12 @@ calclist(int showall)
}
if ((e = g->expls)) {
while (*e) {
- if ((*e)->count &&
+ if (((*e)->count || (*e)->always) &&
(!onlyexpl ||
- (onlyexpl & ((*e)->count > 0 ? 1 : 2))))
- nlines += 1 + printfmt((*e)->str, (*e)->count, 0, 1);
+ (onlyexpl & ((*e)->always > 0 ? 2 : 1))))
+ nlines += 1 + printfmt((*e)->str,
+ ((*e)->always ? -1 : (*e)->count),
+ 0, 1);
e++;
}
}
@@ -1840,9 +1842,9 @@ printlist(int over, CLPrintFunc printm, int showall)
int l;
while (*e) {
- if ((*e)->count &&
+ if (((*e)->count || (*e)->always) &&
(!listdat.onlyexpl ||
- (listdat.onlyexpl & ((*e)->count > 0 ? 1 : 2)))) {
+ (listdat.onlyexpl & ((*e)->always > 0 ? 2 : 1)))) {
if (pnl) {
putc('\n', shout);
pnl = 0;
@@ -1853,7 +1855,8 @@ printlist(int over, CLPrintFunc printm, int showall)
tcout(TCCLEAREOD);
}
}
- l = printfmt((*e)->str, (*e)->count, 1, 1);
+ l = printfmt((*e)->str,
+ ((*e)->always ? -1 : (*e)->count), 1, 1);
ml += l;
if (cl >= 0 && (cl -= l) <= 1) {
cl = -1;