1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-23 16:40:24 +02:00

unposted: meant to add add-zsh-hook a while ago

This commit is contained in:
Peter Stephenson 2007-04-19 09:40:55 +00:00
parent fde7242cec
commit 0d101890d0
2 changed files with 66 additions and 0 deletions

View file

@ -0,0 +1,63 @@
# Add to HOOK the given FUNCTION.
# HOOK is one of chpwd, precmd, preexec, periodic, zshexit (the
# _functions subscript is not required).
#
# With -d, remove the function from the hook instead; delete the hook
# variable if it is empty.
#
# Without -d, the FUNCTION is marked for autoload; -U is passed down to
# autoload if that is given. (This is harmless if the function is actually
# defined inline.)
emulate -L zsh
local -a hooktypes
hooktypes=(chpwd precmd preexec periodic zshexit)
local opt
local -a autoopts
integer del
while getopts "d" opt; do
case $opt in
(d)
del=1
;;
(U)
autoopts+=(-$opt)
;;
(*)
return 1
;;
esac
done
shift $(( OPTIND - 1 ))
if (( $# != 2 || ${hooktypes[(I)$1]} == 0 )); then
print "Usage: $0 hook function\nValid hooks are:\n $hooktypes"
return 1
fi
local hook="${1}_functions"
local fn="$2"
if (( del )); then
# delete, if hook is set
if (( ${(P)+hook} )); then
set -A $hook ${(P)hook:#$fn}
# unset if no remaining entries --- this can give better
# performance in some cases
(( ${(P)#hook} )) || unset $hook
fi
else
if (( ${(P)+hook} )): then
if (( ${(P)hook[(I)$fn]} == 0 )); then
set -A $hook ${(P)hook} $fn
fi
else
set -A $hook $fn
fi
autoload $autoopts -- $fn
fi