Skip to content

Commit

Permalink
zshrc: Add a setting to avoid the persistent dirstack feature to be a…
Browse files Browse the repository at this point in the history
…ctivated

Apparently, there are still problems with automounters and slow/buggy
network file systems. This style makes it possible to disable the
feature altogether.
  • Loading branch information
ft committed Jan 23, 2016
1 parent df5ece4 commit d005e0b
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 42 deletions.
8 changes: 8 additions & 0 deletions doc/grmlzshrc.t2t
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
86 changes: 44 additions & 42 deletions etc/zsh/zshrc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit d005e0b

Please sign in to comment.