Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
PATCH: zmv with alternative commands
- X-seq: zsh-workers 31503
- From: Peter Stephenson <p.stephenson@xxxxxxxxxxx>
- To: Zsh Hackers' List <zsh-workers@xxxxxxx>
- Subject: PATCH: zmv with alternative commands
- Date: Wed, 03 Jul 2013 12:17:00 +0100
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
- Organization: Samsung Cambridge Solution Centre
I wanted to use zmv to "p4 integrate" (think alternatively of "git mv"
--- not the same but should indicate what I'm using zmv for) some files.
I encountered two problems: zmv doesn't split the words of the program
you supply with -p, and also "p4 integrate" doesn't understand a
following "--" to indicate the end of options for the subcommand. I've
introduced -P for the latter case.
Rather minor, but does change the user interface...
diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo
index b191e10..a8ddad2 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 4ba664e..269fe5b 100644
--- a/Functions/Misc/zmv
+++ b/Functions/Misc/zmv
@@ -93,7 +93,11 @@
# -p <program>
# Call <program> instead of cp, ln or mv. Whatever it does, it should
# at least understand the form '<program> -- <oldname> <newname>',
-# where <oldname> and <newname> are filenames generated.
+# where <oldname> and <newname> are filenames generated. <program>
+# will be split into words.
+# -P <program>
+# 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
pws
Messages sorted by:
Reverse Date,
Date,
Thread,
Author