diff options
author | Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp> | 2015-09-30 23:56:14 +0900 |
---|---|---|
committer | Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp> | 2015-09-30 23:56:14 +0900 |
commit | 756526eef3e064c3ffb023ae5e5e6df42e6e9162 (patch) | |
tree | f9dced207f2cdb07489d0ca511febf19d3d48319 | |
parent | 533658730745ae6261f9552aba01dc5346405d30 (diff) | |
download | zsh-756526eef3e064c3ffb023ae5e5e6df42e6e9162.tar.gz zsh-756526eef3e064c3ffb023ae5e5e6df42e6e9162.tar.xz zsh-756526eef3e064c3ffb023ae5e5e6df42e6e9162.zip |
36697: handle options of _arguments correctly
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Completion/Base/Utility/_arguments | 45 |
2 files changed, 28 insertions, 22 deletions
diff --git a/ChangeLog b/ChangeLog index 56e725cf0..498ad7c87 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2015-09-30 Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp> + + * 36697: Completion/Base/Utility/_arguments: handle options + of _arguments correctly + 2015-09-30 Peter Stephenson <p.stephenson@samsung.com> * 36711: Src/glob.c, Src/pattern.c: Memory for early unmetafied 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 |