about summary refs log tree commit diff
path: root/Completion/Unix
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Unix')
-rw-r--r--Completion/Unix/Command/_git2
-rw-r--r--Completion/Unix/Command/_vim21
-rw-r--r--Completion/Unix/Type/_remote_files86
-rw-r--r--Completion/Unix/Type/_urls8
4 files changed, 107 insertions, 10 deletions
diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git
index 88c765fb0..2c0c0b270 100644
--- a/Completion/Unix/Command/_git
+++ b/Completion/Unix/Command/_git
@@ -5451,7 +5451,7 @@ __git_remote_repositories () {
   service= _ssh
 
   if compset -P '*:'; then
-    _remote_files --no-files -- ssh
+    _remote_files -/ -- ssh
   else
     _ssh_hosts -S:
   fi
diff --git a/Completion/Unix/Command/_vim b/Completion/Unix/Command/_vim
index 2c9b0a1a4..42e5058ec 100644
--- a/Completion/Unix/Command/_vim
+++ b/Completion/Unix/Command/_vim
@@ -4,6 +4,7 @@
 _vim_files () {
   case $PREFIX in
     (+*) _files -P './' $* && return 0 ;;
+    (scp|http(|s)|(|s)ftp):*) _urls ;;
     (*) _files $* ;;
   esac
   case $PREFIX in
@@ -21,14 +22,10 @@ arguments=(
   '(   -e -E -s -d -y)-v[vi mode]'
   '(-v    -E    -d -y)-e[ex mode]'
   '(-v -e       -d -y)-E[improved ex mode]'
-  '(-v -e -E -s    -y)-d[diff mode]'
   '(-v -e -E -s -d   )-y[easy mode]'
-  '-R[readonly mode]'
-  '-Z[restricted mode]'
   '-m[modifications (writing files) not allowed]'
   '-M[modifications in text not allowed]'
   '-b[binary mode]'
-  '-g[start with GUI]'
   '-l[lisp mode]'
   '-C[start in compatible mode]'
   '-N[start in incompatible mode]'
@@ -52,7 +49,6 @@ arguments=(
   '(-A -H   )-F[start in Farsi mode]'
   '-T[set terminal type]:::_terminals'
   '-u[use given vimrc file instead of default .vimrc]::rc file:_files'
-  '-U[use given gvimrc file instead of default .gvimrc]::rc file:_files'
   '--noplugin[do not load plugin scripts]'
   '-o-[number of windows to open (default: one for each file)]::window count: '
   '-O-[number of windows to vertically split open (default is one for each file)]::window count: '
@@ -76,7 +72,6 @@ arguments=(
   '--remote-tab-wait[as --remote-wait but open tab page for each file]:*:file:_vim_files'
   '--remote-tab-wait-silent[as --remote-wait-silent but open tab page for each file]:*:file:_vim_files'
   '--remote-expr[evaluate given expression in a vim server and print result]:expression: '
-  '--echo-wid[echo window ID on STDOUT, GUI version only]'
   '--literal[do not expand wildcards in arguments (this is useless with ZSH)]'
   '(- *)--serverlist[list available vim servers and exit]'
   '--servername[name of vim server to send to or name of server to become]:server name:->server'
@@ -88,6 +83,20 @@ arguments=(
   '(* -q)-t[edit file where tag is defined]:tag:_complete_tag'
   '(-t -q)*:file:_vim_files'
 )
+[[ $service != *g* ]] && arguments+='-g[start with GUI]'
+[[ $service != r* ]] && arguments+='-Z[restricted mode]'
+[[ $service != *diff ]] && arguments+='(-v -e -E -s -y)-d[diff mode]'
+[[ $service != *view ]] && arguments+='-R[readonly mode]'
+[[ $service = *g* ]] || (( ${words[(I)-g]} )) && arguments+=(
+  '-font:font:_xft_fonts'
+  '-geometry:geometry:_x_geometry'
+  '(-rv -reverse)'{-rv,-reverse}'[use reverse video]'
+  '-display:display:_x_display'
+  '--role[set unique role to identify main window]:role'
+  '--socketid[open vim inside another GTK widget]:xid'
+  '--echo-wid[echo window ID on stdout]'
+  '-U[use given gvimrc file instead of default .gvimrc]::rc file:_files'
+)
 
 _arguments -C -S $arguments && return
 
diff --git a/Completion/Unix/Type/_remote_files b/Completion/Unix/Type/_remote_files
new file mode 100644
index 000000000..db3316422
--- /dev/null
+++ b/Completion/Unix/Type/_remote_files
@@ -0,0 +1,86 @@
+#autoload
+
+# Complete files on remote systems using SSH (and other programs). Needs
+# key-based authentication with no passwords or a running ssh-agent to work.
+#
+# Usage:
+#   _remote_files [-/] [-g glob] [-h host] -- <cmd> [<cmd options>]
+#
+# Options:
+# - -/: only complete directories
+# - -g: specify a pattern to match against files
+#       p, = and * glob qualifiers supported
+# - -h: specify the remote host, default is ${IPREFIX%:}
+#
+# Commands:
+# - ssh: Additional options for non-interactive use are automatically added
+#        (see below).
+# - All other commands are used unaltered.
+#
+# Examples:
+# - _remote_files -- ssh
+#   Use ssh to retrieve the remote paths. The "--" is not optional!
+# - _remote_files --no-files -- ssh -2 -p 42
+#   Use ssh with the option -2 and -p 42 to retrieve the remote paths and
+#   complete only directories.
+# - _remote_files -- rsh
+#   Use rsh to retrieve the remote paths.
+
+
+# There should be coloring based on all the different ls -F classifiers.
+local expl rempat remfiles remdispf remdispd args cmd cmd_args suf ret=1
+local glob host
+
+if zstyle -T ":completion:${curcontext}:files" remote-access; then
+
+  # Parse options to _remote_files. Stops at the first "--".
+  zparseopts -D -E -a args / g:=glob h:=host
+  shift
+  (( $#host)) && shift host || host="${IPREFIX%:}"
+
+  # Command to run on the remote system.
+  cmd="$1"
+  shift
+
+  # Handle arguments to ssh.
+  if [[ $cmd == ssh ]]; then
+    zparseopts -D -E -a cmd_args p: 1 2 4 6 F:
+    cmd_args="-o BatchMode=yes $cmd_args -a -x"
+  else
+    cmd_args="$@"
+  fi
+
+  if [[ -z $QIPREFIX ]]
+    then rempat="${PREFIX%%[^./][^/]#}\*"
+    else rempat="${(q)PREFIX%%[^./][^/]#}\*"
+  fi
+
+  remfiles=(${(M)${(f)"$(_call_program files $cmd $cmd_args $host ls -d1FL -- "$rempat" 2>/dev/null)"}%%[^/]#(|/)})
+
+  compset -P '*/'
+  compset -S '/*' || (( ${args[(I)-/]} )) || suf='remote file'
+
+  remdispf=(${remfiles:#*/})
+  remdispd=(${(M)remfiles:#*/})
+
+  if (( $#glob )); then
+    match=( '(|[*=|])' )
+    glob[2]="${glob[2]/(#b)\(((|^)[p=\*])\)(#e)/}"
+    glob[2]+="${${match[1]/p/\|}/\*/\*}"
+    remdispf=( ${(M)remdispf:#${~glob[2]}} )
+  fi
+
+  _tags files
+  while _tags; do
+    while _next_label files expl ${suf:-remote directory}; do
+      [[ -n $suf ]] &&
+          compadd "$@" "$expl[@]" -d remdispf ${(q)remdispf%[*=|]} && ret=0
+      compadd ${suf:+-S/} -r "/ \t\n\-" "$@" "$expl[@]" -d remdispd \
+	${(q)remdispd%/} && ret=0
+    done
+    (( ret )) || return 0
+  done
+  return ret
+else
+    _message -e remote-files 'remote file'
+fi
diff --git a/Completion/Unix/Type/_urls b/Completion/Unix/Type/_urls
index b53f5a040..97b1a4402 100644
--- a/Completion/Unix/Type/_urls
+++ b/Completion/Unix/Type/_urls
@@ -75,7 +75,7 @@ fi
 scheme="$match[1]"
 
 case "$scheme" in
-  http(|s)|ftp|gopher)
+  http(|s)|(|s)ftp|scp|gopher)
     if ! compset -P //; then
       _wanted -C "$scheme" prefixes expl 'end of prefix' compadd -S '' "$@" //
       return
@@ -143,7 +143,7 @@ host="$match[1]"
 
 # Complete part after hostname
 
-_tags -C local files || return 1
+_tags remote-files files || return 1
 
 if [[ "$localhttp_servername" = "$host" ]]; then
   if compset -P \~; then
@@ -170,10 +170,12 @@ if [[ "$localhttp_servername" = "$host" ]]; then
   fi
 else
   while _tags; do
-    while _next_label files expl 'local file'; do
+    (( $#urls )) && while _next_label files expl 'local file'; do
       _path_files "$expl[@]" "$@" -W $urls/$scheme/$host "${glob[@]}" && ret=0
       _path_files -S/ -r '/' "$expl[@]" -W $urls/$scheme/$host -/ && ret=0
     done
+    [[ $scheme = (scp|sftp) ]] && _requested remote-files &&
+        _remote_files -h $host -- ssh && ret=0
     (( ret )) || return 0
   done
 fi