xref: /illumos-gate/usr/src/contrib/ast/src/cmd/ksh93/fun/dirs (revision b30d1939)
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