zsh-workers
 help / color / mirror / code / Atom feed
* completion bug: treats substitution of unset parameter as empty string
@ 2009-07-29 18:25 Greg Klanderman
  2009-09-09  4:10 ` Greg Klanderman
  0 siblings, 1 reply; 6+ messages in thread
From: Greg Klanderman @ 2009-07-29 18:25 UTC (permalink / raw)
  To: Zsh list


[resending as my post from Monday seems not to have made it to the list]

% unset Q
% ls $Q/ <tab>

lists completions in '/' rather than beep because there are no
completions.

I do have the 'nounset' option set, though I think this should
give an error / no completions either way, as it did with the
old compctl system.

greg


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: completion bug: treats substitution of unset parameter as empty string
  2009-07-29 18:25 completion bug: treats substitution of unset parameter as empty string Greg Klanderman
@ 2009-09-09  4:10 ` Greg Klanderman
  2009-09-10  9:26   ` Peter Stephenson
  0 siblings, 1 reply; 6+ messages in thread
From: Greg Klanderman @ 2009-09-09  4:10 UTC (permalink / raw)
  To: zsh-workers

>>>>> On July 29, 2009 -- Greg Klanderman <gak@klanderman.net> wrote:

> % unset Q
> % ls $Q/ <tab>

> lists completions in '/' rather than beep because there are no
> completions.

> I do have the 'nounset' option set, though I think this should
> give an error / no completions either way, as it did with the
> old compctl system.

OK, so just this line in _path_files needs 'setopt nounset':

|    eval 'realpath=${(e)~linepath}' 2>/dev/null

Is the best way to do that to use an anonymous function:

|    function {
|      setopt localoptions nounset
|      eval 'realpath=${(e)~linepath}' 2>/dev/null
|    }

or is this paradigm which I see in a few places preferred:

|    setopt nounset
|    eval 'realpath=${(e)~linepath}' 2>/dev/null
|    setopt unset

How exactly is the default set of shell options arrived at for the
evaluation of completion functions?  My own setopts do not seem to
effect the completion functions.. how is that?

thanks,
Greg


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: completion bug: treats substitution of unset parameter as empty string
  2009-09-09  4:10 ` Greg Klanderman
@ 2009-09-10  9:26   ` Peter Stephenson
  2009-09-10 14:30     ` Greg Klanderman
  0 siblings, 1 reply; 6+ messages in thread
From: Peter Stephenson @ 2009-09-10  9:26 UTC (permalink / raw)
  To: zsh-workers

Greg Klanderman wrote:
> How exactly is the default set of shell options arrived at for the
> evaluation of completion functions?  My own setopts do not seem to
> effect the completion functions.. how is that?

See _comp_options and _comp_setup in compinit and the use of _comp_setup
in _main_complete.

-- 
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


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: completion bug: treats substitution of unset parameter as empty string
  2009-09-10  9:26   ` Peter Stephenson
@ 2009-09-10 14:30     ` Greg Klanderman
  2009-09-10 14:40       ` Peter Stephenson
  0 siblings, 1 reply; 6+ messages in thread
From: Greg Klanderman @ 2009-09-10 14:30 UTC (permalink / raw)
  To: zsh-workers

>>>>> On September 10, 2009 Peter Stephenson <pws@csr.com> wrote:

> See _comp_options and _comp_setup in compinit and the use of _comp_setup
> in _main_complete.

OK, thanks for the pointer..

Here's a patch to fix the originally reported problem - that
_path_files incorrectly treats a parameter expansion of an
unset parameter as the empty string, i.e. that

% ls $foobar/ <tab>

lists completions under '/'.

thanks,
Greg


Index: Completion/Unix/Type/_path_files
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/_path_files,v
retrieving revision 1.47
diff -u -r1.47 _path_files
--- Completion/Unix/Type/_path_files	5 Aug 2009 00:46:45 -0000	1.47
+++ Completion/Unix/Type/_path_files	10 Sep 2009 14:26:53 -0000
@@ -247,7 +247,9 @@
   # meant as a partial path.
 
   linepath="${(M)pre##*\$[^/]##/}"
+  setopt nounset # do not treat an unset parameter expansion as the empty string
   eval 'realpath=${(e)~linepath}' 2>/dev/null
+  setopt unset
   [[ -z "$realpath" || "$realpath" = "$linepath" ]] && return 1
   pre="${pre#${linepath}}"
   i='[^/]'


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: completion bug: treats substitution of unset parameter as empty string
  2009-09-10 14:30     ` Greg Klanderman
