summaryrefslogtreecommitdiffstats
path: root/Functions/Zftp
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>1999-09-02 16:44:59 +0000
committerTanaka Akira <akr@users.sourceforge.net>1999-09-02 16:44:59 +0000
commit6e1759433b3d8e861e6146fcf9bd7a70735ec675 (patch)
tree8e736c83a6a4b0a314af123aa8660f8cdeefe3d0 /Functions/Zftp
parentzsh-workers/7631 (diff)
downloadzsh-6e1759433b3d8e861e6146fcf9bd7a70735ec675.tar
zsh-6e1759433b3d8e861e6146fcf9bd7a70735ec675.tar.gz
zsh-6e1759433b3d8e861e6146fcf9bd7a70735ec675.tar.bz2
zsh-6e1759433b3d8e861e6146fcf9bd7a70735ec675.tar.lz
zsh-6e1759433b3d8e861e6146fcf9bd7a70735ec675.tar.xz
zsh-6e1759433b3d8e861e6146fcf9bd7a70735ec675.tar.zst
zsh-6e1759433b3d8e861e6146fcf9bd7a70735ec675.zip
zsh-workers/7632
Diffstat (limited to 'Functions/Zftp')
-rw-r--r--Functions/Zftp/zfautocheck4
-rw-r--r--Functions/Zftp/zfinit13
-rw-r--r--Functions/Zftp/zfrglob7
-rw-r--r--Functions/Zftp/zftp_progress45
4 files changed, 58 insertions, 11 deletions
diff --git a/Functions/Zftp/zfautocheck b/Functions/Zftp/zfautocheck
index abb994061..d06beca4f 100644
--- a/Functions/Zftp/zfautocheck
+++ b/Functions/Zftp/zfautocheck
@@ -15,6 +15,10 @@
# a successful open.
local lastsession=$zflastsession
+# Unset the delay counter from the progress meter in case there was an
+# abnormal exit.
+(( ${+zftpseconds} )) && unset zftpseconds
+
if [[ -z $ZFTP_HOST ]]; then
zfopen || return 1
[[ $1 = *d* ]] || do_close=1
diff --git a/Functions/Zftp/zfinit b/Functions/Zftp/zfinit
index 2a5fd9b47..0bc619277 100644
--- a/Functions/Zftp/zfinit
+++ b/Functions/Zftp/zfinit
@@ -2,6 +2,11 @@ emulate -L zsh
[[ $1 = -n ]] || zmodload -e zftp || zmodload -ia zftp
+if [[ ${+zfconfig} = 0 ]]; then
+ typeset -gA zfconfig
+ zfconfig=(progress bar update 1)
+fi
+
alias zfcd='noglob zfcd'
alias zfget='noglob zfget'
alias zfls='noglob zfls'
@@ -13,15 +18,15 @@ autoload -U zfdir zfgcp zfget zfget_match zfgoto zfhere zfinit zfls
autoload -U zfmark zfopen zfparams zfpcp zfput zfrglob zfrtime zfstat
autoload -U zftp_chpwd zftp_progress zftype zfuget zfuput
-# only way of getting that noglob out of the way: this is unnecessary with
-# widget-based completion and can be commented out.
-setopt completealiases
-
#
# zftp completions: only use these if new-style completion is not
# active.
#
if [[ ${#_patcomps} -eq 0 || ${_patcomps[(i)zf*]} -gt ${#_patcomps} ]]; then
+ # only way of getting that noglob out of the way: this is unnecessary with
+ # widget-based completion
+ setopt completealiases
+
compctl -f -x 'p[1]' \
-k '(open params user login type ascii binary mode put putat
get getat append appendat ls dir local remote mkdir rmdir delete
diff --git a/Functions/Zftp/zfrglob b/Functions/Zftp/zfrglob
index f9d67b3f2..fad0c3849 100644
--- a/Functions/Zftp/zfrglob
+++ b/Functions/Zftp/zfrglob
@@ -9,7 +9,8 @@
# stick with a single directory. This is the default.
# (2) Use remote globbing, i.e. pass it to ls at the site.
# Faster, but only works with UNIX, and only basic globbing.
-# We do this if $zfrglob is non-null.
+# We do this if zfconfig[remote_glob] (or $zfrglob for
+# backward compatibility) is non-null.
# There is only one argument, the variable containing the
# pattern to be globbed. We set this back to an array containing
@@ -20,6 +21,10 @@ setopt extendedglob
local pat dir nondir files i
+if [[ -n ${zfconfig[remote_glob]} ]]; then
+ local zfrglob=1
+fi
+
eval pat=\$$1
# Check if we really need to do anything. Look for standard
diff --git a/Functions/Zftp/zftp_progress b/Functions/Zftp/zftp_progress
index e2b5084c4..344d1c9c1 100644
--- a/Functions/Zftp/zftp_progress
+++ b/Functions/Zftp/zftp_progress
@@ -1,18 +1,51 @@
# function zftp_progress {
# Basic progress metre, showing the percent of the file transferred.
-# You want growing bars? You gotta write growing bars.
+# You want growing bars? You gottem.
+# zfconfig keys:
+# progress
+# empty or `none' no progress meter
+# `bar' use a growing bar of inverse video
+# `percent' or other non-blank show the percentage transferred
+# If size of remote file is not available, `bar' or `percent' just show
+# bytes.
+# update
+# Minimum time in seconds between updates of the progress display.
# Don't show progress unless stderr is a terminal
-[[ ! -t 2 ]] && return 0
+[[ ! -t 2 || ${zfconfig[progress]} = (|none) ]] && return 0
-if [[ $ZFTP_TRANSFER = *F ]]; then
- print 1>&2
-elif [[ -n $ZFTP_TRANSFER ]]; then
+# Tunable parameters.
+# How many seconds to wait before printing an updated progress report.
+integer update=${zfconfig[update]:-1}
+# What style: either bar for growing bars, or anything else for simple
+# percentage. For bar we need to have the terminal width in COLUMNS,
+# which is often set automatically, but you never know.
+local style=${zfconfig[progress]}
+
+if [[ -n $ZFTP_TRANSFER ]]; then
+ # avoid a `parameter unset' message
+ [[ $ZFTP_TRANSFER != *F ]] &&
+ (( ${+zftpseconds} )) && (( SECONDS - zftpseconds < update )) && return
if [[ -n $ZFTP_SIZE ]]; then
local frac="$(( ZFTP_COUNT * 100 / ZFTP_SIZE ))%"
- print -n "\r$ZFTP_FILE ($ZFTP_SIZE bytes): $ZFTP_TRANSFER $frac" 1>&2
+ if [[ $style = bar && ${+COLUMNS} = 1 && $COLUMNS -gt 0 ]]; then
+ if (( ! ${+zftpseconds} )); then
+ print "$ZFTP_FILE ($ZFTP_SIZE bytes): $ZFTP_TRANSFER" 1>&2
+ fi
+ integer maxwidth=$(( COLUMNS - 7 ))
+ local width="$(( ZFTP_COUNT * maxwidth / ZFTP_SIZE ))"
+ print -nP "\r%S${(l:width:):-}%s${(l:maxwidth-width:):-}: ${frac}%%" 1>&2
+ else
+ print -n "\r$ZFTP_FILE ($ZFTP_SIZE bytes): $ZFTP_TRANSFER $frac" 1>&2
+ fi
else
print -n "\r$ZFTP_FILE: $ZFTP_TRANSFER $ZFTP_COUNT" 1>&2
fi
+ if [[ $ZFTP_TRANSFER = *F && ${+zftpseconds} = 1 ]]; then
+ unset zftpseconds
+ print 1>&2
+ else
+ zftpseconds=$SECONDS
+ fi
fi
# }