|
Packit Service |
a8c26c |
#
|
|
Packit Service |
a8c26c |
# DIRECTORY MANIPULATION FUNCTIONS PUSHD, POPD AND DIRS
|
|
Packit Service |
a8c26c |
#
|
|
Packit Service |
a8c26c |
# Uses global parameters _push_max _push_top _push_stack
|
|
Packit Service |
a8c26c |
integer _push_max=100 _push_top=100
|
|
Packit Service |
a8c26c |
# Display directory stack -- $HOME displayed as ~
|
|
Packit Service |
a8c26c |
function dirs
|
|
Packit Service |
a8c26c |
{
|
|
Packit Service |
a8c26c |
typeset dir="${PWD#$HOME/}"
|
|
Packit Service |
a8c26c |
case $dir in
|
|
Packit Service |
a8c26c |
$HOME)
|
|
Packit Service |
a8c26c |
dir=\~
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
/*) ;;
|
|
Packit Service |
a8c26c |
*) dir=\~/$dir
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
print -r - "$dir ${_push_stack[@]}"
|
|
Packit Service |
a8c26c |
}
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
# Change directory and put directory on front of stack
|
|
Packit Service |
a8c26c |
function pushd
|
|
Packit Service |
a8c26c |
{
|
|
Packit Service |
a8c26c |
typeset dir= type=0
|
|
Packit Service |
a8c26c |
integer i
|
|
Packit Service |
a8c26c |
case $1 in
|
|
Packit Service |
a8c26c |
"") # pushd
|
|
Packit Service |
a8c26c |
if ((_push_top >= _push_max))
|
|
Packit Service |
a8c26c |
then print pushd: No other directory.
|
|
Packit Service |
a8c26c |
return 1
|
|
Packit Service |
a8c26c |
fi
|
|
Packit Service |
a8c26c |
type=1 dir=${_push_stack[_push_top]}
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
+[1-9]|+[1-9][0-9]) # pushd +n
|
|
Packit Service |
a8c26c |
integer i=_push_top$1-1
|
|
Packit Service |
a8c26c |
if ((i >= _push_max))
|
|
Packit Service |
a8c26c |
then print pushd: Directory stack not that deep.
|
|
Packit Service |
a8c26c |
return 1
|
|
Packit Service |
a8c26c |
fi
|
|
Packit Service |
a8c26c |
type=2 dir=${_push_stack[i]}
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
*) if ((_push_top <= 0))
|
|
Packit Service |
a8c26c |
then print pushd: Directory stack overflow.
|
|
Packit Service |
a8c26c |
return 1
|
|
Packit Service |
a8c26c |
fi
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
case $dir in
|
|
Packit Service |
a8c26c |
\~*) dir=$HOME${dir#\~}
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
cd "${dir:-$1}" > /dev/null || return 1
|
|
Packit Service |
a8c26c |
dir=${OLDPWD#$HOME/}
|
|
Packit Service |
a8c26c |
case $dir in
|
|
Packit Service |
a8c26c |
$HOME)
|
|
Packit Service |
a8c26c |
dir=\~
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
/*) ;;
|
|
Packit Service |
a8c26c |
*) dir=\~/$dir
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
case $type in
|
|
Packit Service |
a8c26c |
0) # pushd name
|
|
Packit Service |
a8c26c |
_push_stack[_push_top=_push_top-1]=$dir
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
1) # pushd
|
|
Packit Service |
a8c26c |
_push_stack[_push_top]=$dir
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
2) # push +n
|
|
Packit Service |
a8c26c |
type=${1#+} i=_push_top-1
|
|
Packit Service |
a8c26c |
set -- "${_push_stack[@]}" "$dir" "${_push_stack[@]}"
|
|
Packit Service |
a8c26c |
shift $type
|
|
Packit Service |
a8c26c |
for dir
|
|
Packit Service |
a8c26c |
do (((i=i+1) < _push_max)) || break
|
|
Packit Service |
a8c26c |
_push_stack[i]=$dir
|
|
Packit Service |
a8c26c |
done
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
dirs
|
|
Packit Service |
a8c26c |
}
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
# Pops the top directory
|
|
Packit Service |
a8c26c |
function popd
|
|
Packit Service |
a8c26c |
{
|
|
Packit Service |
a8c26c |
typeset dir
|
|
Packit Service |
a8c26c |
if ((_push_top >= _push_max))
|
|
Packit Service |
a8c26c |
then print popd: Nothing to pop.
|
|
Packit Service |
a8c26c |
return 1
|
|
Packit Service |
a8c26c |
fi
|
|
Packit Service |
a8c26c |
case $1 in
|
|
Packit Service |
a8c26c |
"")
|
|
Packit Service |
a8c26c |
dir=${_push_stack[_push_top]}
|
|
Packit Service |
a8c26c |
case $dir in
|
|
Packit Service |
a8c26c |
\~*) dir=$HOME${dir#\~}
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
cd "$dir" || return 1
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
+[1-9]|+[1-9][0-9])
|
|
Packit Service |
a8c26c |
typeset savedir
|
|
Packit Service |
a8c26c |
integer i=_push_top$1-1
|
|
Packit Service |
a8c26c |
if ((i >= _push_max))
|
|
Packit Service |
a8c26c |
then print pushd: Directory stack not that deep.
|
|
Packit Service |
a8c26c |
return 1
|
|
Packit Service |
a8c26c |
fi
|
|
Packit Service |
a8c26c |
while ((i > _push_top))
|
|
Packit Service |
a8c26c |
do _push_stack[i]=${_push_stack[i-1]}
|
|
Packit Service |
a8c26c |
i=i-1
|
|
Packit Service |
a8c26c |
done
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
*) print pushd: Bad directory.
|
|
Packit Service |
a8c26c |
return 1
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
unset '_push_stack[_push_top]'
|
|
Packit Service |
a8c26c |
_push_top=_push_top+1
|
|
Packit Service |
a8c26c |
dirs
|
|
Packit Service |
a8c26c |
}
|