Subject: RE: bug#12066: 24.1; Customize :type `restricted-sexp' :tag - use it for prompt

From: "Drew Adams" <[email-masked]>
Date: Fri, 27 Jul 2012 02:27:41 -0700

The behavior I described is no doubt not what is seen with emacs -Q.

In emacs -Q the sexp is not read in the minibuffer.  In my setup it is.  I'm not
sure why, but if there is no case with vanilla Emacs where the sexp is read in
the minibuffer then this request can be closed.

In the example I was using for testing, the :type was actually a `choice', only
one choice of which was the `restrictive-sexp' as presented.

In my setup, when I choose that choice in Value Menu the sexp is read in the
minibuffer.  After it is read, the editable field has been created and populated
with the sexp read.  And thereafter `read' uses that field for the sexp.  IOW,
the field is not there at first, and the first `read' reads from the minibuffer.
Perhaps this behavior has something to do with my using a standalone minibuffer
frame - dunno.

In emacs -Q, when I choose that choice in Value Menu the editable field is
displayed immediately and the sexp is then read from there.

I don't know what causes this difference.

Here is a backtrace from my setup showing the call to `read'.  The prompt
appears when `minibuffer-depth-setup' is called (just before, presumably).

Debugger entered--entering a function:
* minibuffer-depth()
* minibuffer-depth-setup()
* #<subr read>(nil)
* apply(#<subr read> nil)
  read(nil)
* #[514 "\300!\207" [read] 4 "\n\n(fn WIDGET VALUE)"]((restricted-sexp :tag
"Character class (e.g., [:space:])" :match-alternatives ((lambda (xx) (let
(name) (and (vectorp xx) (= 1 (length xx)) (symbolp (setq name (aref xx 0)))
(setq name (symbol-name name)) (eq 58 (aref name 0)) (eq 58 (aref name (1-
...))))))) :value nil) nil)
  widget-apply((restricted-sexp :tag "Character class (e.g., [:space:])"
:match-alternatives ((lambda (xx) (let (name) (and (vectorp xx) (= 1 (length
xx)) (symbolp (setq name (aref xx 0))) (setq name (symbol-name name)) (eq 58
(aref name 0)) (eq 58 (aref name (1- ...))))))) :value nil) :value-to-external
nil)
  widget-default-get((restricted-sexp :tag "Character class (e.g., [:space:])"
:match-alternatives ((lambda (xx) (let (name) (and (vectorp xx) (= 1 (length
xx)) (symbolp (setq name (aref xx 0))) (setq name (symbol-name name)) (eq 58
(aref name 0)) (eq 58 (aref name (1- ...))))))) :value nil))
  widget-choice-action((choice :args ((character :value "

I do not see where this is done by my code, but if it is, then this can be
closed.  It's not clear to me what is invoking `read' in this way, so that it
reads a sexp from the minibuffer.  (The debugger shows `read' called with nil as
arg, but the doc of `read' says that it uses the minibuffer (only) when its arg
is t.)

It's also not clear where in the code emacs -Q creates the editable field
immediately, so that it can read from there, vs what I see in my setup, which is
that there is no editable field at first and the first `read' takes place in the
minibuffer.