summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Wischnowsky <wischnow@users.sourceforge.net>2000-05-04 07:44:21 +0000
committerSven Wischnowsky <wischnow@users.sourceforge.net>2000-05-04 07:44:21 +0000
commit4414e16a6a958c39209f37f7f7a6fae6b1b78864 (patch)
treeb687f97b33167d38a881d207cb00b8d8331ead51
parent74106447f64bb1bfb71a3c95f249e4f9f97d4a86 (diff)
downloadzsh-4414e16a6a958c39209f37f7f7a6fae6b1b78864.tar.gz
zsh-4414e16a6a958c39209f37f7f7a6fae6b1b78864.zip
don't list when all matches look the same; force-list style to give users control over this (11140)
-rw-r--r--ChangeLog7
-rw-r--r--Completion/Builtins/_zstyle1
-rw-r--r--Completion/Core/_main_complete7
-rw-r--r--Doc/Zsh/compsys.yo12
-rw-r--r--Src/Zle/compcore.c33
-rw-r--r--Src/Zle/compctl.c3
6 files changed, 56 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 66f25ccc4..9896bf9fb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2000-05-04 Sven Wischnowsky <wischnow@informatik.hu-berlin.de>
+
+ * 11140: Completion/Builtins/_zstyle, Completion/Core/_main_complete,
+ Doc/Zsh/compsys.yo, Src/Zle/compcore.c, Src/Zle/compctl.c: don't
+ list when all matches look the same; force-list style to give
+ users control over this
+
2000-05-03 Tanaka Akira <akr@zsh.org>
* 11137: Test/07cond.ztst: detect block device file using find.
diff --git a/Completion/Builtins/_zstyle b/Completion/Builtins/_zstyle
index a2a19320d..1edd0987f 100644
--- a/Completion/Builtins/_zstyle
+++ b/Completion/Builtins/_zstyle
@@ -25,6 +25,7 @@ styles=(
expand c:
file-patterns c:filepat
file-sort c:fsort
+ force-list c
format c:
glob c:
group-name c:
diff --git a/Completion/Core/_main_complete b/Completion/Core/_main_complete
index 7c1135959..cf2cbb808 100644
--- a/Completion/Core/_main_complete
+++ b/Completion/Core/_main_complete
@@ -200,6 +200,13 @@ elif [[ nm -eq 0 &&
fi
fi
+if zstyle -s ":completion:${curcontext}:" force-list tmp &&
+ [[ "$compstate[list]" = *list* &&
+ ( "$tmp" = always ||
+ ( "$tmp" = [0-9]## && nm -ge tmp ) ) ]]; then
+ compstate[list]="$compstate[list] force"
+fi
+
# Now call the post-functions.
funcs=( "$comppostfuncs[@]" )
diff --git a/Doc/Zsh/compsys.yo b/Doc/Zsh/compsys.yo
index b3402d664..0c5d02f08 100644
--- a/Doc/Zsh/compsys.yo
+++ b/Doc/Zsh/compsys.yo
@@ -1033,6 +1033,18 @@ time. Any other value (or not setting this style at all) makes them be
sorted alphabetically by name. If the value contains the string
`tt(reverse)', sorting is done in decreasing order.
)
+kindex(force-list, completion style)
+item(tt(force-list))(
+If the completion code would show a list of completions at all, this
+style controls whether the list is shown even in cases when it would
+normally not do that. For example, normally the list is only shown if
+there are at least to different matches. By setting this style to
+`tt(always)', the list will always even be shown, even if there is
+only a single match which is immediately accepted. The style may also
+be set to a number. In this case the list will be shown if there are
+at least that many matches, even if they would all insert the same
+string.
+)
kindex(format, completion style)
item(tt(format))(
If this is set for the tt(descriptions) tag, its value is used as a
diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c
index eeea42a4d..542c5eebc 100644
--- a/Src/Zle/compcore.c
+++ b/Src/Zle/compcore.c
@@ -152,6 +152,11 @@ mod_export int nmatches;
/**/
mod_export int smatches;
+/* != 0 if more than one match and at least two different matches */
+
+/**/
+mod_export int diffmatches;
+
/* The number of messages. */
/**/
@@ -388,10 +393,10 @@ do_completion(Hookdef dummy, Compldat dat)
invalidatelist();
} else if (useline) {
/* We have matches. */
- if (nmatches > 1) {
+ if (nmatches > 1 && diffmatches) {
/* There is more than one match. */
ret = do_ambiguous();
- } else if (nmatches == 1) {
+ } else if (nmatches == 1 || !diffmatches) {
/* Only one match. */
Cmgroup m = amatches;
@@ -423,7 +428,8 @@ do_completion(Hookdef dummy, Compldat dat)
cs = origcs;
}
/* Print the explanation strings if needed. */
- if (!showinglist && validlist && usemenu != 2 && nmatches != 1 &&
+ if (!showinglist && validlist && usemenu != 2 &&
+ (nmatches != 1 || diffmatches) &&
useline != 2 && (!oldlist || !listshown)) {
onlyexpl = 1;
showinglist = -2;
@@ -870,7 +876,7 @@ makecomplist(char *s, int incmd, int lst)
if (compfunc) {
char *os = s;
- int onm = nmatches, osi = movefd(0);
+ int onm = nmatches, odm = diffmatches, osi = movefd(0);
bmatchers = NULL;
mstack = NULL;
@@ -905,6 +911,7 @@ makecomplist(char *s, int incmd, int lst)
if (oldlist) {
nmatches = onm;
+ diffmatches = odm;
validlist = 1;
amatches = lastmatches;
lmatches = lastlmatches;
@@ -2635,7 +2642,7 @@ permmatches(int last)
opm = pmatches;
pmatches = lmatches = NULL;
- nmatches = smatches = 0;
+ nmatches = smatches = diffmatches = 0;
if (!ainfo->count) {
if (last)
@@ -2667,6 +2674,9 @@ permmatches(int last)
nmatches += g->mcount;
smatches += g->lcount;
+ if (g->mcount > 1)
+ diffmatches = 1;
+
n = (Cmgroup) zcalloc(sizeof(struct cmgroup));
if (g->perm) {
@@ -2721,18 +2731,29 @@ permmatches(int last)
nmatches += g->mcount;
smatches += g->lcount;
+
+ if (g->mcount > 1)
+ diffmatches = 1;
+
g->num = gn++;
}
g->new = 0;
g = g->next;
}
- for (g = pmatches; g; g = g->next) {
+ for (g = pmatches, p = NULL; g; g = g->next) {
g->nbrbeg = nbrbeg;
g->nbrend = nbrend;
for (rn = 1, q = g->matches; *q; q++) {
(*q)->rnum = rn++;
(*q)->gnum = mn++;
}
+ if (!diffmatches && *g->matches) {
+ if (p) {
+ if (!matcheq(*g->matches, *p))
+ diffmatches = 1;
+ } else
+ p = g->matches;
+ }
}
hasperm = 1;
permmnum = mn - 1;
diff --git a/Src/Zle/compctl.c b/Src/Zle/compctl.c
index accd97c93..b443b7da5 100644
--- a/Src/Zle/compctl.c
+++ b/Src/Zle/compctl.c
@@ -1762,7 +1762,7 @@ ccmakehookfn(Hookdef dummy, struct ccmakedat *dat)
struct cmlist ms;
Cmlist m;
char *os = s;
- int onm = nmatches, osi = movefd(0);
+ int onm = nmatches, odm = diffmatches, osi = movefd(0);
LinkNode n;
/* We build a copy of the list of matchers to use to make sure that this
@@ -1843,6 +1843,7 @@ ccmakehookfn(Hookdef dummy, struct ccmakedat *dat)
if (oldlist) {
nmatches = onm;
+ diffmatches = odm;
validlist = 1;
amatches = lastmatches;
lmatches = lastlmatches;