mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-01-11 20:31:11 +01: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:
parent
f463b09b13
commit
3807c902a2
15 changed files with 113 additions and 59 deletions
14
ChangeLog
14
ChangeLog
|
@ -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,
|
||||
|
|
|
@ -36,7 +36,7 @@ if [[ -n "$compcontext" ]]; then
|
|||
|
||||
case "$action" in
|
||||
\ #)
|
||||
_message "$descr";;
|
||||
_message -e "$tag" "$descr";;
|
||||
|
||||
\(\(*\)\))
|
||||
eval ws\=\( "${action[3,-3]}" \)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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" &&
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))(
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue