mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-11-04 07:21:06 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			70 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
# 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
 | 
						|
# }
 |