mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-03 10:21:46 +02:00
zsh-workers/8749
This commit is contained in:
parent
003d108896
commit
616d348e39
2 changed files with 32 additions and 13 deletions
|
@ -165,8 +165,9 @@ _style -s options auto-description autod
|
|||
|
||||
if comparguments -i "$autod" "$@"; then
|
||||
local nm="$compstate[nmatches]" action noargs aret expl local
|
||||
local next direct odirect equal single match matched ws tmp1 tmp2
|
||||
local next direct odirect equal single match matched ws tmp1 tmp2 tmp3
|
||||
local opts subc prefix suffix
|
||||
local origpre="$PREFIX" origipre="$IPREFIX"
|
||||
|
||||
if comparguments -D descr action; then
|
||||
comparguments -C subc
|
||||
|
@ -254,11 +255,17 @@ if comparguments -i "$autod" "$@"; then
|
|||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -z "$matched" ]] && _requested options &&
|
||||
{ ! _style options prefix-needed ||
|
||||
[[ "$PREFIX" = [-+]* ]] } ; then
|
||||
comparguments -M match
|
||||
[[ "$origpre" = [-+]* ]] } ; then
|
||||
local prevpre="$PREFIX" previpre="$IPREFIX"
|
||||
|
||||
PREFIX="$origpre"
|
||||
IPREFIX="$origipre"
|
||||
|
||||
comparguments -M match
|
||||
|
||||
if comparguments -s single; then
|
||||
|
||||
_description expl option
|
||||
|
@ -271,11 +278,13 @@ if comparguments -i "$autod" "$@"; then
|
|||
compadd "$expl[@]" -QqS= - "${PREFIX}${SUFFIX}"
|
||||
else
|
||||
tmp1=( "$next[@]" "$direct[@]" "$odirect[@]" "$equal[@]" )
|
||||
tmp3=( "${(M@)tmp1:#[-+]?[^:]*}" )
|
||||
tmp1=( "${(M@)tmp1:#[-+]?(|:*)}" )
|
||||
tmp2=( "${PREFIX}${(@M)^${(@)${(@)tmp1%%:*}#[-+]}:#?}" )
|
||||
|
||||
_describe -o option \
|
||||
tmp1 tmp2 -Q -S ''
|
||||
tmp1 tmp2 -Q -S '' -- \
|
||||
tmp3 -Q
|
||||
fi
|
||||
single=yes
|
||||
else
|
||||
|
@ -285,11 +294,16 @@ if comparguments -i "$autod" "$@"; then
|
|||
direct -QS '' -M "$match" -- \
|
||||
equal -QqS= -M "$match"
|
||||
fi
|
||||
PREFIX="$prevpre"
|
||||
IPREFIX="$previpre"
|
||||
fi
|
||||
done
|
||||
if [[ -n "$opts" && -z "$aret$matched" &&
|
||||
nm -eq compstate[nmatches] ]]; then
|
||||
|
||||
PREFIX="$origpre"
|
||||
IPREFIX="$origipre"
|
||||
|
||||
prefix="${PREFIX#*\=}"
|
||||
suffix="$SUFFIX"
|
||||
PREFIX="${PREFIX%%\=*}"
|
||||
|
|
|
@ -941,13 +941,17 @@ ca_get_opt(Cadef d, char *line, int full, char **end)
|
|||
{
|
||||
Caopt p;
|
||||
|
||||
if (full) {
|
||||
/* The full string has to be an option. */
|
||||
/* The full string may be an option. */
|
||||
|
||||
for (p = d->opts; p; p = p->next)
|
||||
if (p->active && !strcmp(p->name, line))
|
||||
return p;
|
||||
} else {
|
||||
for (p = d->opts; p; p = p->next)
|
||||
if (p->active && !strcmp(p->name, line)) {
|
||||
if (end)
|
||||
*end = line + strlen(line);
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
if (!full) {
|
||||
/* The string from the line probably only begins with an option. */
|
||||
for (p = d->opts; p; p = p->next)
|
||||
if (p->active && ((!p->args || p->type == CAO_NEXT) ?
|
||||
|
@ -1160,7 +1164,7 @@ ca_parse_line(Cadef d)
|
|||
} LASTALLOC;
|
||||
ca_inactive(d, state.curopt->xor);
|
||||
|
||||
/* Collect the argument strings. MAybe. */
|
||||
/* Collect the argument strings. Maybe. */
|
||||
|
||||
if (state.def &&
|
||||
(state.curopt->type == CAO_DIRECT ||
|
||||
|
@ -1431,7 +1435,7 @@ bin_comparguments(char *nam, char **args, char *ops, int func)
|
|||
return 1;
|
||||
}
|
||||
case 'O':
|
||||
if (ca_laststate.opt) {
|
||||
if (ca_laststate.opt || (ca_laststate.doff && ca_laststate.def)) {
|
||||
LinkList next = newlinklist();
|
||||
LinkList direct = newlinklist();
|
||||
LinkList odirect = newlinklist();
|
||||
|
@ -1484,7 +1488,8 @@ bin_comparguments(char *nam, char **args, char *ops, int func)
|
|||
return 1;
|
||||
}
|
||||
case 's':
|
||||
if (ca_laststate.d->single && ca_laststate.singles) {
|
||||
if (ca_laststate.d->single && ca_laststate.singles &&
|
||||
ca_laststate.opt) {
|
||||
setsparam(args[1],
|
||||
ztrdup(ca_laststate.ddef ?
|
||||
(ca_laststate.ddef->type == CAO_DIRECT ?
|
||||
|
|
Loading…
Reference in a new issue