1*da2e3ebdSchin# 2*da2e3ebdSchin# DIRECTORY MANIPULATION FUNCTIONS, REPLACES CD 3*da2e3ebdSchin# 4*da2e3ebdSchin# Uses global parameters _push_max _push_top _push_stack 5*da2e3ebdSchininteger _push_max=${CDSTACK-32} _push_top=${CDSTACK-32} 6*da2e3ebdSchinunalias cd 7*da2e3ebdSchinalias cd=_cd 8*da2e3ebdSchin# Display directory stack -- $HOME displayed as ~ 9*da2e3ebdSchinfunction dirs 10*da2e3ebdSchin{ 11*da2e3ebdSchin typeset dir="${PWD#$HOME/}" 12*da2e3ebdSchin case $dir in 13*da2e3ebdSchin $HOME) 14*da2e3ebdSchin dir=\~ 15*da2e3ebdSchin ;; 16*da2e3ebdSchin /*) ;; 17*da2e3ebdSchin *) dir=\~/$dir 18*da2e3ebdSchin esac 19*da2e3ebdSchin PS3= 20*da2e3ebdSchin select i in "$dir" "${_push_stack[@]}" 21*da2e3ebdSchin do : 22*da2e3ebdSchin done < /dev/null 23*da2e3ebdSchin} 24*da2e3ebdSchin 25*da2e3ebdSchin# Change directory and put directory on front of stack 26*da2e3ebdSchinfunction _cd 27*da2e3ebdSchin{ 28*da2e3ebdSchin typeset dir= 29*da2e3ebdSchin integer n=0 type=4 30*da2e3ebdSchin case $1 in 31*da2e3ebdSchin -|-1|2) # \cd - 32*da2e3ebdSchin n=_push_top type=1 33*da2e3ebdSchin ;; 34*da2e3ebdSchin -[1-9]*([0-9])) # \cd -n 35*da2e3ebdSchin n=_push_top+${1#-}-1 type=2 36*da2e3ebdSchin ;; 37*da2e3ebdSchin 1) # keep present directory 38*da2e3ebdSchin print -r - "$PWD" 39*da2e3ebdSchin return 40*da2e3ebdSchin ;; 41*da2e3ebdSchin [1-9]*([0-9])) # \cd n 42*da2e3ebdSchin n=_push_top+${1}-2 type=2 43*da2e3ebdSchin ;; 44*da2e3ebdSchin *) if ((_push_top <= 0)) 45*da2e3ebdSchin then type=3 n=_push_max 46*da2e3ebdSchin fi 47*da2e3ebdSchin esac 48*da2e3ebdSchin if ((type<3)) 49*da2e3ebdSchin then if ((n >= _push_max+1)) 50*da2e3ebdSchin then print -u2 cd: Directory stack not that deep. 51*da2e3ebdSchin return 1 52*da2e3ebdSchin else dir=${_push_stack[n]} 53*da2e3ebdSchin fi 54*da2e3ebdSchin fi 55*da2e3ebdSchin case $dir in 56*da2e3ebdSchin \~*) dir=$HOME${dir#\~} 57*da2e3ebdSchin esac 58*da2e3ebdSchin \cd "${dir:-$@}" >| /dev/null || return 1 59*da2e3ebdSchin dir=${OLDPWD#$HOME/} 60*da2e3ebdSchin case $TERM in 61*da2e3ebdSchin 630) 62*da2e3ebdSchin print "\033[?${#PWD};2v$PWD\c" 63*da2e3ebdSchin ;; 64*da2e3ebdSchin esac 65*da2e3ebdSchin case $dir in 66*da2e3ebdSchin $HOME) 67*da2e3ebdSchin dir=\~ 68*da2e3ebdSchin ;; 69*da2e3ebdSchin /*) ;; 70*da2e3ebdSchin *) dir=\~/$dir 71*da2e3ebdSchin esac 72*da2e3ebdSchin case $type in 73*da2e3ebdSchin 1) # swap first two elements 74*da2e3ebdSchin _push_stack[_push_top]=$dir 75*da2e3ebdSchin ;; 76*da2e3ebdSchin 2|3) # put $dir on top and shift down by one until top 77*da2e3ebdSchin integer i=_push_top 78*da2e3ebdSchin for dir in "$dir" "${_push_stack[@]}" 79*da2e3ebdSchin do ((i > n)) && break 80*da2e3ebdSchin _push_stack[i]=$dir 81*da2e3ebdSchin i=i+1 82*da2e3ebdSchin done 83*da2e3ebdSchin ;; 84*da2e3ebdSchin 4) # push name 85*da2e3ebdSchin _push_stack[_push_top=_push_top-1]=$dir 86*da2e3ebdSchin ;; 87*da2e3ebdSchin esac 88*da2e3ebdSchin print -r - "$PWD" 89*da2e3ebdSchin} 90*da2e3ebdSchin 91*da2e3ebdSchin# Menu driven change directory command 92*da2e3ebdSchinfunction mcd 93*da2e3ebdSchin{ 94*da2e3ebdSchin typeset dir="${PWD#$HOME/}" 95*da2e3ebdSchin case $dir in 96*da2e3ebdSchin $HOME) 97*da2e3ebdSchin dir=\~ 98*da2e3ebdSchin ;; 99*da2e3ebdSchin /*) ;; 100*da2e3ebdSchin *) dir=\~/$dir 101*da2e3ebdSchin esac 102*da2e3ebdSchin PS3='Select by number or enter a name: ' 103*da2e3ebdSchin select dir in "$dir" "${_push_stack[@]}" 104*da2e3ebdSchin do if _cd $REPLY 105*da2e3ebdSchin then return 106*da2e3ebdSchin fi 107*da2e3ebdSchin done 108*da2e3ebdSchin} 109