diff options
Diffstat (limited to 'Functions/Zftp/zfdir')
-rw-r--r-- | Functions/Zftp/zfdir | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/Functions/Zftp/zfdir b/Functions/Zftp/zfdir new file mode 100644 index 000000000..55befe000 --- /dev/null +++ b/Functions/Zftp/zfdir @@ -0,0 +1,99 @@ +# function zfdir { +# Long directory of remote server. +# The remote directory is cached. In fact, two caches are kept: +# one of the standard listing of the current directory, i.e. zfdir +# with no arguments, and another for everything else. +# To access the appropriate cache, just use zfdir with the same +# arguments as previously. zfdir -r will also re-use the `everything +# else' cache; you can always reuse the current directory cache just +# with zfdir on its own. +# +# The current directory cache is emptied when the directory changes; +# the other is kept until a new zfdir with a non-empty argument list. +# Both are removed when the connection is closed. +# +# zfdir -f will force the existing cache to be ignored, e.g. if you know +# or suspect the directory has changed. +# zfdir -d will remove both caches without listing anything. +# If you need to pass -r, -f or -d to the dir itself, use zfdir -- -d etc.; +# unrecognised options are passed through to dir, but zfdir options must +# appear first and unmixed with the others. + +emulate -L zsh +setopt extendedglob + +local file opt optlist redir i newargs force + +while [[ $1 = -* ]]; do + if [[ $1 = - || $1 = -- ]]; then + shift; + break; + elif [[ $1 != -[rfd]## ]]; then + # pass options through to ls + break; + fi + optlist=${1#-} + for (( i = 1; i <= $#optlist; i++)); do + opt=$optlist[$i] + case $optlist[$i] in + r) redir=1 + ;; + f) force=1 + ;; + d) [[ -n $zfcurdir && -f $zfcurdir ]] && rm -f $zfcurdir + [[ -n $zfotherdir && -f $zfotherdir ]] && rm -f $zfotherdir + zftp_fcache=() + return 0 + ;; + esac + done + shift +done + +zfautocheck -d + +# directory hack, see zfcd +for (( i = 1; i <= $#argv; i++ )); do + if [[ $argv[$i] = $HOME || $argv[$i] = $HOME/* ]]; then + argv[$i]="~${argv[$i]#$HOME}" + fi +done + +if [[ $# -eq 0 ]]; then + # Cache it in the current directory file. This means that repeated + # calls to zfdir with no arguments always use a cached file. + [[ -z $zfcurdir ]] && zfcurdir=${TMPPREFIX}zfcurdir$$ + file=$zfcurdir +else + # Last directly looked at was not the current one, or at least + # had non-standard arguments. + [[ -z $zfotherdir ]] && zfotherdir=${TMPPREFIX}zfotherdir$$ + file=$zfotherdir + newargs="$*" + if [[ -f $file && $redir != 1 && $force -ne 1 ]]; then + # Don't use the cached file if the arguments changed. + [[ $newargs = $zfotherargs ]] || rm -f $file + fi + zfotherargs=$newargs +fi + +if [[ $force -eq 1 ]]; then + rm -f $file + # if it looks like current directory has changed, better invalidate + # the filename cache, too. + (( $# == 0 )) && zftp_fcache=() +fi + +if [[ -n $file && -f $file ]]; then + eval ${PAGER:-more} \$file +else + if (zftp test); then + # Works OK in subshells + zftp dir $* | tee $file | eval ${PAGER-:more} + else + # Doesn't work in subshells (IRIX 6.2 --- why?) + zftp dir $* >$file + eval ${PAGER-:more} $file + fi +fi +# } |