1999-04-25 17:43:45 +02:00
|
|
|
# function zfcd {
|
|
|
|
# zfcd: change directory on the remote server.
|
|
|
|
#
|
|
|
|
# Currently has the following features:
|
|
|
|
# --- an initial string matching $HOME in the directory is turned back into ~
|
|
|
|
# to be re-interpreted by the remote server.
|
|
|
|
# --- zfcd with no arguments changes directory to '~'
|
|
|
|
# --- `zfcd old new' and `zfcd -' work analagously to cd
|
|
|
|
# --- if the connection is not currently open, it will try to
|
|
|
|
# re-open it with the stored parameters as set by zfopen.
|
|
|
|
# If the connection timed out, however, it won't know until
|
|
|
|
# too late. In that case, just try the same zfcd command again
|
|
|
|
# (but now `zfcd -' and `zfcd old new' won't work).
|
|
|
|
|
|
|
|
# hack: if directory begins with $HOME, turn it back into ~
|
|
|
|
# there are two reasons for this:
|
|
|
|
# first, a ~ on the command line gets expanded even with noglob.
|
|
|
|
# (I suppose this is correct, but I wouldn't like to swear to it.)
|
|
|
|
# second, we can no do 'zfcd $PWD' and the like, and that will
|
|
|
|
# work just as long as the directory structures under the home match.
|
|
|
|
|
|
|
|
emulate -L zsh
|
2000-05-08 12:45:02 +02:00
|
|
|
[[ $curcontext = :zf* ]] || local curcontext=:zfcd
|
1999-04-25 17:43:45 +02:00
|
|
|
|
|
|
|
if [[ $1 = /* ]]; then
|
2000-05-08 12:45:02 +02:00
|
|
|
zfautocheck -dn || return 1
|
1999-04-25 17:43:45 +02:00
|
|
|
else
|
2000-05-08 12:45:02 +02:00
|
|
|
zfautocheck -d || return 1
|
1999-04-25 17:43:45 +02:00
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ $1 = $HOME || $1 = $HOME/* ]]; then
|
|
|
|
1="~${1#$HOME}"
|
|
|
|
fi
|
|
|
|
|
|
|
|
if (( $# == 0 )); then
|
|
|
|
# Emulate `cd' behaviour
|
|
|
|
set -- '~'
|
|
|
|
elif [[ $# -eq 1 && $1 = - ]]; then
|
|
|
|
# Emulate `cd -' behaviour.
|
2000-05-08 12:45:02 +02:00
|
|
|
set -- $zfconfig[lastdir_$ZFTP_SESSION]
|
1999-04-25 17:43:45 +02:00
|
|
|
elif [[ $# -eq 2 ]]; then
|
|
|
|
# Emulate `cd old new' behaviour.
|
|
|
|
# We have to find a character not in $1 or $2; ! is a good bet.
|
|
|
|
eval set -- "\${ZFTP_PWD:s!$1!$2!}"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# We have to remember the current directory before changing it
|
|
|
|
# if we want to keep it.
|
|
|
|
local lastdir=$ZFTP_PWD
|
|
|
|
|
2000-05-08 12:45:02 +02:00
|
|
|
zftp cd "$@" && [[ $lastdir != $ZFTP_PWD ]] &&
|
|
|
|
zfconfig[lastdir_$ZFTP_SESSION]=$lastdir
|
|
|
|
|
|
|
|
print $zfconfig[lastloc_$ZFTP_SESSION]
|
1999-04-25 17:43:45 +02:00
|
|
|
# }
|