]> ruderich.org/simon Gitweb - config/dotfiles.git/blobdiff - zsh/rc
zsh/rc: Display running time for long running processes.
[config/dotfiles.git] / zsh / rc
diff --git a/zsh/rc b/zsh/rc
index ad641b9b3fbab962e721846d8d240b125e59af7d..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,
@@ -672,20 +712,22 @@ fi
     command tree -C "$@" | less
 }
 
-# Choose the "best" PDF viewer available: zathura, then xpdf. Also setup
-# completion for `pdf`.
-if (( $+commands[zathura] )); then
+# Choose the "best" PDF viewer available: xpdf, then zathura (in the past
+# zathura was preferred, but recent versions are completely broken: still no
+# working search and no page-wise scrolling anymore). Also setup completion
+# for `pdf`.
+if (( $+commands[xpdf] )); then
     pdf() {
-        command zathura "$@" 2>/dev/null &
+        command xpdf "$@" 2>/dev/null &
         disown %command
     }
-    # No completion for zathura yet.
     compdef _xpdf pdf
-elif (( $+commands[xpdf] )); then
+elif (( $+commands[zathura] )); then
     pdf() {
-        command xpdf "$@" 2>/dev/null &
+        command zathura "$@" 2>/dev/null &
         disown %command
     }
+    # No completion for zathura yet.
     compdef _xpdf pdf
 fi
 
@@ -771,9 +813,12 @@ exec 2>>(while read -r -k -u 0 line; do
     print -n $'\0';
 done &)
 
-# Run reminder and redisplay it every four hours (if it's available).
+# Run the following programs every 4 hours.
 PERIOD=14400
 periodic() {
+    # Display fortunes.
+    (( $+commands[fortune] )) && fortune -ac
+    # Display reminders.
     (( $+commands[rem] )) && [ -f ~/.reminders ] && rem -h
 }