]> ruderich.org/simon Gitweb - config/dotfiles.git/commitdiff
zsh/rc: Handle fg in longrun_preexec().
authorSimon Ruderich <simon@ruderich.org>
Thu, 20 Dec 2012 17:10:06 +0000 (18:10 +0100)
committerSimon Ruderich <simon@ruderich.org>
Thu, 20 Dec 2012 17:10:06 +0000 (18:10 +0100)
zsh/rc

diff --git a/zsh/rc b/zsh/rc
index c3fd79fc9544cdd7b1fb493ef8c318cf9eff64dc..a789428010b66f61180807fcf272c102f8a67df4 100644 (file)
--- a/zsh/rc
+++ b/zsh/rc
 
 source_debug ". ~/.zsh/rc"
 
+
+# HELPER FUNCTIONS
+
+# Return the name of the program which is called in the foreground with `fg`.
+# $1 is the name of the program (optional). If it's not 'fg' or 'fg *' it's
+# returned unchanged.
+resolve_fg_to_resumed_job_name() {
+    # $REPLY is used by convention for scalars ($reply for arrays) to return
+    # values from functions. unset it here to prevent problems when REPLY is
+    # bound to an integer or similar. Thanks to Mikachu in #zsh on Freenode
+    # (2012-09-27 17:14 CEST) for this hint.
+    unset REPLY
+
+    # Replace fg with the resumed job name.
+    if [[ $1 == fg ]]; then
+        REPLY="${jobtexts[%+]}"
+    elif [[ $1 == fg\ * ]]; then
+        REPLY="${jobtexts[${1#fg }]}"
+    # Normal program, return as is.
+    else
+        REPLY="$1"
+    fi
+}
+
+
 # MISCELLANEOUS SETTINGS
 
 # Be paranoid, new files are readable/writable by me only.
@@ -270,10 +295,17 @@ longrun_data=()
 # Display runtime in seconds for long running programs (> 60 seconds) and send
 # a bell to notify me.
 longrun_preexec() {
+    local program="$3"
+
+    # Handle fg.
+    local REPLY
+    resolve_fg_to_resumed_job_name "$program"
+    program="$REPLY"
+
     # 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
+        case $program in
             $ignore | $ignore\ *)
                 longrun_data=()
                 return
@@ -281,7 +313,7 @@ longrun_preexec() {
         esac
     done
 
-    longrun_data=("$3" $EPOCHSECONDS)
+    longrun_data=("$program" $EPOCHSECONDS)
 }
 longrun_precmd() {
     # No previous timestamp available or disabled for this command, ignore.
@@ -398,12 +430,10 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then
             program_sudo=yes
         fi
 
-        # Replace fg with the resumed job name.
-        if [[ $program_name == fg ]]; then
-            program_name=${jobtexts[%+]}
-        elif [[ $program_name == fg\ * ]]; then
-            program_name=${jobtexts[${program_name#fg }]}
-        fi
+        # Handle fg.
+        local REPLY
+        resolve_fg_to_resumed_job_name "$program_name"
+        program_name="$REPLY"
 
         # Remove all arguments from the program name.
         program_name=${program_name%% *}