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