mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			74 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| # 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.
 | |
| # 
 | |
| # -D behaves like -d, but pattern characters are active in the
 | |
| # function name, so any matching function will be deleted from the hook.
 | |
| #
 | |
| # 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 "dDU" opt; do
 | |
|   case $opt in
 | |
|     (d)
 | |
|     del=1
 | |
|     ;;
 | |
| 
 | |
|     (D)
 | |
|     del=2
 | |
|     ;;
 | |
| 
 | |
|     (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
 | |
|     if (( del == 2 )); then
 | |
|       set -A $hook ${(P)hook:#${~fn}}
 | |
|     else
 | |
|       set -A $hook ${(P)hook:#$fn}
 | |
|     fi
 | |
|     # 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
 |