]> ruderich.org/simon Gitweb - config/dotfiles.git/blobdiff - zsh/rc
zsh/rc: Minor documentation updates.
[config/dotfiles.git] / zsh / rc
diff --git a/zsh/rc b/zsh/rc
index 94d7fe37208874c0b79a2cafb23414ce24f41568..80178e0cdc57194f6c66d6db910b97055ec68e04 100644 (file)
--- 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).
@@ -175,9 +165,6 @@ if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) ||
               $fpath)
     fi
 
-    # Allow substitutions and expansions in the prompt, necessary for
-    # vcs_info.
-    setopt promptsubst
     # Load vcs_info to display information about version control repositories.
     autoload -Uz vcs_info
     # Only look for git and mercurial repositories; the only I use.
@@ -212,24 +199,79 @@ if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) ||
     zstyle ':vcs_info:*' unstagedstr '¹'
     zstyle ':vcs_info:*' stagedstr   '²'
 
-    # Call vcs_info as precmd before every prompt.
-    prompt_precmd() {
-        vcs_info
+    # 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
     }
-    add-zsh-hook precmd prompt_precmd
-
-    # Display the VCS information in the right prompt.
-    if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) ]]; then
-        RPROMPT='${vcs_info_msg_0_}'
-    # There is a bug in Zsh below 4.3.9 which displays a wrong symbol when
-    # ${vcs_info_msg_0_} is empty. Provide a workaround for those versions,
-    # thanks to Frank Terbeck <ft@bewatermyfriend.org> for it.
-    else
-        RPROMPT='${vcs_info_msg_0_:- }'
-    fi
+
+    # Must run vcs_info when changing directories.
+    prompt_chpwd() {
+        FORCE_RUN_VCS_INFO=1
+    }
+    add-zsh-hook chpwd prompt_chpwd
+
+    # Used by prompt code below to determine if vcs_info should be run.
+    RUN_VCS_INFO=1
+else
+    RUN_VCS_INFO=
 fi
 
-unset red blue green yellow 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_precmd() {
+    # Call vcs_info before every prompt.
+    if [[ -n $RUN_VCS_INFO ]]; then
+        vcs_info
+
+        # Display the VCS information in the right prompt.
+        if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) ]]; then
+            RPROMPT="${vcs_info_msg_0_}"
+        # There is a bug in Zsh below 4.3.9 which displays a wrong symbol when
+        # ${vcs_info_msg_0_} is empty. Provide a workaround for those
+        # versions, thanks to Frank Terbeck <ft@bewatermyfriend.org> for it.
+        else
+            RPROMPT="${vcs_info_msg_0_:- }"
+        fi
+    fi
+
+    PROMPT="$green%B%m%b$default:$blue%B%~%b$default \
+%(1j.$yellow%j$default.)%# \
+%(?..($red%B%?%b$default%) )"
+}
+add-zsh-hook precmd prompt_precmd
+
 
 # When screen, xterm or rxvt is used set the name of the window to the
 # currently running program.
@@ -539,6 +581,10 @@ source_config ~/.zsh host rc ${$(hostname)//.*/}
 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
         exec screen