From 01837f58b576a29c8ac23058b97d0a71821258a6 Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Thu, 20 Dec 2012 18:10:06 +0100 Subject: [PATCH] zsh/rc: Handle fg in longrun_preexec(). --- zsh/rc | 46 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/zsh/rc b/zsh/rc index c3fd79f..a789428 100644 --- a/zsh/rc +++ b/zsh/rc @@ -18,6 +18,31 @@ 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%% *} -- 2.44.1