From 756526eef3e064c3ffb023ae5e5e6df42e6e9162 Mon Sep 17 00:00:00 2001 From: Jun-ichi Takimoto Date: Wed, 30 Sep 2015 23:56:14 +0900 Subject: 36697: handle options of _arguments correctly --- Completion/Base/Utility/_arguments | 45 +++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 22 deletions(-) (limited to 'Completion') diff --git a/Completion/Base/Utility/_arguments b/Completion/Base/Utility/_arguments index 1f35e8d43..87fb20e6b 100644 --- a/Completion/Base/Utility/_arguments +++ b/Completion/Base/Utility/_arguments @@ -8,15 +8,33 @@ local oldcontext="$curcontext" hasopts rawret optarg singopt alwopt local setnormarg start rest local -a match mbegin mend +subopts=() +singopt=() +while [[ "$1" = -([AMO]*|[CRSWnsw]) ]]; do + case "$1" in + -C) usecc=yes; shift ;; + -O) subopts=( "${(@P)2}" ); shift 2 ;; + -O*) subopts=( "${(@P)${1[3,-1]}}" ); shift ;; + -R) rawret=yes; shift;; + -n) setnormarg=yes; NORMARG=-1; shift;; + -w) optarg=yes; shift;; + -W) alwopt=arg; shift;; + -[Ss]) singopt+=( $1 ); shift;; + -[AM]) singopt+=( $1 $2 ); shift 2 ;; + -[AM]*) singopt+=( $1 ); shift ;; + esac +done + +[[ $1 = ':' ]] && shift +singopt+=( ':' ) # always end with ':' to indicate the end of options + +[[ "$PREFIX" = [-+] ]] && alwopt=arg + long=$argv[(I)--] if (( long )); then local name tmp tmpargv - if [[ long -eq 1 ]]; then - tmpargv=() - else - tmpargv=( "${(@)argv[1,long-1]}" ) - fi + tmpargv=( "${(@)argv[1,long-1]}" ) # optspec's before --, if any name=${~words[1]} [[ "$name" = [^/]*/* ]] && name="$PWD/$name" @@ -290,23 +308,6 @@ if (( long )); then set -- "$tmpargv[@]" "${(@P)name}" fi -subopts=() -singopt=() -while [[ "$1" = -(O*|[CRWnsw]) ]]; do - case "$1" in - -C) usecc=yes; shift ;; - -O) subopts=( "${(@P)2}" ); shift 2 ;; - -O*) subopts=( "${(@P)${1[3,-1]}}" ); shift ;; - -R) rawret=yes; shift;; - -n) setnormarg=yes; NORMARG=-1; shift;; - -w) optarg=yes; shift;; - -s) singopt=(-s); shift;; - -W) alwopt=arg; shift;; - esac -done - -[[ "$PREFIX" = [-+] ]] && alwopt=arg - zstyle -s ":completion:${curcontext}:options" auto-description autod if (( $# )) && comparguments -i "$autod" "$singopt[@]" "$@"; then -- cgit 1.4.1