dot/shell-rc, dot/bashrc, dot/zshrc: Introduce a formal notion of hooks.
[profile] / dot / shell-rc
index 940f91b..582b94d 100644 (file)
@@ -15,6 +15,50 @@ __mdw_source_if_exists () {
 }
 
 ###--------------------------------------------------------------------------
+### Hooks.
+
+__mdw_addhook () {
+  local hk=$1 fn=$2 t
+
+  eval t=\${$hk+t}
+  case $t in t) ;; *) echo >&2 "unknown hook \`$hk'"; return 2; esac
+
+  eval t=\$$hk
+  case " $t " in
+    *" $fn "*) ;;
+    *) eval "$hk=\${$hk:+\$$hk }\$fn" ;;
+  esac
+}
+
+__mdw_delhook () {
+  local hk=$1 fn=$2 t l r
+
+  eval t=\${$hk+t}
+  case $t in t) ;; *) echo >&2 "unknown hook \`$hk'"; return 2; esac
+
+  eval t=\" \$$hk \"
+  case $t in
+    *" $fn "*)
+      l=${t%% $fn*} r=${t##*$fn }
+      l=${l# } r=${r% }
+      eval "$hk=\$l\${l:+ }\$r"
+      ;;
+  esac
+}
+
+__mdw_setrc () { return $1; }
+
+__mdw_runhook () {
+  local hk=$1 saverc=$? t i; shift
+
+  eval t=\${$hk+t}
+  case $t in t) ;; *) echo >&2 "unknown hook \`$hk'"; return 2; esac
+
+  eval t=\$$hk
+  for i in $t; do __mdw_setrc $saverc; "$i" "$@"; done
+}
+
+###--------------------------------------------------------------------------
 ### Prompt machinery.
 
 __mdw_set_prompt_hacks () { host=$(hostname); dir=""; }
@@ -101,18 +145,20 @@ __mdw_set_prompt () {
   esac
 }
 
-__mdw_precmd () {
-  __mdw_set_prompt
-  case ${STY+t} in
-    t) printf "\ek%s\e\\" "$__mdw_shell" ;;
-  esac
-}
+__mdw_screen_precmd () { printf "\ek%s\e\\" "$__mdw_shell"; }
+__mdw_screen_preexec () { printf "\ek%s\e\\" "$1"; }
 
-__mdw_preexec () {
-  case ${STY+t} in
-    t) printf "\ek%s\e\\" "$1" ;;
+if [ -t 0 ]; then
+  case ${STY+t},${__mdw_precmd_hook+t},${__mdw_preexec_hook+t} in
+    t,t,t)
+      __mdw_addhook __mdw_precmd_hook __mdw_screen_precmd
+      __mdw_addhook __mdw_preexec_hook __mdw_screen_preexec
+      ;;
   esac
-}
+  case ${__mdw_precmd_hook+t} in
+    t) __mdw_addhook __mdw_precmd_hook __mdw_set_prompt ;;
+  esac
+fi
 
 ###--------------------------------------------------------------------------
 ### Some handy aliases.