mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-11-19 21:44:11 +01:00
71 lines
2.1 KiB
Plaintext
71 lines
2.1 KiB
Plaintext
# function zfrglob {
|
|
# Do the remote globbing for zfput, etc.
|
|
# We have two choices:
|
|
# (1) Get the entire file list and match it one by one
|
|
# locally against the pattern.
|
|
# Causes problems if we are globbing directories (rare, presumably).
|
|
# But: we can cache the current directory, which
|
|
# we need for completion anyway. Works on any OS if you
|
|
# 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.
|
|
|
|
# There is only one argument, the variable containing the
|
|
# pattern to be globbed. We set this back to an array containing
|
|
# all the matches.
|
|
|
|
emulate -L zsh
|
|
setopt extendedglob
|
|
|
|
local pat dir nondir files i
|
|
|
|
eval pat=\$$1
|
|
|
|
# Check if we really need to do anything. Look for standard
|
|
# globbing characters, and if we are
|
|
# using zsh for the actual pattern matching also look for
|
|
# extendedglob characters.
|
|
if [[ $pat != *[][*?]* &&
|
|
( -n $zfrglob || $pat != *[(|)#^]* ) ]]; then
|
|
return 0
|
|
fi
|
|
local tmpf=${TMPPREFIX}zfrglob$$
|
|
|
|
if [[ $zfrglob != '' ]]; then
|
|
zftp ls "$pat" >$tmpf 2>/dev/null
|
|
eval "$1=(\$(<\$tmpf))"
|
|
rm -f $tmpf
|
|
else
|
|
if [[ $ZFTP_SYSTEM = UNIX* && $pat = */* ]]; then
|
|
# not the current directory and we know how to handle paths
|
|
if [[ $pat = ?*/* ]]; then
|
|
# careful not to remove too many slashes
|
|
dir=${pat%/*}
|
|
else
|
|
dir=/
|
|
fi
|
|
nondir=${pat##*/}
|
|
zftp ls "$dir" 2>/dev/null >$tmpf
|
|
files=($(<$tmpf))
|
|
files=(${files:t})
|
|
rm -f $tmpf
|
|
else
|
|
# we just have to do an ls and hope that's right
|
|
nondir=$pat
|
|
if (( $#zftp_fcache == 0 )); then
|
|
# Why does `zftp_fcache=($(zftp ls))' sometimes not work?
|
|
zftp ls >$tmpf
|
|
zftp_fcache=($(<$tmpf))
|
|
rm -f $tmpf
|
|
fi
|
|
files=($zftp_fcache)
|
|
fi
|
|
# now we want to see which of the $files match $nondir:
|
|
# ${...:/foo} deletes occurrences of foo matching a complete word,
|
|
# while the ^ inverts the sense so that anything not matching the
|
|
# pattern in $nondir is excluded.
|
|
eval "$1=(\${files:/^\${~nondir}})"
|
|
fi
|
|
# }
|