summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2007-04-19 09:40:55 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2007-04-19 09:40:55 +0000
commit0d101890d0faeaefa863099042e3510f5021fbc3 (patch)
tree427cf15d05e08c18c97719f523fbb3039b7b7622
parentfde7242cec96e278864f37db03a14028767428d5 (diff)
downloadzsh-0d101890d0faeaefa863099042e3510f5021fbc3.tar.gz
zsh-0d101890d0faeaefa863099042e3510f5021fbc3.zip
unposted: meant to add add-zsh-hook a while ago
-rw-r--r--ChangeLog3
-rw-r--r--Functions/Misc/add-zsh-hook63
2 files changed, 66 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 61a06fd74..92e2820ba 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2007-04-19 Peter Stephenson <pws@csr.com>
+ * unposted: Functions/Misc/add-zsh-hook: should have been
+ added ages ago but wasn't.
+
* README, Config/version.mk, Etc/FAQ.yo: release 4.3.4.
2007-04-17 Wayne Davison <wayned@users.sourceforge.net>
diff --git a/Functions/Misc/add-zsh-hook b/Functions/Misc/add-zsh-hook
new file mode 100644
index 000000000..fa8015a3d
--- /dev/null
+++ b/Functions/Misc/add-zsh-hook
@@ -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