aboutsummaryrefslogtreecommitdiff
path: root/Functions/Zftp/zfcd
blob: b726d9f55a1a76a1b78533ccc5d4167a35f95a28 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 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

if [[ $1 = /* ]]; then
  zfautocheck -dn
else
  zfautocheck -d
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.
  set -- $zflastdir
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

zftp cd "$@"  &&  zflastdir=$lastdir
print $zflastsession
# }