summary refs log tree commit diff
path: root/Completion/Zsh
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Zsh')
-rw-r--r--Completion/Zsh/Command/_zftp91
1 files changed, 91 insertions, 0 deletions
diff --git a/Completion/Zsh/Command/_zftp b/Completion/Zsh/Command/_zftp
new file mode 100644
index 000000000..ca6c59fec
--- /dev/null
+++ b/Completion/Zsh/Command/_zftp
@@ -0,0 +1,91 @@
+#compdef -p zf*
+
+# Completion for zftp builtin and zf* functions.  The functions
+# zfcd_match and zfget_match (also used for old-style completion)
+# need to be installed for remote file and directory completion to work.
+
+# emulate -L zsh
+
+# Don't try any more completion after this.
+_compskip=all
+
+local subcom expl curcontext="${curcontext}"
+
+if [[ $service = zftp ]]; then
+  if [[ $CURRENT -eq 2 ]]; then
+    _wanted commands expl sub-command \
+        compadd open params user login type ascii binary mode put \
+          putat get getat append appendat ls dir local remote mkdir rmdir \
+          session rmsession
+    return
+  fi
+  subcom=$words[2]
+  curcontext="${curcontext/:zftp:/:zftp-${words[2]}:}"
+else
+  subcom=$service
+fi
+
+case $subcom in
+  *(cd|ls|dir))
+    # complete remote directories
+    _tags directories && zfcd_match $PREFIX $SUFFIX
+    ;;
+
+  *(get(|at)|gcp|delete|remote))
+    # complete remote files
+    _tags files && zfget_match $PREFIX $SUFFIX
+    ;;
+
+  *(put(|at)|pcp))
+    # complete local files
+    _files
+    ;;
+
+  *(open|anon|params))
+    # complete hosts:  should do cleverer stuff with user names
+    _hosts
+    ;;
+
+  *(goto|mark))
+    # complete bookmarks.  First decide if ncftp mode is go.
+    if [[ $words[2] = -*n* ]]; then
+      if [[ -f ~/.ncftp/bookmarks ]]; then
+        _wanted bookmarks expl bookmark \
+            compadd - $(awk -F, 'NR > 2 { print $1 }' ~/.ncftp/bookmarks)
+      fi
+    else
+      if [[ -f ${ZFTP_BMFILE:=${ZDOTDIR:-$HOME}/.zfbkmarks} ]]; then
+        _wanted bookmarks expl bookmark \
+            compadd - $(awk '{print $1}' $ZFTP_BMFILE)
+      fi
+    fi
+    ;;
+
+  *session)
+    # complete sessions, excluding the current one.
+    _wanted sessions expl 'another FTP session' \
+        compadd - ${$(zftp session):#$ZFTP_SESSION}
+    ;;
+
+  *transfer)
+    # complete arguments like sess1:file1 sess2:file2
+    if [[ $PREFIX = *:* ]]; then
+      # complete file in the given session
+      _tags files || return 1
+      local sess=${PREFIX%%:*} oldsess=$ZFTP_SESSION
+      compset -p $(( $#sess + 1 ))
+      [[ -n $sess ]] && zftp session $sess
+      zfget_match $PREFIX $SUFFIX
+      [[ -n $sess && -n $oldsess ]] && zftp session $oldsess
+    else
+      # note here we can complete the current session
+      _wanted sessions expl 'FTP session' compadd -S : - $(zftp session)
+    fi
+    ;;
+
+  *)
+    # dunno... try ordinary completion after all.
+    _compskip=''
+    return 1
+    ;;
+esac