* PATCH: Completion: Add new _remote_files() helper and use it to reduce code duplication.
@ 2011-11-25 22:00 Simon Ruderich
2011-12-09 13:59 ` Peter Stephenson
0 siblings, 1 reply; 3+ messages in thread
From: Simon Ruderich @ 2011-11-25 22:00 UTC (permalink / raw)
To: zsh-workers
[-- Attachment #1: Type: text/plain, Size: 10754 bytes --]
---
Hello,
This patch adds a new completion utility _remote_files() which
tries to reduce some code duplication when completing remote
files.
Please report any mistakes or overcomplicated solutions (patches
are welcome).
I've tested it (except for _rlogin as I don't use rsh) but I'm
sure there are some cases I missed. Please have a look and test
it.
Regards,
Simon
Completion/Base/Utility/.distfiles | 2 +-
Completion/Base/Utility/_remote_files | 77 +++++++++++++++++++++++++++++++++
Completion/Unix/Command/_git | 35 +--------------
Completion/Unix/Command/_rlogin | 29 +------------
Completion/Unix/Command/_rsync | 28 +-----------
Completion/Unix/Command/_ssh | 38 +---------------
6 files changed, 83 insertions(+), 126 deletions(-)
create mode 100644 Completion/Base/Utility/_remote_files
diff --git a/Completion/Base/Utility/.distfiles b/Completion/Base/Utility/.distfiles
index 97d86bd..d5e359a 100644
--- a/Completion/Base/Utility/.distfiles
+++ b/Completion/Base/Utility/.distfiles
@@ -5,5 +5,5 @@ _arg_compile _combination _regex_arguments _values
_arguments _set_command _retrieve_cache _guard
_cache_invalid _describe _sep_parts _pick_variant
_call_function _multi_parts _store_cache _regex_words
-_complete_help_generic
+_complete_help_generic _remote_files
'
diff --git a/Completion/Base/Utility/_remote_files b/Completion/Base/Utility/_remote_files
new file mode 100644
index 0000000..c35e3d3
--- /dev/null
+++ b/Completion/Base/Utility/_remote_files
@@ -0,0 +1,77 @@
+#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] -- <cmd> [<cmd options>]
+#
+# 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 4a830f2..702afe0 100644
--- a/Completion/Unix/Command/_git
+++ b/Completion/Unix/Command/_git
@@ -5444,39 +5444,6 @@ __git_tree_files () {
# Repository Argument Types
-# _remote_files
-_remote_files_git () {
- # FIXME: these should be imported from _ssh
- # TODO: this should take -/ to only get directories
- # There should be coloring based on all the different ls -F classifiers.
- local expl rempat remfiles remdispf remdispd args suf ret=1
-
- if zstyle -T ":completion:${curcontext}:files" remote-access; then
- zparseopts -D -E -a args p: 1 2 4 6 F:
- if [[ -z $QIPREFIX ]]
- then rempat="${PREFIX%%[^./][^/]#}\*"
- else rempat="${(q)PREFIX%%[^./][^/]#}\*"
- fi
- remfiles=(${(M)${(f)"$(_call_program files ssh $args -a -x ${IPREFIX%:} ls -d1FL "$rempat" 2>/dev/null)"}%%[^/]#(|/)})
- compset -P '*/'
- compset -S '/*' || suf='remote file'
-
- remdispd=(${(M)remfiles:#*/})
-
- _tags files
- while _tags; do
- while _next_label files expl ${suf:-remote directory}; do
- 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
-}
-
(( $+functions[__git_remote_repositories] )) ||
__git_remote_repositories () {
local service
@@ -5484,7 +5451,7 @@ __git_remote_repositories () {
service= _ssh
if compset -P '*:'; then
- _remote_files_git
+ _remote_files --no-files -- ssh
else
_ssh_hosts -S:
fi
diff --git a/Completion/Unix/Command/_rlogin b/Completion/Unix/Command/_rlogin
index 0d8355b..a04c6d0 100644
--- a/Completion/Unix/Command/_rlogin
+++ b/Completion/Unix/Command/_rlogin
@@ -1,32 +1,5 @@
#compdef rlogin rsh remsh=rsh rcp
-_rcp_remote_files () {
- # There should be coloring based on all the different ls -F classifiers.
- local expl remfiles remdispf remdispd suf ret=1
-
- if zstyle -T ":completion:${curcontext}:" remote-access; then
- remfiles=(${(M)${(f)"$(rsh ${IPREFIX%:} ls -d1F ${(Q)PREFIX%%[^./][^/]#}\* 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
- [[ -n $suf ]] && compadd "$@" "$expl[@]" -d remdispf \
- ${(q)remdispf%[*=@|]} && ret=0
- compadd ${suf:+-S/} "$@" "$expl[@]" -d remdispd \
- ${(q)remdispd%/} && ret=0
- done
- (( ret )) || return 0
- done
- else
- _message -e remote-files 'remote file'
- fi
-}
-
_rlogin () {
case "$service" in
rlogin)
@@ -65,7 +38,7 @@ _rlogin () {
if [[ -n "$state" ]]; then
if compset -P '*:'; then
- _rcp_remote_files && ret=0
+ _remote_files -- rsh && ret=0
elif compset -P '*@'; then
_wanted hosts expl host _rlogin_hosts -S: && ret=0
else
diff --git a/Completion/Unix/Command/_rsync b/Completion/Unix/Command/_rsync
index b999c1b..f24a06e 100644
--- a/Completion/Unix/Command/_rsync
+++ b/Completion/Unix/Command/_rsync
@@ -59,33 +59,7 @@ elif compset -P 1 '*::' || compset -P 1 'rsync://*/'; then
elif compset -P 'rsync://'; then
_rsync_user_or_host / "$@"
elif compset -P 1 '*:'; then
-
- if zstyle -T ":completion:${curcontext}:files" remote-access; then
- if [[ -z $QIPREFIX ]]
- then rempat="${PREFIX%%[^./][^/]#}\*"
- else rempat="${(q)PREFIX%%[^./][^/]#}\*"
- fi
- remfiles=(${(M)${(f)"$(_call_program files ssh -a -x ${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
- [[ -n $suf ]] && compadd "$@" "$expl[@]" -d remdispf \
- ${(q)remdispf%[*=@|]} && ret=0
- compadd ${suf:+-S/} "$@" "$expl[@]" -d remdispd \
- ${(q)remdispd%/} && ret=0
- done
- (( ret )) || return 0
- done
- else
- _message -e remote-files 'remote file'
- fi
-
+ _remote_files -- ssh
else
_rsync_user_or_host : "$@"
fi
diff --git a/Completion/Unix/Command/_ssh b/Completion/Unix/Command/_ssh
index bd23c36..a6f2b40 100644
--- a/Completion/Unix/Command/_ssh
+++ b/Completion/Unix/Command/_ssh
@@ -5,40 +5,6 @@
# TODO: update ssh-keygen (not based on 5.9)
# TODO: sshd, ssh-keyscan, ssh-keysign
-
-_remote_files () {
- # There should be coloring based on all the different ls -F classifiers.
- local expl rempat remfiles remdispf remdispd args suf ret=1
-
- if zstyle -T ":completion:${curcontext}:files" remote-access; then
- zparseopts -D -E -a args p: 1 2 4 6 F:
- if [[ -z $QIPREFIX ]]
- then rempat="${PREFIX%%[^./][^/]#}\*"
- else rempat="${(q)PREFIX%%[^./][^/]#}\*"
- fi
- remfiles=(${(M)${(f)"$(_call_program files ssh -o BatchMode=yes $args -a -x ${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
- [[ -n $suf ]] && compadd "$@" "$expl[@]" -d remdispf \
- ${(q)remdispf%[*=@|]} && ret=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
-}
-
_ssh () {
local curcontext="$curcontext" state line expl common tmp cmds suf ret=1
typeset -A opt_args
@@ -386,7 +352,7 @@ _ssh () {
;;
file)
if compset -P '*:'; then
- _remote_files ${(kv)~opt_args[(I)-[FP1246]]/-P/-p} && ret=0
+ _remote_files -- ssh ${(kv)~opt_args[(I)-[FP1246]]/-P/-p} && ret=0
elif compset -P '*@'; then
suf=( -S '' )
compset -S ':*' || suf=( -r: -S: )
@@ -400,7 +366,7 @@ _ssh () {
;;
rfile)
if compset -P '*:'; then
- _remote_files && ret=0
+ _remote_files -- ssh && ret=0
elif compset -P '*@'; then
_wanted hosts expl host _ssh_hosts -r: -S: && ret=0
else
--
1.7.7.3
--
+ privacy is necessary
+ using gnupg http://gnupg.org
+ public key id: 0x92FEFDB7E44C32F9
[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: PATCH: Completion: Add new _remote_files() helper and use it to reduce code duplication.
2011-11-25 22:00 PATCH: Completion: Add new _remote_files() helper and use it to reduce code duplication Simon Ruderich
@ 2011-12-09 13:59 ` Peter Stephenson
2011-12-09 23:11 ` Simon Ruderich
0 siblings, 1 reply; 3+ messages in thread
From: Peter Stephenson @ 2011-12-09 13:59 UTC (permalink / raw)
To: zsh-workers
On Fri, 25 Nov 2011 23:00:17 +0100
Simon Ruderich <simon@ruderich.org> wrote:
> This patch adds a new completion utility _remote_files() which
> tries to reduce some code duplication when completing remote
> files.
>
> Please report any mistakes or overcomplicated solutions (patches
> are welcome).
>
> I've tested it (except for _rlogin as I don't use rsh) but I'm
> sure there are some cases I missed. Please have a look and test
> it.
I suggest you commit these now the release is out of the way --- I've
tried it out a little but I don't use remote file access (other than
transparent) all that much.
--
Peter Stephenson <pws@csr.com> Software Engineer
Tel: +44 (0)1223 692070 Cambridge Silicon Radio Limited
Churchill House, Cambridge Business Park, Cowley Road, Cambridge, CB4 0WZ, UK
Member of the CSR plc group of companies. CSR plc registered in England and Wales, registered number 4187346, registered office Churchill House, Cambridge Business Park, Cowley Road, Cambridge, CB4 0WZ, United Kingdom
More information can be found at www.csr.com. Follow CSR on Twitter at http://twitter.com/CSR_PLC and read our blog at www.csr.com/blog
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: PATCH: Completion: Add new _remote_files() helper and use it to reduce code duplication.
2011-12-09 13:59 ` Peter Stephenson
@ 2011-12-09 23:11 ` Simon Ruderich
0 siblings, 0 replies; 3+ messages in thread
From: Simon Ruderich @ 2011-12-09 23:11 UTC (permalink / raw)
To: zsh-workers
[-- Attachment #1: Type: text/plain, Size: 374 bytes --]
On Fri, Dec 09, 2011 at 01:59:52PM +0000, Peter Stephenson wrote:
> I suggest you commit these now the release is out of the way --- I've
> tried it out a little but I don't use remote file access (other than
> transparent) all that much.
Committed.
Regards,
Simon
--
+ privacy is necessary
+ using gnupg http://gnupg.org
+ public key id: 0x92FEFDB7E44C32F9
[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-12-09 23:16 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-25 22:00 PATCH: Completion: Add new _remote_files() helper and use it to reduce code duplication Simon Ruderich
2011-12-09 13:59 ` Peter Stephenson
2011-12-09 23:11 ` Simon Ruderich
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).