]> ruderich.org/simon Gitweb - config/dotfiles.git/commitdiff
zsh/rc: Use caching with vcs_info to speed up the prompt.
authorSimon Ruderich <simon@ruderich.org>
Mon, 17 May 2010 09:57:31 +0000 (11:57 +0200)
committerSimon Ruderich <simon@ruderich.org>
Mon, 17 May 2010 09:57:31 +0000 (11:57 +0200)
zsh/rc

diff --git a/zsh/rc b/zsh/rc
index cfd3f432c4a76247e64d4e301a619d7d00906c7c..643d7ae8a0d30227738afa49fc54f87b90693d44 100644 (file)
--- a/zsh/rc
+++ b/zsh/rc
@@ -212,6 +212,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