X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=zsh%2Frc;h=e29219af05bfa5d838054800abf923e1b9634b44;hb=31833e1b31ba6a81947aca55f17581f107ee1e9f;hp=1a30e83094e3b79c399731437295dcabe49d36da;hpb=0388e4464474e155fd41d18266813d9ac5795cac;p=config%2Fdotfiles.git diff --git a/zsh/rc b/zsh/rc index 1a30e83..e29219a 100644 --- a/zsh/rc +++ b/zsh/rc @@ -153,16 +153,6 @@ local green="%{${fg[green]}%}" local yellow="%{${fg[yellow]}%}" local default="%{${fg[default]}%}" -# Set the default prompt. The current host and working directory is displayed, -# the exit code of the last command if it wasn't 0, the number of running jobs -# if not 0. -# -# The prompt is in green and blue to make easily detectable, the error exit -# code in red and bold and the job count in yellow. -PROMPT="$green%B%m%b$default:$blue%B%~%b$default \ -%(1j.$yellow%j$default.)%# \ -%(?..($red%B%?%b$default%) )" - # vcs_info was added in 4.3.9 but it works in earlier versions too. So load it # if the necessary files are available in ~/.zsh/functions/vcs_info (often a # symbolic link to current checkout of Zsh's sources). @@ -212,6 +202,45 @@ if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) || zstyle ':vcs_info:*' unstagedstr '¹' zstyle ':vcs_info:*' stagedstr '²' + # Default to running vcs_info. If possible we prevent running it later for + # speed reasons. If set to a non empty value vcs_info is run. + FORCE_RUN_VCS_INFO=1 + + # Cache system inspired by Bart Trojanowski + # (http://jukie.net/~bart/blog/pimping-out-zsh-prompt). + #zstyle ':vcs_info:*+pre-get-data:*' hooks pre-get-data + +vi-pre-get-data() { + # Only Git and Mercurial support and need caching. Abort if any other + # VCS is used. + [[ "$vcs" != git && "$vcs" != hg ]] && return + + # If the shell just started up or we changed directories (or for other + # custom reasons) we must run vcs_info. + if [[ -n $FORCE_RUN_VCS_INFO ]]; then + FORCE_RUN_VCS_INFO= + return + fi + + # Don't run vcs_info by default to speed up the shell. + ret=1 + # If a git/hg command was run then run vcs_info as the status might + # need to be updated. + case "$(fc -ln $(($HISTCMD-1)))" in + git* | g\ *) + ret=0 + ;; + hg*) + ret=0 + ;; + esac + } + + # Must run vcs_info when changing directories. + prompt_chpwd() { + FORCE_RUN_VCS_INFO=1 + } + add-zsh-hook chpwd prompt_chpwd + # Call vcs_info as precmd before every prompt. prompt_precmd() { vcs_info @@ -229,6 +258,16 @@ if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) || fi fi +# Set the default prompt. The current host and working directory is displayed, +# the exit code of the last command if it wasn't 0, the number of running jobs +# if not 0. +# +# The prompt is in green and blue to make easily detectable, the error exit +# code in red and bold and the job count in yellow. +PROMPT="$green%B%m%b$default:$blue%B%~%b$default \ +%(1j.$yellow%j$default.)%# \ +%(?..($red%B%?%b$default%) )" + unset red blue green yellow default # When screen, xterm or rxvt is used set the name of the window to the @@ -245,6 +284,9 @@ unset red blue green yellow default # screen is running on the remote machine instead of @screen @:hostname # (hostname replaced by the machine's hostname) is displayed. This only works # if the .zshrc on the server also uses this command. +# +# screen* is necessary as `screen` uses screen.linux for example for a linux +# console. if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then # Is set to a non empty value to reset the window name in the next # precmd() call. @@ -532,18 +574,20 @@ source_config ~/.zsh host rc ${$(hostname)//.*/} # RUN COMMANDS # If not already in screen reattach to a running session or create a new one. -# -# screen* is necessary as `screen` uses screen.linux for example for a linux -# console which would otherwise cause an infinite loop. -if [[ $TERM != screen* && $TERM != 'dumb' ]]; then +# This also starts screen one a remote server when connecting through ssh. +if [[ $TERM != dumb && -z $STY ]]; then # Get running detached sessions. session=$(screen -list | grep 'Detached' | awk '{ print $1; exit }') + + # As we exec later we have to set the title here. + window_preexec "screen" + # Create a new session if none is running. if [[ -z $session ]]; then - screen + exec screen # Reattach to a running session. else - screen -r $session + exec screen -r $session fi fi