From a8ffff2cb774a83584e4467b14c41517973c5468 Mon Sep 17 00:00:00 2001 From: Oliver Kiddle Date: Wed, 7 Nov 2012 20:59:09 +0000 Subject: users/17382: complete URLs for vim and make _remote_files more consistent with _files --- ChangeLog | 9 +++- Completion/Base/Utility/_remote_files | 77 ------------------------------- Completion/Unix/Command/_git | 2 +- Completion/Unix/Command/_vim | 21 ++++++--- Completion/Unix/Type/_remote_files | 86 +++++++++++++++++++++++++++++++++++ Completion/Unix/Type/_urls | 8 ++-- 6 files changed, 115 insertions(+), 88 deletions(-) delete mode 100644 Completion/Base/Utility/_remote_files create mode 100644 Completion/Unix/Type/_remote_files diff --git a/ChangeLog b/ChangeLog index 72e45a925..a6a449993 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2012-11-07 Oliver Kiddle + + * users/17382: Completion/Unix/Type/_remote_files, + Completion/Unix/Command/_vim, Completion/Unix/Command/_git, + Completion/Unix/Type/_urls: complete URLs for vim and make + _remote_files more consistent with _files + 2012-10-25 Peter Stephenson * 30735: Src/parse.c: array assignments aren't simple because @@ -292,5 +299,5 @@ ***************************************************** * This is used by the shell to define $ZSH_PATCHLEVEL -* $Revision: 1.5751 $ +* $Revision: 1.5752 $ ***************************************************** diff --git a/Completion/Base/Utility/_remote_files b/Completion/Base/Utility/_remote_files deleted file mode 100644 index c35e3d3fa..000000000 --- a/Completion/Base/Utility/_remote_files +++ /dev/null @@ -1,77 +0,0 @@ -#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 [--no-files] [--no-dirs] -- [] -# -# Options: -# - --no-files: don't complete remote files -# - --no-dirs: don't complete remote directories -# -# 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 - -if zstyle -T ":completion:${curcontext}:files" remote-access; then - - # Parse options to _remote_files. Stops at the first "--". - zparseopts -D -E -a args -no-files -no-dirs - shift - - # 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 ${IPREFIX%:} ls -d1FL -- "$rempat" 2>/dev/null)"}%%[^/]#(|/)}) - - compset -P '*/' - compset -S '/*' || suf='remote file' - - remdispf=(${remfiles:#*/}) - remdispd=(${(M)remfiles:#*/}) - - _tags files - while _tags; do - while _next_label files expl ${suf:-remote directory}; do - [[ ${args[(I)--no-files]} -eq 0 ]] && \ - [[ -n $suf ]] && compadd "$@" "$expl[@]" -d remdispf \ - ${(q)remdispf%[*=@|]} && ret=0 - [[ ${args[(I)--no-dirs]} -eq 0 ]] && \ - compadd ${suf:+-S/} "$@" "$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/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] -- [] +# +# 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 -- cgit 1.4.1