* vim scp autocomplete
@ 2012-11-06 16:21 shawn wilson
2012-11-06 18:20 ` Oliver Kiddle
0 siblings, 1 reply; 4+ messages in thread
From: shawn wilson @ 2012-11-06 16:21 UTC (permalink / raw)
To: Zsh Users
i'm curious if anyone has gotten this working?
i found this:
http://stackoverflow.com/questions/7197021/custom-autocompletion-for-zsh
and i'm sure i can/will (eventually) figure this out. but i just
figured i'd ask if anyone has done this first.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: vim scp autocomplete
2012-11-06 16:21 vim scp autocomplete shawn wilson
@ 2012-11-06 18:20 ` Oliver Kiddle
2012-11-07 13:49 ` Oliver Kiddle
0 siblings, 1 reply; 4+ messages in thread
From: Oliver Kiddle @ 2012-11-06 18:20 UTC (permalink / raw)
To: shawn wilson; +Cc: Zsh Users
shawn wilson wrote:
> i'm curious if anyone has gotten this working?
>
> i found this:
> http://stackoverflow.com/questions/7197021/custom-autocompletion-for-zsh
> and i'm sure i can/will (eventually) figure this out. but i just
> figured i'd ask if anyone has done this first.
I've got something half finished which I attach below. Actually, as far
as vim is concerned this should basically do the job. To finish this, I
wanted to do some work on _remote_files to make it use an interface
closer to _files: -/ instead of --no-files for example.
I've got a lot of half-finished functions and really ought to find time
to finish them off.
Oliver
diff --git a/Completion/Unix/Command/_vim b/Completion/Unix/Command/_vim
index 2c9b0a1..8d0610d 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
diff --git a/Completion/Unix/Type/_urls b/Completion/Unix/Type/_urls
index b53f5a0..87f73f8 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 -- ssh && ret=0
(( ret )) || return 0
done
fi
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: vim scp autocomplete
2012-11-06 18:20 ` Oliver Kiddle
@ 2012-11-07 13:49 ` Oliver Kiddle
2012-11-07 15:02 ` shawn wilson
0 siblings, 1 reply; 4+ messages in thread
From: Oliver Kiddle @ 2012-11-07 13:49 UTC (permalink / raw)
To: shawn wilson, Zsh Users
Actually, the main problem with _remote_files was that it was hard coded
to use ${IPREFIX%:} for the remote host name. This adds a -h option for
specifying the host. I've changed --no-files to -/ and added -g. There's no
equivalent to the former --no-dirs option but if a function needs that,
we should probably support something like the file-patterns style.
I'll also move the function to Unix/Type from Base/Utilities.
Oliver
Index: Completion/Base/Utility/_remote_files
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Base/Utility/_remote_files,v
retrieving revision 1.1
diff -u -r1.1 _remote_files
--- Completion/Base/Utility/_remote_files 9 Dec 2011 22:39:08 -0000 1.1
+++ Completion/Base/Utility/_remote_files 7 Nov 2012 13:30:37 -0000
@@ -4,11 +4,13 @@
# key-based authentication with no passwords or a running ssh-agent to work.
#
# Usage:
-# _remote_files [--no-files] [--no-dirs] -- <cmd> [<cmd options>]
+# _remote_files [-/] [-g glob] [-h host] -- <cmd> [<cmd options>]
#
# Options:
-# - --no-files: don't complete remote files
-# - --no-dirs: don't complete remote directories
+# - -/: 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
@@ -27,12 +29,14 @@
# 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 -no-files -no-dirs
+ zparseopts -D -E -a args / g:=glob h:=host
shift
+ (( $#host)) && shift host || host="${IPREFIX%:}"
# Command to run on the remote system.
cmd="$1"
@@ -51,23 +55,28 @@
else rempat="${(q)PREFIX%%[^./][^/]#}\*"
fi
- remfiles=(${(M)${(f)"$(_call_program files $cmd $cmd_args ${IPREFIX%:} ls -d1FL -- "$rempat" 2>/dev/null)"}%%[^/]#(|/)})
+ remfiles=(${(M)${(f)"$(_call_program files $cmd $cmd_args $host ls -d1FL -- "$rempat" 2>/dev/null)"}%%[^/]#(|/)})
compset -P '*/'
- compset -S '/*' || suf='remote file'
+ 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
- [[ ${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
+ [[ -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
Index: Completion/Unix/Command/_git
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Command/_git,v
retrieving revision 1.167
diff -u -r1.167 _git
--- Completion/Unix/Command/_git 6 Mar 2012 16:38:25 -0000 1.167
+++ Completion/Unix/Command/_git 7 Nov 2012 13:30:37 -0000
@@ -5451,7 +5451,7 @@
service= _ssh
if compset -P '*:'; then
- _remote_files --no-files -- ssh
+ _remote_files -/ -- ssh
else
_ssh_hosts -S:
fi
Index: Completion/Unix/Command/_vim
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Command/_vim,v
retrieving revision 1.11
diff -u -r1.11 _vim
--- Completion/Unix/Command/_vim 10 Feb 2012 17:09:10 -0000 1.11
+++ Completion/Unix/Command/_vim 7 Nov 2012 13:30:37 -0000
@@ -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 @@
'( -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 @@
'(-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 @@
'--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 @@
'(* -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
Index: Completion/Unix/Type/_urls
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/_urls,v
retrieving revision 1.12
diff -u -r1.12 _urls
--- Completion/Unix/Type/_urls 15 Nov 2009 17:52:02 -0000 1.12
+++ Completion/Unix/Type/_urls 7 Nov 2012 13:30:37 -0000
@@ -75,7 +75,7 @@
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 @@
# 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 @@
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
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: vim scp autocomplete
2012-11-07 13:49 ` Oliver Kiddle
@ 2012-11-07 15:02 ` shawn wilson
0 siblings, 0 replies; 4+ messages in thread
From: shawn wilson @ 2012-11-07 15:02 UTC (permalink / raw)
To: Oliver Kiddle; +Cc: Zsh Users
wow thanks. i had applied the patch and started to play with the
completion script behavior but i hadn't gotten that far (sorta new to
this and had national political porn for the us last night after all)
On Wed, Nov 7, 2012 at 1:49 PM, Oliver Kiddle <okiddle@yahoo.co.uk> wrote:
> Actually, the main problem with _remote_files was that it was hard coded
> to use ${IPREFIX%:} for the remote host name. This adds a -h option for
> specifying the host. I've changed --no-files to -/ and added -g. There's no
> equivalent to the former --no-dirs option but if a function needs that,
> we should probably support something like the file-patterns style.
> I'll also move the function to Unix/Type from Base/Utilities.
>
> Oliver
>
> Index: Completion/Base/Utility/_remote_files
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Completion/Base/Utility/_remote_files,v
> retrieving revision 1.1
> diff -u -r1.1 _remote_files
> --- Completion/Base/Utility/_remote_files 9 Dec 2011 22:39:08 -0000 1.1
> +++ Completion/Base/Utility/_remote_files 7 Nov 2012 13:30:37 -0000
> @@ -4,11 +4,13 @@
> # key-based authentication with no passwords or a running ssh-agent to work.
> #
> # Usage:
> -# _remote_files [--no-files] [--no-dirs] -- <cmd> [<cmd options>]
> +# _remote_files [-/] [-g glob] [-h host] -- <cmd> [<cmd options>]
> #
> # Options:
> -# - --no-files: don't complete remote files
> -# - --no-dirs: don't complete remote directories
> +# - -/: 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
> @@ -27,12 +29,14 @@
>
> # 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 -no-files -no-dirs
> + zparseopts -D -E -a args / g:=glob h:=host
> shift
> + (( $#host)) && shift host || host="${IPREFIX%:}"
>
> # Command to run on the remote system.
> cmd="$1"
> @@ -51,23 +55,28 @@
> else rempat="${(q)PREFIX%%[^./][^/]#}\*"
> fi
>
> - remfiles=(${(M)${(f)"$(_call_program files $cmd $cmd_args ${IPREFIX%:} ls -d1FL -- "$rempat" 2>/dev/null)"}%%[^/]#(|/)})
> + remfiles=(${(M)${(f)"$(_call_program files $cmd $cmd_args $host ls -d1FL -- "$rempat" 2>/dev/null)"}%%[^/]#(|/)})
>
> compset -P '*/'
> - compset -S '/*' || suf='remote file'
> + 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
> - [[ ${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
> + [[ -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
> Index: Completion/Unix/Command/_git
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Completion/Unix/Command/_git,v
> retrieving revision 1.167
> diff -u -r1.167 _git
> --- Completion/Unix/Command/_git 6 Mar 2012 16:38:25 -0000 1.167
> +++ Completion/Unix/Command/_git 7 Nov 2012 13:30:37 -0000
> @@ -5451,7 +5451,7 @@
> service= _ssh
>
> if compset -P '*:'; then
> - _remote_files --no-files -- ssh
> + _remote_files -/ -- ssh
> else
> _ssh_hosts -S:
> fi
> Index: Completion/Unix/Command/_vim
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Completion/Unix/Command/_vim,v
> retrieving revision 1.11
> diff -u -r1.11 _vim
> --- Completion/Unix/Command/_vim 10 Feb 2012 17:09:10 -0000 1.11
> +++ Completion/Unix/Command/_vim 7 Nov 2012 13:30:37 -0000
> @@ -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 @@
> '( -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 @@
> '(-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 @@
> '--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 @@
> '(* -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
>
> Index: Completion/Unix/Type/_urls
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/_urls,v
> retrieving revision 1.12
> diff -u -r1.12 _urls
> --- Completion/Unix/Type/_urls 15 Nov 2009 17:52:02 -0000 1.12
> +++ Completion/Unix/Type/_urls 7 Nov 2012 13:30:37 -0000
> @@ -75,7 +75,7 @@
> 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 @@
>
> # 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 @@
> 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
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2012-11-07 15:02 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-11-06 16:21 vim scp autocomplete shawn wilson
2012-11-06 18:20 ` Oliver Kiddle
2012-11-07 13:49 ` Oliver Kiddle
2012-11-07 15:02 ` shawn wilson
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).