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