1
0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-09-22 03:40:47 +02:00

add new generic fake style and changes to the C-code for that (different implementation of compadd -x) (16483)

This commit is contained in:
Sven Wischnowsky 2002-01-22 10:22:47 +00:00
parent f463b09b13
commit 3807c902a2
15 changed files with 113 additions and 59 deletions

View File

@ -1,3 +1,17 @@
2002-01-22 Sven Wischnowsky <wischnow@zsh.org>
* 16483: Completion/Base/Completer/_complete,
Completion/Base/Core/_description,
Completion/Base/Core/_main_complete,
Completion/Base/Core/_message,
Completion/Base/Utility/_alternative,
Completion/Base/Utility/_arguments,
Completion/Base/Utility/_values, Completion/Unix/Command/_chown,
Doc/Zsh/compsys.yo, Src/Zle/comp.h, Src/Zle/compcore.c,
Src/Zle/compctl.c, Src/Zle/complist.c, Src/Zle/compresult.c:
add new generic fake style and changes to the C-code for that
(different implementation of compadd -x)
2002-01-21 Sven Wischnowsky <wischnow@zsh.org>
* 16472: Completion/Base/Completer/_complete,

View File

@ -36,7 +36,7 @@ if [[ -n "$compcontext" ]]; then
case "$action" in
\ #)
_message "$descr";;
_message -e "$tag" "$descr";;
\(\(*\)\))
eval ws\=\( "${action[3,-3]}" \)

View File

@ -1,6 +1,6 @@
#autoload
local name gropt=-J format gname hidden hide match opts
local name gropt=-J format gname hidden hide match opts tag
opts=()
@ -51,6 +51,8 @@ else
_comp_ignore=()
fi
tag="$1"
shift 2
if [[ -z "$1" && $# -eq 1 ]]; then
format=
@ -72,4 +74,15 @@ else
fi
fi
if ! (( ${funcstack[2,-1][(I)_description]} )) &&
zstyle -a ":completion:${curcontext}:$tag" fake match; then
local descr
descr=( "${(@M)match:#*[^\\]:*}" )
compadd "${(@P)name}" - "${(@)${(@)match:#*[^\\]:*}:s/\\:/:/}"
(( $#descr )) && _describe -t "$tag" '' descr "${(@P)name}"
fi
return 0

View File

@ -268,7 +268,7 @@ if [[ $compstate[old_list] = keep || nm -gt 1 ]]; then
fi
fi
fi
elif [[ nm -le 1 && -n "$_comp_mesg" ]]; then
elif [[ nm -lt 1 && -n "$_comp_mesg" ]]; then
compstate[insert]=''
compstate[list]='list force'
elif [[ nm -eq 0 && -z "$_comp_mesg" &&

View File

@ -2,6 +2,19 @@
local format raw
if [[ "$1" = -e ]]; then
local expl ret=1
_comp_mesg=yes
_tags "$2" && while _next_label "$2" expl "$3"; do
compadd ${expl:/-X/-x}
ret=0
done
return ret
fi
_tags messages || return 1
if [[ "$1" = -r ]]; then

View File

@ -31,7 +31,7 @@ while _tags; do
# An empty action means that we should just display a message.
mesgs=( "$mesgs[@]" "$descr")
mesgs=( "$mesgs[@]" "${def%%:*}:$descr")
elif [[ "$action" = \(\(*\)\) ]]; then
local ws
@ -76,7 +76,7 @@ while _tags; do
done
for descr in "$mesgs[@]"; do
_message "$descr"
_message -e "${descr%%:*}" "${desc#*:}"
done
return 1

View File

@ -274,7 +274,7 @@ if (( $# )) && comparguments -i "$autod" "$singopt[@]" "$@"; then
# An empty action means that we should just display a message.
_message "$descr"
_message -e "$subc" "$descr"
mesg=yes
tried=yes
alwopt=${alwopt:-yes}

View File

@ -103,7 +103,7 @@ if compvalues -i "$@"; then
# An empty action means that we should just display a message.
_message "$descr"
_message -e arguments "$descr"
return 1
elif [[ "$action" = \(\(*\)\) ]]; then

View File

@ -5,7 +5,7 @@ local suf usr grp req expl line
line=( "${(@)words[2,CURRENT-1]:#-*}" )
if [[ -prefix - ]]; then
_message option
_message -e options option
elif [[ $#line -eq 0 ]]; then
if [[ $service = chgrp ]] || compset -P '*[:.]'; then
if (( EGID && $+commands[groups] )); then # except for root

View File

@ -1120,6 +1120,22 @@ generated this way,
this will also cycle through the names of the files in pathname
components after the first ambiguous one.
)
kindex(fake, completion style)
item(tt(fake))(
This style may be set for every completion context and is used to
specify additional strings to complete in that context. It's values
are either the strings to complete with every colon quoted by a
preceding backslash or strings of the form
`var(string)tt(:)var(description)'. In the latter case the var(string)s
will be shown together with the var(description)s in completion
listings.
Note that you only really want to use this style for a narrow
enough context, so that the additional string won't show up in other
contexts. Also note the styles tt(fake-files) and tt(fake-parameters)
which give more control over additional strings to add when completing
files or parameters.
)
kindex(fake-files, completion style)
item(tt(fake-files))(
This style is used when completing files and looked up
@ -3676,7 +3692,8 @@ tt(_guard)), only the message will be displayed and if the `tt(-n)' is
followed by another character, only options are completed.
)
findex(_message)
item(tt(_message) [ -r ] var(descr))(
xitem(tt(_message) [ tt(-r) ] var(descr))
item(tt(_message -e) var(tag descr))(
The var(descr) is used like the third
argument to the tt(_description) function. However, the resulting
string will always be shown whether or not matches were
@ -3691,6 +3708,10 @@ If the tt(-r) option is given, no style is used and the var(descr) is
used literally as the string to display. This is only used in cases
where that string is taken from some pre-processed argument list
containing an expanded description.
In the second form, the var(descr) is added like a description added
by tt(_description) under the given var(tag), but the var(descr) will
always be shown even if no matches are added for the var(tag).
)
findex(_multi_parts)
item(tt(_multi_parts) var(sep) var(array))(

View File

@ -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 */

View File

@ -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);
}

View File

@ -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. */

View File

@ -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;

View File

@ -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;