]> ruderich.org/simon Gitweb - config/dotfiles.git/commitdiff
zsh/rc: Display running time for long running processes.
authorSimon Ruderich <simon@ruderich.org>
Thu, 20 Dec 2012 16:54:04 +0000 (17:54 +0100)
committerSimon Ruderich <simon@ruderich.org>
Thu, 20 Dec 2012 16:55:54 +0000 (17:55 +0100)
Also send a bell to the terminal when the process is done.

zsh/rc

diff --git a/zsh/rc b/zsh/rc
index aa195f28b167da25b030ec5e20aef1cc1dfec0ad..c3fd79fc9544cdd7b1fb493ef8c318cf9eff64dc 100644 (file)
--- a/zsh/rc
+++ b/zsh/rc
@@ -265,6 +265,46 @@ else
     RUN_VCS_INFO=
 fi
 
+typeset -a longrun_data
+longrun_data=()
+# Display runtime in seconds for long running programs (> 60 seconds) and send
+# a bell to notify me.
+longrun_preexec() {
+    # Don't track the time for certain (possible) long running processes which
+    # need no automatic notification.
+    for ignore in elinks man mutt vim; do
+        case $3 in
+            $ignore | $ignore\ *)
+                longrun_data=()
+                return
+                ;;
+        esac
+    done
+
+    longrun_data=("$3" $EPOCHSECONDS)
+}
+longrun_precmd() {
+    # No previous timestamp available or disabled for this command, ignore.
+    if [[ -z $longrun_data ]]; then
+        return
+    fi
+
+    local difference=$(( EPOCHSECONDS - longrun_data[2] ))
+    if [[ $difference -gt 60 ]]; then
+        echo
+        echo -n "${fg[yellow]}"
+        echo -n "~> ${(V)longrun_data[1]} took $difference seconds."
+        echo -n "${fg[default]}"
+        echo    "\a" # send bell
+    fi
+
+    # Clear status. Prevents displaying old status information when pressing
+    # enter with an empty command line.
+    longrun_data=()
+}
+preexec_functions+=(longrun_preexec)
+precmd_functions+=(longrun_precmd)
+
 # Set the prompt. A two line prompt is used. On the top left the current
 # working directory is displayed, on the right vcs_info (if available) and the
 # current time in hex. On the bottom left current user name and host is shown,