zshrc: Add a setting to avoid the persistent dirstack feature to be activated
authorFrank Terbeck <ft@grml.org>
Sat, 23 Jan 2016 14:46:20 +0000 (15:46 +0100)
committerFrank Terbeck <ft@grml.org>
Sat, 23 Jan 2016 14:46:20 +0000 (15:46 +0100)
Apparently, there are still problems with automounters and slow/buggy
network file systems. This style makes it possible to disable the
feature altogether.

doc/grmlzshrc.t2t
etc/zsh/zshrc

index 8accb74..2bc6620 100644 (file)
@@ -136,6 +136,14 @@ The **DIRSTACKFILE** is loaded each time zsh starts, therefore freshly started
 zshs inherit the dirstack of the zsh that most recently updated
 **DIRSTACKFILE**.
 
+If you would like to //disable// the persistent dirstack feature altogether,
+you can do that by setting the boolean //enable// style to //false// in the
+right context (the default is //true//):
+\
+```
+zstyle ':grml:chpwd:dirstack' enable false
+```
+
 It is possible to apply a filter to the names of directories that will be
 committed to the persistent dirstack file. There are two ways to configure this
 filter: A general function based filter and a pattern based filter. Both are
index 7e6898a..14cc648 100644 (file)
@@ -1597,50 +1597,52 @@ isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
 DIRSTACKSIZE=${DIRSTACKSIZE:-20}
 DIRSTACKFILE=${DIRSTACKFILE:-${ZDOTDIR:-${HOME}}/.zdirs}
 
-typeset -gaU GRML_PERSISTENT_DIRSTACK
-function grml_dirstack_filter() {
-    local -a exclude
-    local filter entry
-    if zstyle -s ':grml:chpwd:dirstack' filter filter; then
-        $filter $1 && return 0
-    fi
-    if zstyle -a ':grml:chpwd:dirstack' exclude exclude; then
-        for entry in "${exclude[@]}"; do
-            [[ $1 == ${~entry} ]] && return 0
-        done
-    fi
-    return 1
-}
-
-chpwd() {
-    (( $DIRSTACKSIZE <= 0 )) && return
-    [[ -z $DIRSTACKFILE ]] && return
-    grml_dirstack_filter $PWD && return
-    GRML_PERSISTENT_DIRSTACK=(
-        $PWD "${(@)GRML_PERSISTENT_DIRSTACK[1,$DIRSTACKSIZE]}"
-    )
-    builtin print -l ${GRML_PERSISTENT_DIRSTACK} >! ${DIRSTACKFILE}
-}
+if zstyle -T ':grml:chpwd:dirstack' enable; then
+    typeset -gaU GRML_PERSISTENT_DIRSTACK
+    function grml_dirstack_filter() {
+        local -a exclude
+        local filter entry
+        if zstyle -s ':grml:chpwd:dirstack' filter filter; then
+            $filter $1 && return 0
+        fi
+        if zstyle -a ':grml:chpwd:dirstack' exclude exclude; then
+            for entry in "${exclude[@]}"; do
+                [[ $1 == ${~entry} ]] && return 0
+            done
+        fi
+        return 1
+    }
 
-if [[ -f ${DIRSTACKFILE} ]]; then
-    # Enabling NULL_GLOB via (N) weeds out any non-existing
-    # directories from the saved dir-stack file.
-    dirstack=( ${(f)"$(< $DIRSTACKFILE)"}(N) )
-    # "cd -" won't work after login by just setting $OLDPWD, so
-    [[ -d $dirstack[1] ]] && cd -q $dirstack[1] && cd -q $OLDPWD
-fi
+    chpwd() {
+        (( $DIRSTACKSIZE <= 0 )) && return
+        [[ -z $DIRSTACKFILE ]] && return
+        grml_dirstack_filter $PWD && return
+        GRML_PERSISTENT_DIRSTACK=(
+            $PWD "${(@)GRML_PERSISTENT_DIRSTACK[1,$DIRSTACKSIZE]}"
+        )
+        builtin print -l ${GRML_PERSISTENT_DIRSTACK} >! ${DIRSTACKFILE}
+    }
 
-if zstyle -t ':grml:chpwd:dirstack' filter-on-load; then
-    for i in "${dirstack[@]}"; do
-        if ! grml_dirstack_filter "$i"; then
-            GRML_PERSISTENT_DIRSTACK=(
-                "${GRML_PERSISTENT_DIRSTACK[@]}"
-                $i
-            )
-        fi
-    done
-else
-    GRML_PERSISTENT_DIRSTACK=( "${dirstack[@]}" )
+    if [[ -f ${DIRSTACKFILE} ]]; then
+        # Enabling NULL_GLOB via (N) weeds out any non-existing
+        # directories from the saved dir-stack file.
+        dirstack=( ${(f)"$(< $DIRSTACKFILE)"}(N) )
+        # "cd -" won't work after login by just setting $OLDPWD, so
+        [[ -d $dirstack[1] ]] && cd -q $dirstack[1] && cd -q $OLDPWD
+    fi
+
+    if zstyle -t ':grml:chpwd:dirstack' filter-on-load; then
+        for i in "${dirstack[@]}"; do
+            if ! grml_dirstack_filter "$i"; then
+                GRML_PERSISTENT_DIRSTACK=(
+                    "${GRML_PERSISTENT_DIRSTACK[@]}"
+                    $i
+                )
+            fi
+        done
+    else
+        GRML_PERSISTENT_DIRSTACK=( "${dirstack[@]}" )
+    fi
 fi
 
 # directory based profiles