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

Re: Broken specialsed file completion



On Sun, 28 Aug 2016 19:01:58 -0700
Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> wrote:
> The difference is this expression (_path_files line 59):
> 
> sopt="-${(@j::M)${(@)tmp1#-}#?}"
> 
> Previously this would result in sopt='-' but now it appears to yield
> sopt='' -- which doesn't seem to make any sense, because the "-" is
> outside of the parameter expansion.  However, it's affected by the
> setting of rcexpandparam in $_comp_options.
> 
> The expansion of ${(@j::M)${(@)tmp1#-}#?} used to result in a scalar
> empty string, but now it results in an empty array, and rcexpandparam
> discards the "-" because it has no array element with which to pair.
> 
> What's happened here is that given (@j::), the @ is forcing an array,
> where previously the j would force a string.
> 
> I'm still not entirely sure what it should mean to use @ and j in the
> same ex/pansion, but clearly it's wrong for the j to be ignored.

It certainly seems right @ shouldn't be preventing joining.  There's
also the question of whether it should force splitting later.
Traditionally it hasn't, and I think that's correct, too.  However, the
latter isn't really relevant here, I suppose, as there'd be no split so
the empty expression would stay a scalar if already joined.

I'm not sure what the @ should be doing there, either, given that
joining happens before any splitting, and hence also before considering
multiple elements.  I suspect it's got something to do with affecting
the way the matching happens, but I'm not at all sure it actually does
that.

The use of it here is opaque enough that rewriting that expansion might
be a good idea anyway; it's relying on an obscurely different set of
behaviours if it is or isn't presented with an array.  But how to
rewrite it is another question.

> Does the D04 test case below look correct to everyone?
> +
> +  (
> +  set -- "one two" "bucklemy shoe"
> +  IFS=
> +  setopt shwordsplit rcexpandparam
> +  print -l "X${(@j.-.)*}"
> +  )
> +0:Use of @ does not prevent forced join with j
> +>Xone two-bucklemy shoe

Yes, I think that's right.

Thanks for working this out.
pws



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