about summary refs log tree commit diff
path: root/Completion/User/_rlogin
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/User/_rlogin')
-rw-r--r--Completion/User/_rlogin123
1 files changed, 77 insertions, 46 deletions
diff --git a/Completion/User/_rlogin b/Completion/User/_rlogin
index 2b8fdd287..825786d80 100644
--- a/Completion/User/_rlogin
+++ b/Completion/User/_rlogin
@@ -1,51 +1,82 @@
 #compdef rlogin rsh remsh rcp
 
-case "$words[1]" in
-rlogin)
-  _arguments -s \
-    '-8[allow 8-Bit data]' \
-    '-e-[specify escape character]:escape character:' \
-    '-l[specify login user name]:login as:_users' \
-    ':remote host name:_hosts'
-  ;;
-rsh|remsh)
-  local state line ret=1
-  typeset -A options
-
-  _arguments -s \
-    '-n[ignore stdin]' \
-    '-l[specify login user name]:login as:_users' \
-    ':remote host name:_hosts' \
-    ':command: _command_names -e' \
-    '*::command:->command' && ret=0
-
-  if [[ -n "$state" ]]; then
-    shift 1 words
-    (( CURRENT-- ))
-    _normal && ret=0
+_rlogin () {
+  local accounts_users_hosts
+
+  local varname="$words[1]_accounts"
+
+  if (( ${(P)+varname} )); then
+    accounts_users_hosts=( ${(P)varname} )
+  else
+    accounts_users_hosts=( $my_accounts )
   fi
-  return ret
-  ;;
-rcp)
-  local state line ret=1
-  typeset -A options
-
-  _arguments -s \
-    '-p[preserve modification times]' \
-    '-r[recursively copy directories]' \
-    '*:files:->files' && ret=0
-
-  if [[ -n "$state" ]]; then
-    if compset -P '*:'; then
-      _files && ret=0
-    elif compset -P '*@'; then
-      _hosts -S: && ret=0
-    else
-      _files && ret=0
-      _hosts -S: && ret=0
-      _users -S@ && ret=0
+
+  case "$words[1]" in
+  rlogin)
+    _arguments -s \
+      '-8[allow 8-Bit data]' \
+      '-e-[specify escape character]:escape character:' \
+      '-l[specify login user name]:login as:_rlogin_users' \
+      ':remote host name:_rlogin_hosts'
+    ;;
+  rsh|remsh)
+    local state line ret=1
+    typeset -A options
+
+    _arguments -s \
+      '-n[ignore stdin]' \
+      '-l[specify login user name]:login as:_rlogin_users' \
+      ':remote host name:_rlogin_hosts' \
+      ':command: _command_names -e' \
+      '*::command:->command' && ret=0
+
+    if [[ -n "$state" ]]; then
+      shift 1 words
+      (( CURRENT-- ))
+      _normal && ret=0
+    fi
+    return ret
+    ;;
+  rcp)
+    local state line ret=1
+    typeset -A options
+
+    _arguments -s \
+      '-p[preserve modification times]' \
+      '-r[recursively copy directories]' \
+      '*:files:->files' && ret=0
+
+    if [[ -n "$state" ]]; then
+      if compset -P '*:'; then
+	_files && ret=0
+      elif compset -P '*@'; then
+	_rlogin_hosts -S: -q && ret=0
+      else
+	_files && ret=0
+	_rlogin_all_hosts -S: -q && ret=0
+	_rlogin_users -S@ -q && ret=0
+      fi
     fi
+    return ret
+    ;;    
+  esac
+}
+
+_rlogin_users () {
+  _combination accounts_users_hosts users "$@"
+}
+
+_rlogin_hosts () {
+  if [[ "$IPREFIX" == *@ ]]; then
+    _combination accounts_users_hosts "users=${IPREFIX/@}" hosts "$@"
+  else
+    _combination accounts_users_hosts \
+      ${options[-l]:+"users=${options[-l]:q}"} hosts "$@"
   fi
-  return ret
-  ;;    
-esac
+}
+
+_rlogin_all_hosts () {
+  _combination accounts_users_hosts hosts "$@"
+}
+
+_rlogin "$@"