xref: /titanic_51/usr/src/lib/libshell/common/fun/dirs (revision da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968)
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