X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=f6434caf70f8554864523e2ddc6954b2c74badeb;hb=ead1a063a2fb9189bc697be2120b24cf3f3dd56a;hp=e88ba042553713d080b30e1c658803667a8cfeac;hpb=33bc6db8acfbd3a336056686b69e022f0ea5f8a3;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index e88ba04..f6434ca 100644 --- a/etc/zsh/zshrc +++ b/etc/zsh/zshrc @@ -388,9 +388,6 @@ setopt extended_glob # display PID when suspending processes as well setopt longlistjobs -# try to avoid the 'zsh: no matches found...' -setopt nonomatch - # report the status of backgrounds jobs immediately setopt notify @@ -528,30 +525,6 @@ salias() { return 0 } -# a "print -l ${(u)foo}"-workaround for pre-4.2.0 shells -# usage: uprint foo -# Where foo is the *name* of the parameter you want printed. -# Note that foo is no typo; $foo would be wrong here! -if ! is42 ; then - uprint () { - emulate -L zsh - local -a u - local w - local parameter=$1 - - if [[ -z ${parameter} ]] ; then - printf 'usage: uprint \n' - return 1 - fi - - for w in ${(P)parameter} ; do - [[ -z ${(M)u:#$w} ]] && u=( $u $w ) - done - - builtin print -l $u - } -fi - # Check if we can read given files and source those we can. xsource() { if (( ${#argv} < 1 )) ; then @@ -981,7 +954,7 @@ function Accept-Line-HandleContext() { function accept-line() { setopt localoptions noksharrays - local -ax cmdline + local -a cmdline local -x alcontext local buf com fname format msg default_action @@ -1619,23 +1592,52 @@ isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history DIRSTACKSIZE=${DIRSTACKSIZE:-20} DIRSTACKFILE=${DIRSTACKFILE:-${ZDOTDIR:-${HOME}}/.zdirs} -if [[ -f ${DIRSTACKFILE} ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then - dirstack=( ${(f)"$(< $DIRSTACKFILE)"} ) - # "cd -" won't work after login by just setting $OLDPWD, so - [[ -d $dirstack[1] ]] && cd $dirstack[1] && cd $OLDPWD -fi +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() { - if (( $DIRSTACKSIZE <= 0 )) || [[ -z $DIRSTACKFILE ]]; then return; fi - local -ax my_stack - my_stack=( ${PWD} ${dirstack} ) - if is42 ; then - builtin print -l ${(u)my_stack} >! ${DIRSTACKFILE} - else - uprint my_stack >! ${DIRSTACKFILE} - fi + (( $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 [[ -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 + # directory based profiles if is433 ; then