diff options
author | Tanaka Akira <akr@users.sourceforge.net> | 1999-08-23 10:07:17 +0000 |
---|---|---|
committer | Tanaka Akira <akr@users.sourceforge.net> | 1999-08-23 10:07:17 +0000 |
commit | f7fa32f091420552d5dbb16ff5f574484508f1de (patch) | |
tree | 82be5f077e6cdddad82a015f77a0308d825cd951 /Completion/Base | |
parent | 16060224ac17a8b5a1efb8568643f9a15b14c034 (diff) | |
download | zsh-f7fa32f091420552d5dbb16ff5f574484508f1de.tar.gz zsh-f7fa32f091420552d5dbb16ff5f574484508f1de.tar.xz zsh-f7fa32f091420552d5dbb16ff5f574484508f1de.zip |
zsh-workers/7463
Diffstat (limited to 'Completion/Base')
-rw-r--r-- | Completion/Base/_arguments | 289 | ||||
-rw-r--r-- | Completion/Base/_brace_parameter | 9 | ||||
-rw-r--r-- | Completion/Base/_condition | 5 | ||||
-rw-r--r-- | Completion/Base/_long_options | 41 | ||||
-rw-r--r-- | Completion/Base/_math | 5 | ||||
-rw-r--r-- | Completion/Base/_parameter | 4 | ||||
-rw-r--r-- | Completion/Base/_tilde | 2 | ||||
-rw-r--r-- | Completion/Base/_vars | 3 |
8 files changed, 182 insertions, 176 deletions
diff --git a/Completion/Base/_arguments b/Completion/Base/_arguments index 120c50934..86cd1c498 100644 --- a/Completion/Base/_arguments +++ b/Completion/Base/_arguments @@ -6,7 +6,7 @@ setopt localoptions extendedglob local long args rest ws cur nth def nm expl descr action opt arg tmp -local single uns ret=1 soptseq soptseq1 sopts prefix +local single uns ret=1 soptseq soptseq1 sopts prefix line # Associative arrays used to collect information about the options. @@ -117,182 +117,185 @@ else sopts='' fi -if [[ $#long -ne 0 && "$PREFIX" = --* ]]; then - - # If the current words starts with `--' and we should use long - # options, just call... +# Parse the command line... - _long_options "$long[@]" -else +ws=( "${(@)words[2,-1]}" ) +cur=$(( CURRENT-2 )) +nth=1 +liine=( "$words[1]" ) - # Otherwise parse the command line... +# ...until the current word is reached. - ws=( "${(@)words[2,-1]}" ) - cur=$(( CURRENT-2 )) - nth=1 +while [[ cur -gt 0 ]]; do - # ...until the current word is reached. + # `def' holds the description for the option we are currently after. + # Check if the next argument for the option is optional. - while [[ cur -gt 0 ]]; do + if [[ "$def" = :* ]]; then + opt=yes + else + opt='' + fi + arg='' - # `def' holds the description for the option we are currently after. - # Check if the next argument for the option is optional. + # Remove one description/action pair from `def' if that isn't empty. - if [[ "$def" = :* ]]; then - opt=yes + if [[ -n "$def" ]]; then + if [[ "$def" = ?*:*:* ]]; then + def="${def#?*:*:}" else - opt='' + def='' fi - arg='' + else - # Remove one description/action pair from `def' if that isn't empty. + # If it is empty, and the word starts with `--' and we should + # complete long options, just ignore this word, otherwise make sure + # we test for options below and handle normal arguments. - if [[ -n "$def" ]]; then - if [[ "$def" = ?*:*:* ]]; then - def="${def#?*:*:}" - else - def='' - fi + if [[ $#long -eq 0 || "$ws[1]" != --* ]]; then + opt=yes + arg=yes else + def='' + fi + fi - # If it is empty, and the word starts with `--' and we should - # complete long options, just ignore this word, otherwise make sure - # we test for options below and handle normal arguments. + if [[ -n "$opt" ]]; then - if [[ $#long -eq 0 || "$ws[1]" != --* ]]; then - opt=yes - arg=yes - else - def='' - fi - fi + # `opt' was set above if we have to test if the word is an option. + # We first test for the simple options -- those without arguments or + # those whose arguments have to be given as separate words. - if [[ -n "$opt" ]]; then + if (( $+opts[$ws[1]] )); then - # `opt' was set above if we have to test if the word is an option. - # We first test for the simple options -- those without arguments or - # those whose arguments have to be given as separate words. + # Options that may only be given once are removed from the + # associative array so that we don't offer them again. - if (( $+opts[$ws[1]] )); then + def="$opts[$ws[1]]" + [[ -n "$oneshot[$ws[1]]" ]] && unset "opts[$ws[1]]" + else + uns='' + if [[ -n "$sopts" && "$ws[1]" = [-+]${~soptseq}[$sopts] ]]; then + tmp="${ws[1][1]}${ws[1][-1]}" + if (( $+opts[$tmp] )); then + def="$opts[$tmp]" + uns="${ws[1][2,-1]}" + opt='' + fi + fi - # Options that may only be given once are removed from the - # associative array so that we don't offer them again. + # If the word is none of the simple options, test for those + # whose first argument has to or may come directly after the + # option. This is done in two loops looking very much alike. - def="$opts[$ws[1]]" - [[ -n "$oneshot[$ws[1]]" ]] && unset "opts[$ws[1]]" - else - uns='' - if [[ -n "$sopts" && "$ws[1]" = [-+]${~soptseq}[$sopts] ]]; then - tmp="${ws[1][1]}${ws[1][-1]}" - if (( $+opts[$tmp] )); then - def="$opts[$tmp]" - uns="${ws[1][2,-1]}" - opt='' - fi - fi + if [[ -n "$opt" && $#dopts -ne 0 ]]; then - # If the word is none of the simple options, test for those - # whose first argument has to or may come directly after the - # option. This is done in two loops looking very much alike. + # First we get the option names. - if [[ -n "$opt" && $#dopts -ne 0 ]]; then + tmp=( "${(@k)dopts}" ) - # First we get the option names. + # Then we loop over them and see if the current word begins + # with one of the option names. - tmp=( "${(@k)dopts}" ) + while (( $#tmp )); do + if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then + if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then + uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}" + break; + fi + elif [[ "$ws[1]" = ${tmp[1]}* ]]; then + break + fi + shift 1 tmp + done - # Then we loop over them and see if the current word begins - # with one of the option names. + if (( $#tmp )); then - while (( $#tmp )); do - if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then - if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then - uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}" - break; - fi - elif [[ "$ws[1]" = ${tmp[1]}* ]]; then - break + # It does. So use the description for it, but only from + # the second argument on, because we are searching the + # description for the next command line argument. + + opt='' + def="$dopts[$tmp[1]]" + [[ -n "$oneshot[$tmp[1]]" ]] && unset "dopts[$tmp[1]]" + if [[ "$def" = ?*:*:* ]]; then + def="${def#?*:*:}" + else + def='' + fi + fi + fi + if [[ -n "$opt" && $#odopts -ne 0 ]]; then + tmp=( "${(@k)odopts}" ) + while (( $#tmp )); do + if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then + if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then + uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}" + break; fi - shift 1 tmp - done + elif [[ "$ws[1]" = ${tmp[1]}* ]]; then + break + fi + shift 1 tmp + done - if (( $#tmp )); then + if (( $#tmp )); then + opt='' + def="$odopts[$tmp[1]]" + [[ -n "$oneshot[$tmp[1]]" ]] && unset "odopts[$tmp[1]]" - # It does. So use the description for it, but only from - # the second argument on, because we are searching the - # description for the next command line argument. + # For options whose first argument *may* come after the + # option, we skip over the first description only if there + # is something after the option name on the line. - opt='' - def="$dopts[$tmp[1]]" - [[ -n "$oneshot[$tmp[1]]" ]] && unset "dopts[$tmp[1]]" + if [[ ( -z "$sopts" && "$ws[1]" != "$tmp[1]" ) || + ( -n "$sopts" && ( ( $tmp[1] = [-+]? && "$ws[1]" != "${tmp[1][1]}"${~soptseq}"${tmp[1][2]}" ) || + ( $tmp[1] != [-+]? && "$ws[1]" != "$tmp[1]" ) ) ) ]]; then if [[ "$def" = ?*:*:* ]]; then def="${def#?*:*:}" else def='' - fi - fi - fi - if [[ -n "$opt" && $#odopts -ne 0 ]]; then - tmp=( "${(@k)odopts}" ) - while (( $#tmp )); do - if [[ -n "$sopts" && $tmp[1] = [-+]? ]]; then - if [[ "$ws[1]" = ${tmp[1][1]}${~soptseq}${tmp[1][2]}* ]]; then - uns="${ws[1][2,-1]%%${tmp[1][2]}*}${tmp[1][2]}" - break; - fi - elif [[ "$ws[1]" = ${tmp[1]}* ]]; then - break - fi - shift 1 tmp - done - - if (( $#tmp )); then - opt='' - def="$odopts[$tmp[1]]" - [[ -n "$oneshot[$tmp[1]]" ]] && unset "odopts[$tmp[1]]" - - # For options whose first argument *may* come after the - # option, we skip over the first description only if there - # is something after the option name on the line. - - if [[ ( -z "$sopts" && "$ws[1]" != "$tmp[1]" ) || - ( -n "$sopts" && ( ( $tmp[1] = [-+]? && "$ws[1]" != "${tmp[1][1]}"${~soptseq}"${tmp[1][2]}" ) || - ( $tmp[1] != [-+]? && "$ws[1]" != "$tmp[1]" ) ) ) ]]; then - if [[ "$def" = ?*:*:* ]]; then - def="${def#?*:*:}" - else - def='' - fi - fi - fi + fi + fi fi + fi - [[ -n "$sopts" && -n "$opt" && "$ws[1]" = [-+]${~soptseq} ]] && \ - uns="${ws[1][2,-1]}" + [[ -n "$sopts" && -n "$opt" && "$ws[1]" = [-+]${~soptseq} ]] && \ + uns="${ws[1][2,-1]}" - if [[ -n "$uns" ]]; then - uns="${(j::)${(@k)oneshot[(I)${ws[1][1]}[$uns]]#[-+]}}" - unset "opts[${(@)^opts[(I)${ws[1][1]}[$uns]]}]" \ - "dopts[${(@)^dopts[(I)${ws[1][1]}[$uns]]}]" \ - "odopts[${(@)^odopts[(I)${ws[1][1]}[$uns]]}]" - fi + if [[ -n "$uns" ]]; then + uns="${(j::)${(@k)oneshot[(I)${ws[1][1]}[$uns]]#[-+]}}" + unset "opts[${(@)^opts[(I)${ws[1][1]}[$uns]]}]" \ + "dopts[${(@)^dopts[(I)${ws[1][1]}[$uns]]}]" \ + "odopts[${(@)^odopts[(I)${ws[1][1]}[$uns]]}]" + fi - # If we didn't find a matching option description and we were - # told to use normal argument descriptions, just increase - # our counter `nth'. + # If we didn't find a matching option description and we were + # told to use normal argument descriptions, just increase + # our counter `nth'. - if [[ -n "$opt" && -n "$arg" ]]; then - def='' - (( nth++ )) - fi + if [[ -n "$opt" && -n "$arg" ]]; then + def='' + line=( "$line[@]" "$ws[1]" ) + (( nth++ )) fi fi + fi - shift 1 ws - (( cur-- )) - done + shift 1 ws + (( cur-- )) +done + +# Now generate the matches. + +if [[ $#long -ne 0 && "$PREFIX" = --* ]]; then - # Now generate the matches. + # If the current words starts with `--' and we should use long + # options, just call... + + _long_options "$long[@]" + +else nm="$compstate[nmatches]" @@ -379,9 +382,11 @@ else _description expl option if [[ -n "$sopts" && -n "$PREFIX" && "$PREFIX" = [-+]${~soptseq}[$sopts] ]]; then if [[ "$PREFIX" = [-+]${~soptseq1} ]]; then - compadd "$expl[@]" -Q - "${PREFIX}${(@k)^opts[(I)${PREFIX[1]}?]#?}" \ - "${PREFIX}${(@k)^dopts[(I)${PREFIX[1]}?]#?}" \ - "${PREFIX}${(@k)^odopts[(I)${PREFIX[1]}?]#?}" && ret=0 + compadd "$expl[@]" -Q \ + -y "( ${(k)opts} ${(k)dopts} ${(k)odopts} )" - \ + "${PREFIX}${(@k)^opts[(I)${PREFIX[1]}?]#?}" \ + "${PREFIX}${(@k)^dopts[(I)${PREFIX[1]}?]#?}" \ + "${PREFIX}${(@k)^odopts[(I)${PREFIX[1]}?]#?}" && ret=0 else # The last option takes an argument in next word. compadd "$expl[@]" -Q - "${PREFIX}" && ret=0 @@ -418,11 +423,17 @@ else # An empty action means that we should just display a message. _message "$descr" return ret - elif [[ "$action[1]" = \( ]]; then + elif [[ "$action[1]" = \(*\) ]]; then # Anything inside `(...)' is added directly. compadd "$expl[@]" - ${=action[2,-2]} + elif [[ "$action" = \{*\} ]]; then + + # A string in braces is evaluated. + + eval "$action[2,-2]" + elif [[ "$action" = \ * ]]; then # If the action starts with a space, we just call it. diff --git a/Completion/Base/_brace_parameter b/Completion/Base/_brace_parameter index 767743281..4a91dde73 100644 --- a/Completion/Base/_brace_parameter +++ b/Completion/Base/_brace_parameter @@ -2,16 +2,17 @@ setopt localoptions extendedglob -local lp ls n q suf='' +local lp ls n q if [[ "$SUFFIX" = *\}* ]]; then ISUFFIX="${SUFFIX#*\}}$ISUFFIX" SUFFIX="${SUFFIX%%\}*}" + suf=() elif [[ "$LBUFFER" = *\$\{[^}]#\$\{[^}]#$PREFIX || "$compstate[insert]" = *menu* ]]; then - suf='}' + suf=(-b '') else - suf='} ' + suf=(-b ' ') fi lp="$LBUFFER[1,-${#PREFIX}-1]" @@ -21,4 +22,4 @@ q=${(M)lp%%\"#} [[ n -gt 0 ]] && suf='' -_parameters -Qs "${q[1,-n-1]}" -S "$suf" -r '-:?#%+=[/}' +_parameters "$suf[@]" -Qs "${q[1,-n-1]}" -r '-:?#%+=[/}' diff --git a/Completion/Base/_condition b/Completion/Base/_condition index afac03195..84c9fea20 100644 --- a/Completion/Base/_condition +++ b/Completion/Base/_condition @@ -7,11 +7,10 @@ if [[ "$prev" = -o ]]; then elif [[ "$prev" = -([no]t|ef) ]]; then _files else - local ret=1 expl + local ret=1 _files && ret=0 - _description expl parameter - compgen "$expl[@]" -v && ret=0 + _parameters && ret=0 return ret fi diff --git a/Completion/Base/_long_options b/Completion/Base/_long_options index 0080a48b6..716ff8884 100644 --- a/Completion/Base/_long_options +++ b/Completion/Base/_long_options @@ -112,8 +112,9 @@ if [[ "$tmp" != $_lo_cache_cmd ]]; then # those hyphens and anything from the space or comma after the # option up to the end. - opts=("--${(@)^${(@)${(@M)${(@ps:\n:j:\n:)${(@)${(@M)${(@f)$("$words[1]" --help)}:#[ ]#-*}//,/ -}}:#[ ]#--*}#*--}%%[, ]*}") + opts=("--${(@)^${(@)${(@)${(@M)${(@ps:\n:j:\n:)${(@)${(@M)${(@f)$("$words[1]" --help 2>&1)//\[--/ +--}:#[ ]#-*}//,/ +}}:#[ ]#--*}#*--}%%[, ]*}:#}") # Now remove all ignored options ... @@ -256,15 +257,15 @@ if [[ "$str" = *\=* ]]; then _description expl "$descr" - if [[ "$action[1]" = (\[|\() ]]; then + if [[ "$action[1]" = (\[*\]|\(*\)) ]]; then compadd "$expl[@]" - ${=action[2,-2]} - elif (( $#action )); then - if [[ "$action" = \ * ]]; then - ${(e)=~action} - else - action=($=action) - ${(e)action[1]} "$expl[@]" ${(e)~action[2,-1]} - fi + elif [[ "$action" = \{*\} ]]; then + eval "$action[2,-2]" + elif [[ "$action" = \ * ]]; then + ${(e)=~action} + elif [[ -n "$action" ]]; then + action=($=action) + ${(e)action[1]} "$expl[@]" ${(e)~action[2,-1]} else _message "$descr" fi @@ -308,15 +309,15 @@ if [[ "$str" = *\=* ]]; then _description expl "$partd" - if (( $#parta )); then - if [[ "$parta[1]" = (\[|\() ]]; then - compadd "$expl[@]" - ${=parta[2,-2]} - elif [[ "$parta" = \ * ]]; then - ${(e)=~parta} - else - action=($=parta) - ${(e)~parta[1]} "$expl[@]" ${(e)~action[2,-1]} - fi + if [[ "$parta[1]" = (\[*\]|\(*\)) ]]; then + compadd "$expl[@]" - ${=parta[2,-2]} + elif [[ "$parta" = \{*\} ]]; then + eval "$parta[2,-2]" + elif [[ "$parta" = \ * ]]; then + ${(e)=~parta} + elif [[ -n "$parta" ]]; then + action=($=parta) + ${(e)~action[1]} "$expl[@]" ${(e)~action[2,-1]} else compadd -S '' - "$PREFIX" fi @@ -346,8 +347,6 @@ fi anum=1 for name in "$_lo_cache_names[@]"; do - action="$_lo_cache_actions[anum]" - _description expl option if [[ "$name" = *_optarg_* ]]; then diff --git a/Completion/Base/_math b/Completion/Base/_math index 82b97fe4a..b9743d6b4 100644 --- a/Completion/Base/_math +++ b/Completion/Base/_math @@ -1,7 +1,5 @@ #compdef -math- -local expl - if [[ "$PREFIX" = *[^a-zA-Z0-9_]* ]]; then IPREFIX="$IPREFIX${PREFIX%%[a-zA-Z0-9_]#}" PREFIX="${PREFIX##*[^a-zA-Z0-9_]}" @@ -11,5 +9,4 @@ if [[ "$SUFFIX" = *[^a-zA-Z0-9_]* ]]; then SUFFIX="${SUFFIX%%[^a-zA-Z0-9_]*}" fi -_description expl parameter -compgen "$expl[@]" -v +_parameters diff --git a/Completion/Base/_parameter b/Completion/Base/_parameter index 5f6f56db2..aa9e3ce01 100644 --- a/Completion/Base/_parameter +++ b/Completion/Base/_parameter @@ -1,7 +1,7 @@ #compdef -parameter- if [[ "$compstate[insert]" = *menu* ]]; then - _parameters + _parameters -s '' else - _parameters -S ' ' -r '[' + _parameters -s ' ' fi diff --git a/Completion/Base/_tilde b/Completion/Base/_tilde index f249d4ffa..cab371216 100644 --- a/Completion/Base/_tilde +++ b/Completion/Base/_tilde @@ -41,7 +41,7 @@ else if (( $# )); then d=( "$@" ) else - _description d user + _description d 'user or named directory' fi fi diff --git a/Completion/Base/_vars b/Completion/Base/_vars index 5a06488a5..a81a49f48 100644 --- a/Completion/Base/_vars +++ b/Completion/Base/_vars @@ -20,6 +20,5 @@ if [[ $PREFIX = *\[* ]]; then compadd "$expl[@]" $addclose - ${(kP)var} fi else - _description expl parameter - compgen "$expl[@]" -v + _parameter fi |