summaryrefslogtreecommitdiff
path: root/Completion/Base/Utility
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Base/Utility')
-rw-r--r--Completion/Base/Utility/_arguments2
-rw-r--r--Completion/Base/Utility/_call_program4
-rw-r--r--Completion/Base/Utility/_describe35
-rw-r--r--Completion/Base/Utility/_sequence22
-rw-r--r--Completion/Base/Utility/_store_cache11
5 files changed, 43 insertions, 31 deletions
diff --git a/Completion/Base/Utility/_arguments b/Completion/Base/Utility/_arguments
index d70c44259..1f35e8d43 100644
--- a/Completion/Base/Utility/_arguments
+++ b/Completion/Base/Utility/_arguments
@@ -26,7 +26,7 @@ if (( long )); then
if (( ! ${(P)+name} )); then
local iopts sopts pattern tmpo dir cur cache
- typeset -U lopts
+ typeset -Ua lopts
cache=()
diff --git a/Completion/Base/Utility/_call_program b/Completion/Base/Utility/_call_program
index b65764827..010e09476 100644
--- a/Completion/Base/Utility/_call_program
+++ b/Completion/Base/Utility/_call_program
@@ -2,8 +2,8 @@
local tmp err_fd=-1
-if (( ${debug_fd:--1} > 2 ))
-then exec {err_fd}>&2 # debug_fd is saved stderr, 2 is log file
+if (( ${debug_fd:--1} > 2 )) || [[ ! -t 2 ]]
+then exec {err_fd}>&2 # debug_fd is saved stderr, 2 is trace or redirect
else exec {err_fd}>/dev/null
fi
diff --git a/Completion/Base/Utility/_describe b/Completion/Base/Utility/_describe
index 1a9f52f5d..ab7200517 100644
--- a/Completion/Base/Utility/_describe
+++ b/Completion/Base/Utility/_describe
@@ -6,23 +6,28 @@ local _opt _expl _tmpm _tmpd _mlen _noprefix
local _type=values _descr _ret=1 _showd _nm _hide _args _grp _sep
local csl="$compstate[list]" csl2
local _oargv _argv _new _strs _mats _opts _i _try=0
+local OPTIND OPTARG
+local -a _jvx12
# Get the option.
-if [[ "$1" = -o ]]; then
- _type=options
- shift
-elif [[ "$1" = -O ]]; then
- _type=options
- _noprefix=1
- shift
-elif [[ "$1" = -t ]]; then
- _type="$2"
- shift 2
-elif [[ "$1" = -t* ]]; then
- _type="${1[3,-1]}"
- shift
-fi
+while getopts "oOt:12JVx" _opt; do
+ case $_opt in
+ (o)
+ _type=options;;
+ (O)
+ _type=options
+ _noprefix=1
+ ;;
+ (t)
+ _type="$OPTARG"
+ ;;
+ (1|2|J|V|x)
+ _jvx12+=(-$_opt)
+ esac
+done
+shift $(( OPTIND - 1 ))
+unset _opt
[[ "$_type$_noprefix" = options && ! -prefix [-+]* ]] && \
zstyle -T ":completion:${curcontext}:options" prefix-needed &&
@@ -53,7 +58,7 @@ fi
_tags "$_type"
while _tags; do
- while _next_label "$_type" _expl "$_descr"; do
+ while _next_label $_jvx12 "$_type" _expl "$_descr"; do
if (( $#_grp )); then
diff --git a/Completion/Base/Utility/_sequence b/Completion/Base/Utility/_sequence
index 391e5f78f..f52955f46 100644
--- a/Completion/Base/Utility/_sequence
+++ b/Completion/Base/Utility/_sequence
@@ -7,11 +7,11 @@
# -s sep : specify separator [defaults to comma]
# -d : duplicate values allowed
-local curcontext="$curcontext" nm="$compstate[nmatches]" pre nosep minus
+local curcontext="$curcontext" nm="$compstate[nmatches]" pre qsep nosep minus
local -a sep num pref suf end uniq dedup
zparseopts -D -a opts s:=sep n:=num p:=pref i:=pref P:=pref I:=suf S:=suf q=suf r:=suf R:=suf C:=cont d=uniq M: J: X: x:
-(( $#cont )) && curcontext="$curcontext%:*}:$cont[2]"
+(( $#cont )) && curcontext="${curcontext%:*}:$cont[2]"
(( $#sep )) || sep[2]=,
if (( $+suf[(r)-S] )); then
@@ -19,20 +19,20 @@ if (( $+suf[(r)-S] )); then
(( $#end )) && compset -S ${end}\* && suf=() && nosep=1
fi
+qsep="${sep[2]}"
+compquote -p qsep
if (( ! $#uniq )); then
(( $+pref[(r)-P] )) && pre="${(q)pref[pref[(i)-P]+1]}"
- typeset -T unique="${PREFIX#$pre}" uniq $sep[2]
- dedup=( ${(q)uniq[1,-2]} )
- unique="${SUFFIX}"
- dedup+=( ${(q)uniq[2,-1]} )
+ dedup=( "${(@)${(@ps.$qsep.)PREFIX#$pre}[1,-2]}" "${(@)${(@ps.$qsep.)SUFFIX}[2,-1]}" )
+ [[ -n $compstate[quoting] ]] || dedup=( ${(Q)dedup} )
fi
-if (( ! $#num )) || (( num[2] > 1 )) && ! compset -P $(( num[2] - 1 )) \*$sep[2]; then
- (( nosep )) || suf=( -S $sep[2] -r "$end[1]${sep[2][1]} \t\n\-" )
- compset -S ${sep[2]}\* && suf=()
- compset -P \*$sep[2] && pref=()
-else
+if (( $#num )) && compset -P $(( num[2] - 1 )) \*${(q)qsep}; then
pref=()
+else
+ (( ! nosep && (!$#num || num[2] > 1) )) && suf=( -S ${qsep} -r "$end[1]${(q)qsep[1]} \t\n\-" )
+ compset -S ${(q)qsep}\* && suf=()
+ compset -P \*${(q)qsep} && pref=()
fi
(( minus = argv[(ib:2:)-] ))
diff --git a/Completion/Base/Utility/_store_cache b/Completion/Base/Utility/_store_cache
index 86e72e9a9..8feaee6f7 100644
--- a/Completion/Base/Utility/_store_cache
+++ b/Completion/Base/Utility/_store_cache
@@ -46,8 +46,15 @@ if zstyle -t ":completion:${curcontext}:" use-cache; then
for var; do
case ${(Pt)var} in
(*readonly*) ;;
- (*(association|array)*) print -r "$var=( ${(kv@Pqq)^^var} )";;
- (*) print -r "$var=${(Pqq)^^var}";;
+ (*(association|array)*)
+ # Dump the array as a here-document to reduce parsing overhead
+ # when reloading the cache with "source" from _retrieve_cache
+ print -r "$var=( "'"${(zQ)$(<<\EO:'"$var"
+ print -r "${(kv@Pqq)^^var}"
+ print -r "EO:$var"
+ print -r ')}" )'
+ ;;
+ (*) print -r "$var=${(Pqq)^^var}";;
esac
done >! "$_cache_dir/$_cache_ident"
else