From 616d348e392e87d491abe5dab2068704aafb00e5 Mon Sep 17 00:00:00 2001 From: Tanaka Akira Date: Tue, 23 Nov 1999 14:24:39 +0000 Subject: zsh-workers/8749 --- Completion/Base/_arguments | 22 ++++++++++++++++++---- Src/Zle/computil.c | 23 ++++++++++++++--------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/Completion/Base/_arguments b/Completion/Base/_arguments index 0a3ffc021..031ed90cf 100644 --- a/Completion/Base/_arguments +++ b/Completion/Base/_arguments @@ -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%%\=*}" diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c index 15db89bdf..fd39e255b 100644 --- a/Src/Zle/computil.c +++ b/Src/Zle/computil.c @@ -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 ? -- cgit 1.4.1