Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Quoting problems with _zip (unzip) completer



2009/8/4 Peter Stephenson <pws@xxxxxxx>:
> Mikael Magnusson wrote:
>> % unzip test\[.zip <tab>
>> _zip:117: bad pattern: test[.zip(|.zip|.ZIP)
>> _zip:117: bad pattern: test[.zip(|.zip|.ZIP)
>> _zip:117: bad pattern: test[.zip(|.zip|.ZIP)
>>
>>..
>> @@ -114,7 +114,7 @@ case $state in
>>      if [[ $service = zip ]] && (( ! ${+opt_args[-d]} )); then
>>        _wanted files expl zfile _files -g
>> '^(#i)*.(zip|xpi|[ejw]ar)(-.)' && return
>>      else
>> -      zipfile=( $~line[1](|.zip|.ZIP) )
>> +      zipfile=( $line[1](|.zip|.ZIP) )
>>        [[ -z $zipfile[1] ]] && return 1
>>        if [[ $zipfile[1] !=  $_zip_cache_list ]]; then
>>       _zip_cache_name="$zipfile[1]"
>
> The trouble is this stops you using filenames with a ~, among other
> things.  This suggests the value of "line" is a bit inconsistent.  Sure
> enough if I use ~/tmp/zip/tmp\[.zip $line[1] comes back (using print -r) as
>
>  ~/tmp/zip/test[.zip
>
> which is wrong---either the ~ needs to be expanded, or the [ needs to be
> quoted.  So this needs tracking internally, unfortunately.  If it hits
> the internal completion quoting system we're probably stuck---I spent
> weeks looking at that a couple of years ago and got virtually nowhere.
> However, it may not be that bad in this case.

I would argue it is better without the $~; I can replace the ~ with
$PWD on the commandline, but I can't rename the file to not have
brackets without actually renaming it.

I came up with a reproducible test case for the other issue:
% mkdir '[test] a name with spaces'
% touch '[test] a name with spaces'/{'a file with spaces','another
file with spaces',a file with a unique name','afilewithoutspaces'}
% zip -r test.zip '[test] a name with spaces'
% unzip test.zip <tab> # -> gives "\[test\]\ a\ name\ with\ spaces "
with the space after
% unzip test.zip \[test\]\ a\ name\ with\ spaces<tab> # -> just adds
the space back
% unzip test.zip \[test\]\ a\ name\ with\ spaces/<tab>
# -> \[test\]\ a\ name\ with\ spaces/afilewithoutspaces
% unzip test.zip \[test\]\ a\ name\ with\ spaces/a<tab>
# same
% unzip test.zip \[test\]\ a\ name\ with\ spaces/an<tab>
# -> "\[test\]\ a\ name\ with\ spaces/another\ file\ with\ spaces "
# (as a unique match)
% unzip test.zip \[test\]\ a\ name\ with\ spaces/a\ file<tab><tab><tab><tab>
# just beeps, ie no matches

calling the directory 'normaldirectoryname' causes the directory to
get a slash appended at the first step, but the files inside then
behave exactly the same as above.

According to _complete_debug the whole array of filenames gets passed
down along the chain, it should be available here for some time:
http://mika.l3ib.org/zsh-zip-complete-debug.txt

-- 
Mikael Magnusson



Messages sorted by: Reverse Date, Date, Thread, Author