From 669c070efe06d1820ccb32adaa6b1512279401ab Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Wed, 3 Jul 2013 12:46:02 +0100 Subject: 31503: zmv improvements for user-specified programs. -p splits words of commands passed to it. -P is like -p for when the program doesn't understand the -- convention --- ChangeLog | 6 ++++++ Doc/Zsh/contrib.yo | 10 ++++++++-- Functions/Misc/zmv | 15 +++++++++++---- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 33ff8f0b9..403d04234 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2013-07-03 Peter Stephenson + + * 31503: Doc/Zsh/contrib.yo, Functions/Misc/zmv: split words + in program passed to zmv with -p and add -P for programs + that don't understand the "--" convention. + 2013-06-28 Clint Adams * 31500: Completion/Debian/Command/_dput: dput-ng completion diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo index b191e10d9..06e7ed076 100644 --- a/Doc/Zsh/contrib.yo +++ b/Doc/Zsh/contrib.yo @@ -3618,7 +3618,7 @@ ifzman(above)\ ifnzman((noderef(Utilities))). ) findex(zmv) -item(tt(zmv) [ tt(-finqQsvwW) ] [ -C | -L | -M | -p var(program) ] [ -o var(optstring) ] var(srcpat) var(dest) )( +item(tt(zmv) [ tt(-finqQsvwW) ] [ -C | -L | -M | -[pP] var(program) ] [ -o var(optstring) ] var(srcpat) var(dest) )( Move (usually, rename) files matching the pattern var(srcpat) to corresponding files having names of the form given by var(dest), where var(srcpat) contains parentheses surrounding patterns which will be @@ -3663,7 +3663,13 @@ sitem(tt(-p) var(program))(Call var(program) instead of tt(cp), tt(ln) or tt(mv). Whatever it does, it should at least understand the form ifzman(`var(program) tt(-)tt(-) var(oldname) var(newname)')\ ifnzman(example(var(program) tt(-)tt(-) var(oldname) var(newname))) -where var(oldname) and var(newname) are filenames generated by tt(zmv).) +where var(oldname) and var(newname) are filenames generated by tt(zmv). +var(program) will be split into words, so might be e.g. the name +of an archive tool plus a copy or rename subcommand.) +sitem(tt(-P) var(program))(As tt(-p) var(program), except that +var(program) does not accept a following tt(-)tt(-) to indicate the +end of options. In this case filenames must already be in a sane +form for the program in question.) sitem(tt(-o) var(optstring))(The var(optstring) is split into words and passed down verbatim to the tt(cp), tt(ln) or tt(mv) command called to perform the work. It should probably begin with a `tt(-)'.) diff --git a/Functions/Misc/zmv b/Functions/Misc/zmv index 4ba664e6d..269fe5ba5 100644 --- a/Functions/Misc/zmv +++ b/Functions/Misc/zmv @@ -93,7 +93,11 @@ # -p # Call instead of cp, ln or mv. Whatever it does, it should # at least understand the form ' -- ', -# where and are filenames generated. +# where and are filenames generated. +# will be split into words. +# -P +# As -p, but the program doesn't understand the "--" convention. +# In this case the file names must already be sane. # -w Pick out wildcard parts of the pattern, as described above, and # implicitly add parentheses for referring to them. # -W Just like -w, with the addition of turning wildcards in the @@ -123,14 +127,16 @@ setopt extendedglob local f g args match mbegin mend files action myname tmpf opt exec local opt_f opt_i opt_n opt_q opt_Q opt_s opt_M opt_C opt_L -local opt_o opt_p opt_v opt_w opt_W MATCH MBEGIN MEND +local opt_o opt_p opt_P opt_v opt_w opt_W MATCH MBEGIN MEND local pat repl errstr fpat hasglobqual opat typeset -A from to integer stat +local dashes=-- + myname=${(%):-%N} -while getopts ":o:p:MCLfinqQsvwW" opt; do +while getopts ":o:p:P:MCLfinqQsvwW" opt; do if [[ $opt = "?" ]]; then print -r -- "$myname: unrecognized option: -$OPTARG" >&2 return 1 @@ -144,6 +150,7 @@ done [[ -n $opt_C ]] && action=cp [[ -n $opt_L ]] && action=ln [[ -n $opt_p ]] && action=$opt_p +[[ -n $opt_P ]] && action=$opt_P dashes= if [[ -z $action ]]; then action=$myname[-2,-1] @@ -278,7 +285,7 @@ fi for f in $files; do [[ -z $to[$f] ]] && continue - exec=($action ${=opt_o} $opt_s -- $f $to[$f]) + exec=(${=action} ${=opt_o} $opt_s $dashes $f $to[$f]) [[ -n $opt_i$opt_n$opt_v ]] && print -r -- ${(q-)exec} if [[ -n $opt_i ]]; then read -q 'opt?Execute? ' || continue -- cgit 1.4.1