142 lines
2.5 KiB
Text
142 lines
2.5 KiB
Text
#
|
|
# Directory manipulation functions from the book 'The Korn Shell'
|
|
# Modified for use with bash Mon Apr 18 08:37 1994 by
|
|
# Ken Konecki (kenk@wfg.com)
|
|
#
|
|
# Modified by Chet Ramey
|
|
#
|
|
# This could stand to have calls to `select' added back in
|
|
#
|
|
|
|
alias integer="declare -i"
|
|
|
|
integer _push_max=${CDSTACK-31} _push_top=${CDSTACK-31}
|
|
|
|
unalias cd
|
|
# alias cd=_cd
|
|
|
|
# Display directory stack -- $HOME display as ~
|
|
dirs()
|
|
{
|
|
dir="${PWD#$HOME/}"
|
|
case $dir in
|
|
$HOME) dir=\~ ;;
|
|
/*) ;;
|
|
*) dir=\~/$dir ;;
|
|
esac
|
|
|
|
integer i=_push_top
|
|
integer n=1
|
|
|
|
echo "$n) $dir"
|
|
while let "i < $_push_max"
|
|
do
|
|
n=n+1
|
|
eval "echo \$n\) \$_push_stack_$i"
|
|
i=i+1
|
|
done
|
|
}
|
|
|
|
# Change directory and put directory on front of stack
|
|
cd()
|
|
{
|
|
typeset dir=
|
|
integer n=0 type=4 i
|
|
case $1 in
|
|
-|-1|2) # cd -
|
|
n=_push_top type=1
|
|
;;
|
|
-[1-9]|-[1-9][0-9]) # cd -n
|
|
n=_push_top+${1#-}-1 type=2
|
|
;;
|
|
|
|
1) # keep present directory
|
|
echo "$PWD"
|
|
return
|
|
;;
|
|
|
|
[2-9]|[1-9][0-9]) # cd n
|
|
n=_push_top+${1}-2 type=2
|
|
;;
|
|
|
|
*)
|
|
if let "_push_top <= 0"; then
|
|
type=3 n=_push_max
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
if let "type < 3"; then
|
|
if let "n >= _push_max"; then
|
|
echo cd: Directory stack not that deep
|
|
return 1
|
|
else
|
|
eval dir=\${_push_stack_$n}
|
|
fi
|
|
fi
|
|
|
|
case $dir in
|
|
~*) dir=$HOME${dir#\~} ;;
|
|
esac
|
|
|
|
cd2 ${dir:-$@} > /dev/null || return 1
|
|
dir=${OLDPWD#$HOME/}
|
|
case $dir in
|
|
$HOME) dir=\~ ;;
|
|
/*) ;;
|
|
*) dir=\~/$dir ;;
|
|
esac
|
|
|
|
case $type in
|
|
1) # swap first two elements
|
|
eval _push_stack_$_push_top=\$dir ;;
|
|
|
|
2|3) # put $dir on top and shift down by one until top
|
|
i=_push_top
|
|
unset _dirlist
|
|
while let "i < $_push_max" ; do
|
|
eval _dirlist=\"\$_dirlist \$_push_stack_$i\"
|
|
i=i+1
|
|
done
|
|
|
|
i=_push_top
|
|
for dir in "$dir" ${_dirlist} ; do
|
|
let "i > n" && break
|
|
eval _push_stack_$i=\$dir
|
|
i=i+1
|
|
done
|
|
;;
|
|
4) # push name
|
|
_push_top=_push_top-1;
|
|
eval _push_stack_$_push_top=\$dir
|
|
;;
|
|
esac
|
|
|
|
echo "$PWD"
|
|
|
|
}
|
|
|
|
# Menu-driven change directory command
|
|
function mcd
|
|
{
|
|
dirs
|
|
echo -n "Select by number or enter a name: "
|
|
read
|
|
cd $REPLY
|
|
}
|
|
|
|
|
|
# Emulate ksh cd substitution
|
|
cd2()
|
|
{
|
|
case "$#" in
|
|
0) builtin cd "$HOME" ;;
|
|
1) builtin cd "$1" ;;
|
|
2) newDir=$(echo $PWD | sed -e "s:$1:$2:g")
|
|
case "$newDir" in
|
|
$PWD) echo "bash:: cd: bad substitution" >&2 ; return 1 ;;
|
|
*) builtin cd "$newDir" ;;
|
|
esac ;;
|
|
*) echo "bash: cd: wrong arg count" 1>&2 ; return 1 ;;
|
|
esac
|
|
}
|