untie () { emulate -L zsh -o extendedglob -o errreturn while ((ARGC)) do () { case ${(tP)1} in (*right_zeros*) set -- $1 -Z${${(M@)$(typeset +m $1):#[[:digit:]]#}[1]} ;; esac case ${(tP)1} in (*left*) set -- "$@" -L${${(M@)$(typeset +m $1):#[[:digit:]]#}[1]} ;; (*right_blanks*) set -- "$@" -R${${(M@)$(typeset +m $1):#[[:digit:]]#}[1]} ;; esac if [[ ${(tP)1} = *export* ]] then set -- $1 -x ${argv[2,$#]} else set -- $1 -g ${argv[2,$#]} fi set ${(s:-:tP)1} - $1 ${argv[2,$#]} while [[ $1 != - ]] do case $1 in (tag) set -- "$@" -t ;; (unique) set -- "$@" -U ;; (upper) set -- "$@" -u ;; (lower) set -- "$@" -l ;; (hide) set -- "$@" -h ;; (hideval) set -- "$@" -H ;; esac shift done shift case ${(tP)1} in (array*tied*) set -- $1 $# "$@" $1 "${(@P)1}" unset $1 typeset -a ${argv[4,$2+2]} $1 shift $2+2 set -A "$@" ;; (scalar*tied*) set -- "$@" $1=${(P)1} unset $1 shift typeset "$@" ;; (*tied*) print -u2 -r "Can't untie ${(qqq)1}: ${(tP)1}" ;; (*) : "${1}: not a tied parameter" ;; esac } $1 shift done }