@ 2009-09-10 14:40       ` Peter Stephenson
  2009-09-10 15:23         ` Greg Klanderman
  0 siblings, 1 reply; 6+ messages in thread
From: Peter Stephenson @ 2009-09-10 14:40 UTC (permalink / raw)
  To: zsh-workers

On Thu, 10 Sep 2009 10:30:42 -0400
Greg Klanderman <gak@klanderman.net> wrote:
> Here's a patch to fix the originally reported problem - that
> _path_files incorrectly treats a parameter expansion of an
> unset parameter as the empty string, i.e. that
> 
> % ls $foobar/ <tab>
> 
> lists completions under '/'.

That's fine, however I think (belatedly answering your other question)
that, since we don't need to backport this anywhere, using an anonymous
function would be neater---so we're not relying on the value of "nounset"
outside.  In practice if it were set outside all hell would break loose, so
this is pretty pernickety, but perhaps it's a useful precedent.

Index: Completion/Unix/Type/_path_files
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/_path_files,v
retrieving revision 1.47
diff -u -r1.47 _path_files
--- Completion/Unix/Type/_path_files	5 Aug 2009 00:46:45 -0000	1.47
+++ Completion/Unix/Type/_path_files	10 Sep 2009 14:36:56 -0000
@@ -247,7 +247,11 @@
   # meant as a partial path.
 
   linepath="${(M)pre##*\$[^/]##/}"
-  eval 'realpath=${(e)~linepath}' 2>/dev/null
+  function {
+    # do not treat an unset parameter expansion as the empty string
+    setopt localoptions nounset
+    eval 'realpath=${(e)~linepath}' 2>/dev/null
+  }
   [[ -z "$realpath" || "$realpath" = "$linepath" ]] && return 1
   pre="${pre#${linepath}}"
   i='[^/]'

-- 
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


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: completion bug: treats substitution of unset parameter as empty string
  2009-09-10 14:40       ` Peter Stephenson
@ 2009-09-10 15:23         ` Greg Klanderman
  0 siblings, 0 replies; 6+ messages in thread
From: Greg Klanderman @ 2009-09-10 15:23 UTC (permalink / raw)
  To: zsh-workers

>>>>> On September 10, 2009 Peter Stephenson <pws@csr.com> wrote:

> That's fine, however I think (belatedly answering your other question)
> that, since we don't need to backport this anywhere, using an anonymous
> function would be neater---so we're not relying on the value of "nounset"
> outside.  In practice if it were set outside all hell would break loose, so
> this is pretty pernickety, but perhaps it's a useful precedent.

That works too.  I went with the setopt .. unsetopt since that's what
other completion functions were doing.  I do prefer the anonymous
function, aside from my objection to calling such things functions.
If I could pass arguments after the '}' maybe but you still cannot
control when it is called - it's only a local scope, not a function.

greg


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2009-09-10 15:25 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-07-29 18:25 completion bug: treats substitution of unset parameter as empty string Greg Klanderman
2009-09-09  4:10 ` Greg Klanderman
2009-09-10  9:26   ` Peter Stephenson
2009-09-10 14:30     ` Greg Klanderman
2009-09-10 14:40       ` Peter Stephenson
2009-09-10 15:23         ` Greg Klanderman

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).