about summary refs log tree commit diff
path: root/Completion/User/_telnet
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/User/_telnet')
-rw-r--r--Completion/User/_telnet85
1 files changed, 67 insertions, 18 deletions
diff --git a/Completion/User/_telnet b/Completion/User/_telnet
index 54d9a0a2d..7b88d016a 100644
--- a/Completion/User/_telnet
+++ b/Completion/User/_telnet
@@ -1,21 +1,70 @@
 #compdef telnet
 
-_arguments -s \
-  -{F,f,x} \
-  '-8[allow 8-Bit data]' \
-  '-E[disable an escape character]' \
-  '-K[no automatic login]' \
-  '-L[allow 8-Bit data on output]' \
-  '-S+:IP type-of-service:' \
-  '-X+:authentication type to disable:' \
-  '-a[attempt automatic login]' \
-  '-c[disable .telnetrc]' \
-  '-d[debug mode]' \
-  '-e+[specify escape character]:escape character:' \
-  '-k+:realm:' \
-  '-l+[specify user]:user:' \
-  '-n+[specify tracefile]:tracefile:_files' \
-  '-r[rlogin like user interface]' \
-  ':host:_hosts' \
-  ':port:{ _hostports $line[2] "$expl[@]" }'
+# Parameter used:
+#
+#  telnet_hosts_ports_users
+#    The array that contains 3-tuples `host:port:user'.
 
+local curcontext="$curcontext" state line expl
+typeset -A opt_args
+
+if (( ! $+_telnet_args )); then
+  local help="$(_call options telnet -\? < /dev/null 2>&1)"
+  local -A optionmap
+  optionmap=(
+    '*\[-8\]*' '-8[allow 8-Bit data]'
+    '*\[-E\]*' '-E[disable an escape character]'
+    '*\[-K\]*' '-K[no automatic login]'
+    '*\[-L\]*' '-L[allow 8-Bit data on output]'
+    '*\[-N\]*' '-N[supress reverse lookup]'
+    '*\[-S tos\]*' '-S+:IP type-of-service:'
+    '*\[-X atype\]*' '-X+:authentication type to disable:'
+    '*\[-a\]*' '-a[attempt automatic login]'
+    '*\[-c\]*' '-c[disable .telnetrc]'
+    '*\[-d\]*' '-d[debug mode]'
+    '*\[-e char\]*' '-e+[specify escape character]:escape character:'
+    '*\[-f/*' '-f'
+    '*/-F\]*' '-F'
+    '*\[-k realm\]*' '-k+:realm:'
+    '*\[-l user\]*' '-l+[specify user]:user:->users'
+    '*\[-n tracefile\]*' '-n+[specify tracefile]:tracefile:_files'
+    '*\[-r\]*' '-r[rlogin like user interface]'
+    '*\[-s src_addr\]*' '-s+[set source IP address]:src_addr:'
+    '*\[-x\]*' '-x'
+    '*\[-t transcom\]*' '-t+:transcom:'
+    '*\[-noasynch\]*' '-noasynch'
+    '*\[-noasyncnet\]*' '-noasyncnet'
+    '*\[-noasynctty\]*' '-noasynctty'
+  )
+  _telnet_args=($optionmap[(K)"$help"])
+fi
+
+_arguments -C -s \
+  "$_telnet_args[@]" \
+  ':host:->hosts' \
+  ':port:->ports' && return 0
+
+case "$state" in
+hosts)
+  _wanted hosts expl host \
+      _combination -s '[@:]' '' users-hosts-ports \
+          ${opt_args[-l]:+users=${opt_args[-l]:q}} \
+          hosts -
+  ;;
+
+ports)
+  _wanted ports expl port \
+      _combination -s '[@:]' '' users-hosts-ports \
+          ${opt_args[-l]:+users=${opt_args[-l]:q}} \
+          hosts="${line[1]:q}" \
+          ports -
+  ;;
+
+users)
+  _wanted users expl user \
+      _combination -s '[@:]' '' users-hosts-ports \
+      ${line[2]:+hosts="${line[2]:q}"} \
+      ${line[3]:+ports="${line[3]:q}"} \
+      users -
+  ;;
+esac