From b0226d3cc8393bb4dd57d9e2e8f04ef885c43ab9 Mon Sep 17 00:00:00 2001 From: Tanaka Akira Date: Fri, 24 Mar 2000 12:37:56 +0000 Subject: zsh-workers/10231 --- Completion/Builtins/_zstyle | 1 + Completion/Commands/_next_tags | 45 ++++++++++++++++++++++++++++--- Completion/Core/_tags | 60 +++++++++++++++++++++++++++++------------- 3 files changed, 83 insertions(+), 23 deletions(-) (limited to 'Completion') diff --git a/Completion/Builtins/_zstyle b/Completion/Builtins/_zstyle index 2c9f6be3b..40a66a364 100644 --- a/Completion/Builtins/_zstyle +++ b/Completion/Builtins/_zstyle @@ -55,6 +55,7 @@ styles=( remove-all-dups c:bool single-ignored c:single-ignored sort c:bool + tag-aliases c:tag tag-order c:tag special-dirs c:sdirs squeeze-slashes c:bool diff --git a/Completion/Commands/_next_tags b/Completion/Commands/_next_tags index 028ba4d61..6d3389ff1 100644 --- a/Completion/Commands/_next_tags +++ b/Completion/Commands/_next_tags @@ -46,7 +46,7 @@ _next_tags_pre() { # Helper function for sorting tags. Most of this is copied from _tags. _next_tags_sort() { - local order tags tag nodef + local order tags tag nodef tmp tmp2 if ! zstyle -a ":completion:${curcontext}:" tag-order order; then if (( $+_comp_default_tags )); then @@ -69,12 +69,49 @@ _next_tags_sort() { case $tag in -) nodef=yes;; *\(\)) "${${tag%%[ ]#\(\)}##[ ]#}" "$@";; - \!*) comptry "${(@)argv:#(${(j:|:)~${=tag[2,-1]}})}";; - ?*) comptry ${=tag};; + \!*) comptry "${(@)argv:#(${(j:|:)~${=~tag[2,-1]}})}";; + ?*) tmp=( ${${(s: :)${tag//\\\\ /$'\0'}}//$'\0'/ } ) tmp2=() tmp3=() + for tag in "$tmp[@]"; do + if [[ "$tag" = *:* ]]; then + tmp2=( "$tmp2[@]" "${(@M)^argv:#${~tag%%:*}}:${tag#*:}" ) + else + for atag in "${(@M)argv:#${~tag}}"; do + if zstyle -a ":completion:${curcontext}:${atag}" tag-aliases als; then + tmp3=( "$tmp3[@]" "$als[@]" ) + tmp=( "${(@)tmp:#${atag}}" ) + else + tmp2=( "$tmp2[@]" "$atag" ) + fi + done + fi + done + + comptry "${(@)tmp2:#(${(j:|:)~${(q)tmp%%:*}})}" "$tmp3[@]" "$tmp[@]" + ;; esac done - [[ -z "$nodef" ]] && comptry "$@" + if [[ -z "$nodef" ]]; then + if (( $+_comp_default_tags )); then + for tag in "$_comp_default_tags[@]"; do + if zstyle -a ":completion:${curcontext}:${tag}" tag-aliases als; then + comptry "$als[@]" + else + comptry "$tag" + fi + done + else + tmp2=() + for tag; do + if zstyle -a ":completion:${curcontext}:${tag}" tag-aliases als; then + tmp2=( "$tmp2[@]" "$als[@]" ) + else + tmp2=( "$tmp2[@]" "$tag" ) + fi + done + comptry "$tmp2[@]" + fi + fi } [[ -o kshautoload ]] || _next_tags "$@" diff --git a/Completion/Core/_tags b/Completion/Core/_tags index 2dfa56f9d..a617776d4 100644 --- a/Completion/Core/_tags +++ b/Completion/Core/_tags @@ -16,7 +16,7 @@ if (( $# )); then # We have arguments: the tags supported in this context. - local curcontext="$curcontext" order tag nodef + local curcontext="$curcontext" order tag nodef tmp tmp2 tmp3 als atag if [[ "$1" = -C?* ]]; then curcontext="${curcontext%:*}:${1[3,-1]}" @@ -51,7 +51,13 @@ if (( $# )); then if [[ -n "$_sort_tags" ]]; then "$_sort_tags" "$@" - elif zstyle -a ":completion:${curcontext}:" tag-order order; then + else + zstyle -a ":completion:${curcontext}:" tag-order order || + if [[ "$*" = *(arguments|values)* || "$*" = *options* ]] ;then + order=( 'arguments values' options ) + else + order=() + fi for tag in $order; do case $tag in @@ -61,33 +67,49 @@ if (( $# )); then break fi ;; - \!*) comptry "${(@)argv:#(${(j:|:)~${=tag[2,-1]}})}";; - ?*) comptry ${${(ps: :)${tag//\\\\ /$'\0'}}//$'\0'/ };; + \!*) comptry "${(@)argv:#(${(j:|:)~${=~tag[2,-1]}})}";; + ?*) tmp=( ${${(s: :)${tag//\\\\ /$'\0'}}//$'\0'/ } ) tmp2=() tmp3=() + for tag in "$tmp[@]"; do + if [[ "$tag" = *:* ]]; then + tmp2=( "$tmp2[@]" "${(@M)^argv:#${~tag%%:*}}:${tag#*:}" ) + else + for atag in "${(@M)argv:#${~tag}}"; do + if zstyle -a ":completion:${curcontext}:${atag}" tag-aliases als; then + tmp3=( "$tmp3[@]" "$als[@]" ) + tmp=( "${(@)tmp:#${atag}}" ) + else + tmp2=( "$tmp2[@]" "$atag" ) + fi + done + fi + done + + comptry "${(@)tmp2:#(${(j:|:)~${(q)tmp%%:*}})}" "$tmp3[@]" "$tmp[@]" + ;; esac done if [[ -z "$nodef" ]]; then if (( $+_comp_default_tags )); then for tag in "$_comp_default_tags[@]"; do - comptry "$tag" + if zstyle -a ":completion:${curcontext}:${tag}" tag-aliases als; then + comptry "$als[@]" + else + comptry "$tag" + fi done else - comptry "$@" + tmp2=() + for tag; do + if zstyle -a ":completion:${curcontext}:${tag}" tag-aliases als; then + tmp2=( "$tmp2[@]" "$als[@]" ) + else + tmp2=( "$tmp2[@]" "$tag" ) + fi + done + comptry "$tmp2[@]" fi fi - else - - # Use default tags... - - if (( $+_comp_default_tags )); then - for tag in "$_comp_default_tags[@]"; do - comptry "$tag" - done - else - comptry arguments values - comptry options - fi - comptry "$@" fi # Return non-zero if at least one set of tags should be used. -- cgit 1.4.1