Another set of ksh functions for directory tracking
pph at hocsj.UUCP
pph at hocsj.UUCP
Mon Oct 15 03:12:46 AEST 1984
[]
Here is another set of ksh functions to keep track of past directories.
These functions manipulate a stack of the past 32 directories visited.
Cut below the dashed line.
dirs [N]
Prints the past N directories (default 10) in the following
format:
0: /gaz/games
1: /usr/src/cmd
2: /ja/pph
3: /gaz/games
4: /ja/pph/rje
Directory 0 is $PWD. Directory 1 was visited just before
directory 0, etc.
fd pattern
Prints out the past directories matching pattern in the above
format. Pattern is of the same form as patterns for file name
generation.
cd [- | -N | dir]
Connects to a directory and then pushes that directory on the
stack if it is different from $PWD.
- Connects to directory 1, switches directories 0 and 1,
and prints the directory.
-N When N is 1, this is identical with cd -. Otherwise
connects to directory N, pushes it on the stack (if
it is different from directory 0), and prints the
directory.
dir Connects to dir and pushes it on the stack if it is
different from directory 0.
With no arguments, cd is equivalent to cd $HOME.
Phil Heisler
ihnp4!hocsj!pph
------------------------ Cut Here --------------------------------------
if test "`whence cd`" = 'cd'
then
# cd is not predefined and it is ok to redefine it
integer _NEXTCD _DIRSDEF=${_DIRSDEF:-10} _CDSIZE=${_CDSIZE:-32}
_CDSTACK[0]=${PWD:-$HOME}
_NEXTCD=1
# _NEXTCD is the next place in _CDSTACK for a new directory to go
_pushd ()
# pushes directories on _CDSTACK
{
if test $# -gt 1
then
print - "Usage: cd [ - | -N | directory ]" '\n' \
"\tchoices were: $@" 1>&2
return
fi
if test $# -eq 0
then
_pushd $HOME
return
fi
typeset err="cd: nowhere to go" tmp
integer first second
case "$1" in
-0)
# print current directory
print - $PWD
return
;;
-|-1)
# switch top and 2nd elements
(( second = (_NEXTCD + _CDSIZE -2) % _CDSIZE ))
if test "${_CDSTACK[$second]:-}" = ""
then
print - $err 1>&2
return
fi
(( first = (second + 1) % _CDSIZE ))
tmp=${_CDSTACK[$second]}
cd $tmp
_CDSTACK[$second]=${_CDSTACK[$first]}
_CDSTACK[$first]=$tmp
print - $tmp
;;
-*)
# go to a prior directory
(( first = (_NEXTCD + _CDSIZE + $1 - 1) % _CDSIZE ))
if test $first -lt 0
then
print - $err 1>&2
return
fi
tmp=${_CDSTACK[$first]:-}
if test "$tmp" = ""
then
print - $err 1>&2
return
fi
if test "$tmp" != "$PWD"
then
# don't put two of same directories in a row
cd $tmp
_CDSTACK[$_NEXTCD]=$tmp
(( _NEXTCD = (_NEXTCD + 1) % _CDSIZE ))
fi
print - $tmp
;;
*)
# go to a new directory
cd $1
(( first = (_NEXTCD + _CDSIZE - 1) % _CDSIZE ))
if test "${_CDSTACK[$first]:-}" != "$PWD"
then
# don't put two of same directories in a row
_CDSTACK[$_NEXTCD]=$PWD
(( _NEXTCD = (_NEXTCD + 1) % _CDSIZE ))
fi
;;
esac
}
alias cd=_pushd
dirs ()
{
# prints out _CDSTACK
typeset err='Usage: dirs [past_length]\n\tprints past directories\n
\tpast_length cannot be less than 1'
if test $# -gt 1
then
print - $err 1>&2
return
fi
integer srch_len=${1:-$_DIRSDEF}
if test "$srch_len" -lt 1
then
print - $err 1>&2
return
fi
integer i=0 j=$_NEXTCD
typeset tmp
while test $i -lt $srch_len -a $i -lt $_CDSIZE
do
(( j = ( j + _CDSIZE - 1) % _CDSIZE ))
tmp=${_CDSTACK[$j]:-}
if test "$tmp" = ""
then
return
else
print - "$i: $tmp"
fi
(( i = i + 1 ))
done
}
fd ()
{
typeset err='Usage: fd pattern\n
\tsearches for pattern in the past directories'
if test $# -ne 1
then
print - $err 1>&2
return
fi
integer i=0 j=$_NEXTCD
typeset tmp
while test $i -lt $_CDSIZE
do
(( j = ( j + _CDSIZE - 1) % _CDSIZE ))
tmp=${_CDSTACK[$j]:-}
if test "$tmp" = ""
then
return
elif test "${tmp%$1*}" != "$tmp"
then
print - "$i: $tmp"
fi
(( i = i + 1 ))
done
}
fi #end if cd is not already redefined
More information about the Comp.sources.unix
mailing list