X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=zsh%2Frc;h=c3fd79fc9544cdd7b1fb493ef8c318cf9eff64dc;hb=b6ec7a5cd9626062f51f88437b7b4ee4323e85a2;hp=55e92424562027b001676243b47ea43594cc8aa3;hpb=c4e301f244c36103c028cf5067fdd8844aa3dbe6;p=config%2Fdotfiles.git diff --git a/zsh/rc b/zsh/rc index 55e9242..c3fd79f 100644 --- 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, @@ -601,6 +641,12 @@ bindkey '^F' complete-files # for a fix (-r) to handle whitespace/quotes # correctly, both on the Zsh mailing list. TRAPINT() { + # Don't store this line in history if histignorespace is enabled and the + # line starts with a space. + if [[ -o histignorespace && ${BUFFER[1]} = " " ]]; then + return $1 + fi + # Store the current buffer in the history. zle && print -s -r -- $BUFFER @@ -618,6 +664,8 @@ alias sudo='sudo ' # Global aliases for often used redirections. alias -g E='2>&1' +alias -g N='>/dev/null' +alias -g EN='2>/dev/null' alias -g L='2>&1 | less' alias -g LS='2>&1 | less -S' # -S prevents wrapping of long lines alias -g D='2>&1 | colordiff | less' @@ -664,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 @@ -704,8 +754,9 @@ fi # LOAD ADDITIONAL CONFIGURATION FILES -# Configuration option for rc.local to use tmux. By default screen is used. -use_tmux= +# Configuration option for rc.local to use GNU screen/tmux. By default GNU +# screen is used. Possible values: screen, tmux. +use_multiplexer=screen source_config ~/.zsh/rc.local @@ -717,32 +768,32 @@ source_config ~/.zsh/rc.local # through ssh. if [[ $TERM != dumb && $TERM != linux && -z $STY && -z $TMUX ]]; then # Get running detached sessions. - if [[ -z $use_tmux ]]; then + if [[ $use_multiplexer = screen ]]; then session=$(screen -list | grep 'Detached' | awk '{ print $1; exit }') - else + elif [[ $use_multiplexer = tmux ]]; then session=$(tmux list-sessions 2>/dev/null \ | sed '/(attached)$/ d; s/^\([0-9]\{1,\}\).*$/\1/; q') fi # As we exec later we have to set the title here. - if [[ -z $use_tmux ]]; then + if [[ $use_multiplexer = screen ]]; then window_preexec "screen" - else + elif [[ $use_multiplexer = tmux ]]; then window_preexec "tmux" fi # Create a new session if none is running. if [[ -z $session ]]; then - if [[ -z $use_tmux ]]; then + if [[ $use_multiplexer = screen ]]; then exec screen - else + elif [[ $use_multiplexer = tmux ]]; then exec tmux fi # Reattach to a running session. else - if [[ -z $use_tmux ]]; then + if [[ $use_multiplexer = screen ]]; then exec screen -r $session - else + elif [[ $use_multiplexer = tmux ]]; then exec tmux attach-session -t $session fi fi @@ -762,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 }