unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* 23.0.60; doc string of minibuffer-completing-file-name
@ 2008-04-19 14:40 Drew Adams
  2008-04-19 21:46 ` Stefan Monnier
  0 siblings, 1 reply; 7+ messages in thread
From: Drew Adams @ 2008-04-19 14:40 UTC (permalink / raw)
  To: emacs-pretest-bug; +Cc: submit

Doc string:
 
"Non-nil and non-`lambda' means completing file names."
 
Is that correct? It doesn't seem so, by looking at the C code (but I'm
no expert on that).
 
In Emacs 20 and 21, the "and non-`lambda'" part was not there, and
that still seems correct. When would a user or Lisp access show the
value as `lambda'? I get the impression that a value of `lambda' is
only temporary, within the C code. Shouldn't Lisp code be able to test
this simply for nil/non-nil, to see if file-name completion is
happening?

Also, should this variable be documented in the Elisp manual, along with
minibuffer-completion-(table|predicate|confirm)?
 

In GNU Emacs 23.0.60.1 (i386-mingw-nt5.1.2600)
 of 2008-04-04 on LENNART-69DE564
Windowing system distributor `Microsoft Corp.', version 5.1.2600
configured using `configure --with-gcc (3.4) --no-opt --cflags -Ic:/g/include
-fno-crossjumping'
 





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

* Re: 23.0.60; doc string of minibuffer-completing-file-name
  2008-04-19 14:40 23.0.60; doc string of minibuffer-completing-file-name Drew Adams
@ 2008-04-19 21:46 ` Stefan Monnier
  2008-04-19 22:02   ` Drew Adams
  2008-04-20  7:32   ` Eli Zaretskii
  0 siblings, 2 replies; 7+ messages in thread
From: Stefan Monnier @ 2008-04-19 21:46 UTC (permalink / raw)
  To: Drew Adams; +Cc: emacs-pretest-bug

> "Non-nil and non-`lambda' means completing file names."
 
> Is that correct? It doesn't seem so, by looking at the C code (but I'm
> no expert on that).
 
Indeed, thank you.  Fixed.


        Stefan


PS: It turns out that sending to both emacs-pretest-bug and
submit@... is a bad idea because replies then also go to both addresses,
and are thus considered as new bug-reports, etc...




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

* RE: 23.0.60; doc string of minibuffer-completing-file-name
  2008-04-19 21:46 ` Stefan Monnier
@ 2008-04-19 22:02   ` Drew Adams
  2008-04-20  2:32     ` Stefan Monnier
  2008-04-20  7:32   ` Eli Zaretskii
  1 sibling, 1 reply; 7+ messages in thread
From: Drew Adams @ 2008-04-19 22:02 UTC (permalink / raw)
  To: 'Stefan Monnier'; +Cc: emacs-pretest-bug

