X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=zsh%2Frc;h=bb11dd714444ca001058e8a02cdb05867ddc3d4a;hb=791c5a1471b418e971263ec0d7c5df9dc61ae375;hp=aa195f28b167da25b030ec5e20aef1cc1dfec0ad;hpb=9b4edaeb7c8a573fcf2c865fe1dd7c16337e0c76;p=config%2Fdotfiles.git diff --git a/zsh/rc b/zsh/rc index aa195f2..bb11dd7 100644 --- a/zsh/rc +++ b/zsh/rc @@ -18,10 +18,37 @@ 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. -umask 077 +# Be paranoid, new files are readable/writable by me only, but not as root. +if [[ $UID -ne 0 ]]; then + umask 077 +fi # Disable beeps. setopt nobeep @@ -265,6 +292,53 @@ 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() { + 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 $program in + $ignore | $ignore\ *) + longrun_data=() + return + ;; + esac + done + + longrun_data=("$program" $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, @@ -358,12 +432,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%% *}