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