about summary refs log tree commit diff
path: root/Completion
diff options
context:
space:
mode:
Diffstat (limited to 'Completion')
-rw-r--r--Completion/Unix/Command/_rsync53
1 files changed, 35 insertions, 18 deletions
diff --git a/Completion/Unix/Command/_rsync b/Completion/Unix/Command/_rsync
index 026a6a93e..d7b611c26 100644
--- a/Completion/Unix/Command/_rsync
+++ b/Completion/Unix/Command/_rsync
@@ -1,11 +1,32 @@
 #compdef rsync
 
+_rsync_user_or_host() {
+  local suf=$1 rsync
+  shift
+
+  if compset -P 1 '*@'; then
+    local user=${PREFIX%%@*}
+
+    _wanted -C user-at hosts expl "host for $user" \
+	_combination -s '[:@]' "${tag}" users-hosts users="$user" hosts -S "$suf" "$@" -
+  elif compset -S '@*'; then
+      _wanted users expl "user" \
+	  _combination -s '[:@]' "${tag}" users-hosts users -q "$@" -
+  else
+    [[ $words[CURRENT] = rsync://* ]] || rsync='rsync:rsync: compadd -S/ rsync:/'
+    _alternative \
+      'users:user:_users -S @' \
+      "hosts:host:_hosts -S '$suf'" \
+      $rsync
+  fi
+}
+
 _rsync_remote_files() {
 local expl remfiles remdispf remdispd remmodules suf ret=1 tag=accounts
 
-if compset -P '*::*/'; then
+if compset -P '*::*/' || compset -P 'rsync://*/*/'; then
 
-  remfiles=(${(f)"$(_call_program files rsync ${words[CURRENT]%/*}/)"})
+  remfiles=(${${(f)"$(_call_program files rsync ${words[CURRENT]%/*}/)"}:#[ 	]*})
 
   remdispf=(${remfiles:#d*})
   remdispd=(${(M)remfiles:#d*})
@@ -16,14 +37,22 @@ if compset -P '*::*/'; then
   _wanted files expl 'remote file or directory' \
       compadd -S/ -d remdispd ${remdispd##* }
 
-elif compset -P 1 '*::'; then
+elif compset -P 1 '*::' || compset -P 1 'rsync://*/'; then
+
+  local pat=${words[CURRENT]}
 
-  remfiles=(${(f)"$(_call_program files rsync ${words[CURRENT]%::*}::)"})
+  if [[ $pat = *:: ]]; then
+    pat=${pat%::*}::
+  fi
 
-  remmodules=(${remfiles/[ 	]#/:})
+  remfiles=(${${(f)"$(_call_program files rsync $pat)"}:#[ 	]*})
+
+  remmodules=(${remfiles/[ 	]##/:})
 
   _describe "remote modules" remmodules -S/
 
+elif compset -P 'rsync://'; then
+  _rsync_user_or_host / "$@"
 elif compset -P 1 '*:'; then
 
   if zstyle -T ":completion:${curcontext}:files" remote-access; then
@@ -48,20 +77,8 @@ elif compset -P 1 '*:'; then
     _message -e remote-files 'remote file'
   fi
 
-elif compset -P 1 '*@'; then
-  local user=${PREFIX%%@*}
-
-  compset -S ':*' || suf=":"
-
-  _wanted -C user-at hosts expl "host for $user" \
-      _combination -s '[:@]' "${tag}" users-hosts users="$user" hosts -S "$suf" "$@" -
 else
-  if compset -S '@*'; then
-    _wanted users expl "user" \
-	_combination -s '[:@]' "${tag}" users-hosts users -q "$@" -
-  else
-    _alternative 'users:user:_users -S @' 'hosts:host:_hosts -S:'
-  fi
+  _rsync_user_or_host : "$@"
 fi
 
 }