> > Is that correct? It doesn't seem so, by looking at the C 
> > code (but I'm no expert on that).
>  
> Indeed, thank you.  Fixed.

Thanks for fixing it. What about this other part?

> > should this variable be documented in the Elisp manual,
> > along with minibuffer-completion-(table|predicate|confirm)?


> PS: It turns out that sending to both emacs-pretest-bug and
> submit@... is a bad idea because replies then also go to both 
> addresses, and are thus considered as new bug-reports, etc...

Then I will send only to whatever M-x report-emacs-bug chooses, as before.





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

* Re: 23.0.60; doc string of minibuffer-completing-file-name
  2008-04-19 22:02   ` Drew Adams
@ 2008-04-20  2:32     ` Stefan Monnier
  0 siblings, 0 replies; 7+ messages in thread
From: Stefan Monnier @ 2008-04-20  2:32 UTC (permalink / raw)
  To: Drew Adams; +Cc: emacs-pretest-bug

>> > Is that correct? It doesn't seem so, by looking at the C 
>> > code (but I'm no expert on that).
>> 
>> Indeed, thank you.  Fixed.

> Thanks for fixing it. What about this other part?

I don't think it's necessary.


        Stefan




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

* Re: 23.0.60; doc string of minibuffer-completing-file-name
  2008-04-19 21:46 ` Stefan Monnier
  2008-04-19 22:02   ` Drew Adams
@ 2008-04-20  7:32   ` Eli Zaretskii
  2008-04-20  8:38     ` Drew Adams
  2008-04-20 19:00     ` Stefan Monnier
  1 sibling, 2 replies; 7+ messages in thread
From: Eli Zaretskii @ 2008-04-20  7:32 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-pretest-bug, drew.adams

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Date: Sat, 19 Apr 2008 17:46:04 -0400
> Cc: emacs-pretest-bug@gnu.org
> 
> > "Non-nil and non-`lambda' means completing file names."
>  
> > Is that correct? It doesn't seem so, by looking at the C code (but I'm
> > no expert on that).
>  
> Indeed, thank you.  Fixed.

Are you sure?  I see this fragment in minibuf.c:

  /* If this minibuffer is reading a file name, that doesn't mean
     recursive ones are.  But we cannot set it to nil, because
     completion code still need to know the minibuffer is completing a
     file name.  So use `lambda' as intermediate value meaning
     "t" in this minibuffer, but "nil" in next minibuffer.  */
  if (!NILP (Vminibuffer_completing_file_name))
    Vminibuffer_completing_file_name = Qlambda;

So it sounds like `lambda' is used in recursive minibuffers.  Am I
missing something?




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

* RE: 23.0.60; doc string of minibuffer-completing-file-name
  2008-04-20  7:32   ` Eli Zaretskii
@ 2008-04-20  8:38     ` Drew Adams
  2008-04-20 19:00     ` Stefan Monnier
  1 sibling, 0 replies; 7+ messages in thread
From: Drew Adams @ 2008-04-20  8:38 UTC (permalink / raw)
  To: 'Eli Zaretskii', 'Stefan Monnier'; +Cc: emacs-pretest-bug

> > > "Non-nil and non-`lambda' means completing file names."
> >  
> > > Is that correct? It doesn't seem so, by looking at the C 
> > > code (but I'm no expert on that).
> >  
> > Indeed, thank you.  Fixed.
> 
> Are you sure?  I see this fragment in minibuf.c:
> 
>   /* If this minibuffer is reading a file name, that doesn't mean
>      recursive ones are.  But we cannot set it to nil, because
>      completion code still need to know the minibuffer is completing a
>      file name.  So use `lambda' as intermediate value meaning
>      "t" in this minibuffer, but "nil" in next minibuffer.  */
>   if (!NILP (Vminibuffer_completing_file_name))
>     Vminibuffer_completing_file_name = Qlambda;
> 
> So it sounds like `lambda' is used in recursive minibuffers.  Am I
> missing something?

Yes, I saw that. No, I'm not sure. My impression is that the value of `lambda'
is temporary, until the recursive minibuffer gets its correct value of nil -
that is, until the recursive call to read_minibuf.

At this point in the code it cannot yet be set to nil (for the next invocation),
because the current invocation still needs to treat it as non-nil. AFAICT, it is
the completion code that does that: tests whether it is currently non-nil.

Note that right at the beginning of read_minibuf, a `lambda' value set by the
parent invocation is converted to a nil value for this (recursive) invocation:

/* If Vminibuffer_completing_file_name is `lambda' on entry, it was t
     in previous recursive minibuffer, but was not set explicitly
     to t for this invocation, so set it to nil in this minibuffer.
     Save the old value now, before we change it.  */

  specbind (intern ("minibuffer-completing-file-name"),
Vminibuffer_completing_file_name);
  if (EQ (Vminibuffer_completing_file_name, Qlambda))
    Vminibuffer_completing_file_name = Qnil;

The phrase "in a previous recursive minibuffer" is I think poor here. It was in
a previous minibuffer, but not necessarily a recursive one - it is _this_
invocation that is recursive (if the value is `lambda'). Otherwise, the comment
is good - it is this comment that explains what the value of `lambda' means.

The following read_minibuf call from completing-read treats nil and `lambda' the
same way when determining the map to use:

val = read_minibuf (NILP (require_match)
		      ? (NILP (Vminibuffer_completing_file_name)
			 || EQ (Vminibuffer_completing_file_name, Qlambda)
			 ? Vminibuffer_local_completion_map
			 : Vminibuffer_local_filename_completion_map)
		      : (NILP (Vminibuffer_completing_file_name)
			 || EQ (Vminibuffer_completing_file_name, Qlambda)
			 ? Vminibuffer_local_must_match_map
			 : Vminibuffer_local_must_match_filename_map),
		      init, prompt, make_number (pos), 0,
		      histvar, histpos, def, 0,
		      !NILP (inherit_input_method));

So it is _not_ for this use that `lambda' was kept non-nil.

do_completion is one place where `lambda' is used temporarily to signify non-nil
during this invocation (it will become nil in a future recursive call). This
happens right after try_completion is called:

if (! NILP (Vminibuffer_completing_file_name)
	  && SREF (completion, SBYTES (completion) - 1) == '/'
...

And here is another such place, in minibuffer-complete-word (again, after
try_completion) - there are two such places in this function:

    /* If reading a file name,
       expand any $ENVVAR refs in the buffer and in TEM.  */
    if (! NILP (Vminibuffer_completing_file_name))
      {
	Lisp_Object substituted;
	substituted = Fsubstitute_in_file_name (tem);
...

So AFAICT, the idea is just to save the current non-nil value for use during the
completion code of this invocation, while nevertheless preparing a nil value to
be used in the recursive call.

I would say that this motivation could be made clearer in the code, both in
comments and perhaps by using a more parlant non-nil value than `lambda'.
`lambda' signifies on entry that this is a recursive call and the value should
be nil, that's all.

Again, no, I'm not sure. (1) I'm no C expert. (2) I didn't study the code in
detail.






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

* Re: 23.0.60; doc string of minibuffer-completing-file-name
  2008-04-20  7:32   ` Eli Zaretskii
  2008-04-20  8:38     ` Drew Adams
@ 2008-04-20 19:00     ` Stefan Monnier
  1 sibling, 0 replies; 7+ messages in thread
From: Stefan Monnier @ 2008-04-20 19:00 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-pretest-bug, drew.adams

> Are you sure?  I see this fragment in minibuf.c:

>   /* If this minibuffer is reading a file name, that doesn't mean
>      recursive ones are.  But we cannot set it to nil, because
>      completion code still need to know the minibuffer is completing a
>      file name.  So use `lambda' as intermediate value meaning
>      "t" in this minibuffer, but "nil" in next minibuffer.  */
>   if (!NILP (Vminibuffer_completing_file_name))
>     Vminibuffer_completing_file_name = Qlambda;

> So it sounds like `lambda' is used in recursive minibuffers.  Am I
> missing something?

Yes, the value `lambda' is used, and quite visibly.  But "external code"
only need to know that it's non-nil.


        Stefan




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

end of thread, other threads:[~2008-04-20 19:00 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-19 14:40 23.0.60; doc string of minibuffer-completing-file-name Drew Adams
2008-04-19 21:46 ` Stefan Monnier
2008-04-19 22:02   ` Drew Adams
2008-04-20  2:32     ` Stefan Monnier
2008-04-20  7:32   ` Eli Zaretskii
2008-04-20  8:38     ` Drew Adams
2008-04-20 19:00     ` Stefan Monnier

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).