* Potential problem of minibuffer-message
@ 2003-04-10 1:44 Kenichi Handa
2003-04-10 13:44 ` Stefan Monnier
2003-04-10 22:47 ` Richard Stallman
0 siblings, 2 replies; 11+ messages in thread
From: Kenichi Handa @ 2003-04-10 1:44 UTC (permalink / raw)
I'd like to install the attached change.
Currently, minibuffer-message calls temp_echo_area_glyphs
with the arg SDATA (string), and temp_echo_area_glyphs
inserts it by insert_string function. But insert_string
should not be used for the contents of Lisp string. My fix
changes the arg of temp_echo_area_glyphs to Lisp string, and
use insert_from_string to insert it.
I also want to add the optional arg TIMEOUT to
minibuffer-message and temp_echo_area_glyphs. It is to
specify how long to display the text instead of the defualt
two seconds.
I need TIMEOUT because I'm going to change quail to use just
`message' (normal case) or `minibuffer-message' (the case of
inputting in a minibuffer) to display the guidance string.
In the latter case, the two seconds is too short.
By the way, minibuffer-message is not described in Elisp
info nor in NEWS.
---
Ken'ichi HANDA
handa@m17n.org
*** minibuf.c.~1.254.~ Sat Jan 25 09:10:34 2003
--- minibuf.c Thu Apr 10 10:35:29 2003
***************
*** 1719,1725 ****
if (NILP (completion))
{
bitch_at_user ();
! temp_echo_area_glyphs (" [No match]");
UNGCPRO;
return 0;
}
--- 1719,1725 ----
if (NILP (completion))
{
bitch_at_user ();
! temp_echo_area_glyphs (build_string (" [No match]"), Qnil);
UNGCPRO;
return 0;
}
***************
*** 1783,1789 ****
else if (!NILP (Vcompletion_auto_help))
Fminibuffer_completion_help ();
else
! temp_echo_area_glyphs (" [Next char not unique]");
return 6;
}
else if (completedp)
--- 1783,1789 ----
else if (!NILP (Vcompletion_auto_help))
Fminibuffer_completion_help ();
else
! temp_echo_area_glyphs (build_string (" [Next char not unique]"), Qnil);
return 6;
}
else if (completedp)
***************
*** 1882,1894 ****
case 1:
if (PT != ZV)
Fgoto_char (make_number (ZV));
! temp_echo_area_glyphs (" [Sole completion]");
break;
case 3:
if (PT != ZV)
Fgoto_char (make_number (ZV));
! temp_echo_area_glyphs (" [Complete, but not unique]");
break;
}
--- 1882,1895 ----
case 1:
if (PT != ZV)
Fgoto_char (make_number (ZV));
! temp_echo_area_glyphs (build_string (" [Sole completion]"), Qnil);
break;
case 3:
if (PT != ZV)
Fgoto_char (make_number (ZV));
! temp_echo_area_glyphs (build_string (" [Complete, but not unique]"),
! Qnil);
break;
}
***************
*** 1949,1955 ****
case 4:
if (!NILP (Vminibuffer_completion_confirm))
{
! temp_echo_area_glyphs (" [Confirm]");
return Qnil;
}
else
--- 1950,1956 ----
case 4:
if (!NILP (Vminibuffer_completion_confirm))
{
! temp_echo_area_glyphs (build_string (" [Confirm]"), Qnil);
return Qnil;
}
else
***************
*** 1986,1992 ****
if (NILP (completion))
{
bitch_at_user ();
! temp_echo_area_glyphs (" [No match]");
return Qnil;
}
if (EQ (completion, Qt))
--- 1987,1993 ----
if (NILP (completion))
{
bitch_at_user ();
! temp_echo_area_glyphs (build_string (" [No match]"), Qnil);
return Qnil;
}
if (EQ (completion, Qt))
***************
*** 2344,2350 ****
if (NILP (completions))
{
bitch_at_user ();
! temp_echo_area_glyphs (" [No completions]");
}
else
internal_with_output_to_temp_buffer ("*Completions*",
--- 2345,2351 ----
if (NILP (completions))
{
bitch_at_user ();
! temp_echo_area_glyphs (build_string (" [No completions]"), Qnil);
}
else
internal_with_output_to_temp_buffer ("*Completions*",
***************
*** 2388,2402 ****
}
\f
! /* Temporarily display the string M at the end of the current
! minibuffer contents. This is used to display things like
! "[No Match]" when the user requests a completion for a prefix
! that has no possible completions, and other quick, unobtrusive
! messages. */
void
! temp_echo_area_glyphs (m)
! const char *m;
{
int osize = ZV;
int osize_byte = ZV_BYTE;
--- 2389,2403 ----
}
\f
! /* Temporarily display STRING at the end of the current minibuffer
! contents for TIMEOUT seconds. This is used to display things like
! "[No Match]" when the user requests a completion for a prefix that
! has no possible completions, and other quick, unobtrusive
! messages. If TIMEOUT is not number, it defaults to 2. */
void
! temp_echo_area_glyphs (string, timeout)
! Lisp_Object string, timeout;
{
int osize = ZV;
int osize_byte = ZV_BYTE;
***************
*** 2409,2418 ****
message (0);
SET_PT_BOTH (osize, osize_byte);
! insert_string (m);
SET_PT_BOTH (opoint, opoint_byte);
Vinhibit_quit = Qt;
! Fsit_for (make_number (2), Qnil, Qnil);
del_range_both (osize, osize_byte, ZV, ZV_BYTE, 1);
SET_PT_BOTH (opoint, opoint_byte);
if (!NILP (Vquit_flag))
--- 2410,2421 ----
message (0);
SET_PT_BOTH (osize, osize_byte);
! insert_from_string (string, 0, 0, SCHARS (string), SBYTES (string), 0);
SET_PT_BOTH (opoint, opoint_byte);
Vinhibit_quit = Qt;
! if (! NUMBERP (timeout))
! timeout = make_number (2);
! Fsit_for (timeout, Qnil, Qnil);
del_range_both (osize, osize_byte, ZV, ZV_BYTE, 1);
SET_PT_BOTH (opoint, opoint_byte);
if (!NILP (Vquit_flag))
***************
*** 2424,2438 ****
}
DEFUN ("minibuffer-message", Fminibuffer_message, Sminibuffer_message,
! 1, 1, 0,
doc: /* Temporarily display STRING at the end of the minibuffer.
! The text is displayed for two seconds,
! or until the next input event arrives, whichever comes first. */)
! (string)
! Lisp_Object string;
{
CHECK_STRING (string);
! temp_echo_area_glyphs (SDATA (string));
return Qnil;
}
\f
--- 2427,2445 ----
}
DEFUN ("minibuffer-message", Fminibuffer_message, Sminibuffer_message,
! 1, 2, 0,
doc: /* Temporarily display STRING at the end of the minibuffer.
! The text is displayed for two seconds by default,
! or until the next input event arrives, whichever comes first.
! The optional second arg TIMEOUT, if non-nil, specifies how long to
! display the text instead of two seconds. */)
! (string, timeout)
! Lisp_Object string, timeout;
{
CHECK_STRING (string);
! if (! NILP (timeout))
! CHECK_NUMBER (timeout);
! temp_echo_area_glyphs (string, timeout);
return Qnil;
}
\f
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Potential problem of minibuffer-message
2003-04-10 1:44 Potential problem of minibuffer-message Kenichi Handa
@ 2003-04-10 13:44 ` Stefan Monnier
2003-04-11 2:22 ` Kenichi Handa
2003-04-10 22:47 ` Richard Stallman
1 sibling, 1 reply; 11+ messages in thread
From: Stefan Monnier @ 2003-04-10 13:44 UTC (permalink / raw)
Cc: emacs-devel
> I'd like to install the attached change.
>
> Currently, minibuffer-message calls temp_echo_area_glyphs
> with the arg SDATA (string), and temp_echo_area_glyphs
> inserts it by insert_string function. But insert_string
> should not be used for the contents of Lisp string. My fix
> changes the arg of temp_echo_area_glyphs to Lisp string, and
> use insert_from_string to insert it.
>
> I also want to add the optional arg TIMEOUT to
> minibuffer-message and temp_echo_area_glyphs. It is to
> specify how long to display the text instead of the defualt
> two seconds.
>
> I need TIMEOUT because I'm going to change quail to use just
> `message' (normal case) or `minibuffer-message' (the case of
> inputting in a minibuffer) to display the guidance string.
> In the latter case, the two seconds is too short.
>
> By the way, minibuffer-message is not described in Elisp
> info nor in NEWS.
As part of my still-in-progress rewrite of completion in elisp,
I use the following (partly taken from complete.el where it is
called PC-temp-minibuffer-message or somesuch).
Note how it already works in both case: from the minibuffer or
from some other buffer. And actually pcomplete needs to be patched
to use this function in place of `message' so as to be more usable
for minibuffer-completion.
Stefan
(defun minibuffer-message (message &rest args)
"Temporarily display STRING at the end of the minibuffer.
The text is displayed for `minibuffer-message-timeout' seconds,
or until the next input event arrives, whichever comes first."
(cond ((not (minibuffer-p (current-buffer)))
(apply 'message message args)
(sit-for (or minibuffer-message-timeout 1000000))
(message nil))
(t
(let ((point-max (point-max)))
(message nil)
(save-excursion
(goto-char point-max)
(insert (apply 'format (if (string-match "\\[.*\\]" message)
message
(concat " [" message "]"))
args))
(let ((inhibit-quit t))
(sit-for (or minibuffer-message-timeout 1000000))
(delete-region point-max (point))
(when quit-flag
(setq quit-flag nil
unread-command-events '(7)))))))))
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Potential problem of minibuffer-message
2003-04-10 1:44 Potential problem of minibuffer-message Kenichi Handa
2003-04-10 13:44 ` Stefan Monnier
@ 2003-04-10 22:47 ` Richard Stallman
1 sibling, 0 replies; 11+ messages in thread
From: Richard Stallman @ 2003-04-10 22:47 UTC (permalink / raw)
Cc: emacs-devel
These changes seem good to me.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Potential problem of minibuffer-message
2003-04-10 13:44 ` Stefan Monnier
@ 2003-04-11 2:22 ` Kenichi Handa
2003-04-11 2:38 ` Miles Bader
2003-04-13 11:23 ` Potential problem of minibuffer-message Richard Stallman
0 siblings, 2 replies; 11+ messages in thread
From: Kenichi Handa @ 2003-04-11 2:22 UTC (permalink / raw)
Cc: emacs-devel
In article <200304101344.h3ADiMe3003713@rum.cs.yale.edu>, "Stefan Monnier" <monnier+gnu/emacs@rum.cs.yale.edu> writes:
> As part of my still-in-progress rewrite of completion in elisp,
> I use the following (partly taken from complete.el where it is
> called PC-temp-minibuffer-message or somesuch).
Ah! Your version is surely superior. But...
> Note how it already works in both case: from the minibuffer or
> from some other buffer.
This facility is surplus in my case (i.e. in quail) because
quail should show different guidance messages in a normal
case and in a minibuffer case anyway.
Richard Stallman <rms@gnu.org> writes:
> These changes seem good to me.
I've just installed this bug fix only.
2003-04-11 Kenichi Handa <handa@m17n.org>
* lisp.h (temp_echo_area_glyphs): Adjust prototype.
* minibuf.c (temp_echo_area_glyphs): Change the arg to Lisp
string. Caller changed.
I'll leave it Stefan and Richard as to these matters.
o Should minibuffer-message has the same argument as message?
o Should it pay attention to the case of being called from
non-minibuffer? Should it automatically re-format the
message to " [...]"?
o Should it use minibuffer-message-timeout as timeout?
For the moment, for quail, I'll use my own version
quail-minibuffer-message which is the simplified version of
Stefan's one.
By the way, I'd like to raise these points too.
o Isn't it better to take care of modified and read-only
flags of the minibuffer?
o If a rear-advancing overlay is in the minibufer and it
has face (or any hooks) property, simply inserting a
message yields an unpleasant result. It seems that we
should have a new function insert-after-markers (analogous
to insert-before-markers).
---
Ken'ichi HANDA
handa@m17n.org
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Potential problem of minibuffer-message
2003-04-11 2:22 ` Kenichi Handa
@ 2003-04-11 2:38 ` Miles Bader
2003-04-11 4:31 ` Kenichi Handa
2003-04-13 11:23 ` Potential problem of minibuffer-message Richard Stallman
1 sibling, 1 reply; 11+ messages in thread
From: Miles Bader @ 2003-04-11 2:38 UTC (permalink / raw)
Cc: monnier+gnu/emacs
Kenichi Handa <handa@m17n.org> writes:
> o If a rear-advancing overlay is in the minibufer and it
> has face (or any hooks) property, simply inserting a
> message yields an unpleasant result. It seems that we
> should have a new function insert-after-markers (analogous
> to insert-before-markers).
How about using an overlay with an `after-string' property, located at
the end of the minibuffer, for the minibuffer-message message itself?
Then there's no modification/insertion at all...
-Miles
--
`To alcohol! The cause of, and solution to,
all of life's problems' --Homer J. Simpson
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Potential problem of minibuffer-message
2003-04-11 2:38 ` Miles Bader
@ 2003-04-11 4:31 ` Kenichi Handa
2003-04-11 4:37 ` Miles Bader
0 siblings, 1 reply; 11+ messages in thread
From: Kenichi Handa @ 2003-04-11 4:31 UTC (permalink / raw)
Cc: monnier+gnu/emacs
In article <buoptntwyg9.fsf@mcspd15.ucom.lsi.nec.co.jp>, Miles Bader <miles@lsi.nec.co.jp> writes:
> How about using an overlay with an `after-string' property, located at
> the end of the minibuffer, for the minibuffer-message message itself?
> Then there's no modification/insertion at all...
Unfortunately, the cursor is shown after that `after-string'
in that case.
---
Ken'ichi HANDA
handa@m17n.org
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Potential problem of minibuffer-message
2003-04-11 4:31 ` Kenichi Handa
@ 2003-04-11 4:37 ` Miles Bader
2003-04-11 4:53 ` overlay property `after-string' Kenichi Handa
0 siblings, 1 reply; 11+ messages in thread
From: Miles Bader @ 2003-04-11 4:37 UTC (permalink / raw)
Cc: monnier+gnu/emacs
Kenichi Handa <handa@m17n.org> writes:
> > How about using an overlay with an `after-string' property, located at
> > the end of the minibuffer, for the minibuffer-message message itself?
> > Then there's no modification/insertion at all...
>
> Unfortunately, the cursor is shown after that `after-string'
> in that case.
Oh yeah, that !@#*& problem -- I ran in the same thing when I was trying
to do my `error messages don't obscure the users input' patch a long time
ago.
That behavior really should simply be fixed, it's stupid
(but unfortunately, not entirely trivial to fix either).
-Miles
--
"Whatever you do will be insignificant, but it is very important that
you do it." Mahatma Ghandi
^ permalink raw reply [flat|nested] 11+ messages in thread
* overlay property `after-string'
2003-04-11 4:37 ` Miles Bader
@ 2003-04-11 4:53 ` Kenichi Handa
2003-04-11 5:02 ` Miles Bader
0 siblings, 1 reply; 11+ messages in thread
From: Kenichi Handa @ 2003-04-11 4:53 UTC (permalink / raw)
Cc: monnier+gnu/emacs
I changed Subject:
In article <buollyhwsws.fsf@mcspd15.ucom.lsi.nec.co.jp>, Miles Bader <miles@lsi.nec.co.jp> writes:
> Kenichi Handa <handa@m17n.org> writes:
>> > How about using an overlay with an `after-string' property, located at
>> > the end of the minibuffer, for the minibuffer-message message itself?
>> > Then there's no modification/insertion at all...
>>
>> Unfortunately, the cursor is shown after that `after-string'
>> in that case.
> Oh yeah, that !@#*& problem -- I ran in the same thing when I was trying
> to do my `error messages don't obscure the users input' patch a long time
> ago.
> That behavior really should simply be fixed, it's stupid
> (but unfortunately, not entirely trivial to fix either).
I'm not sure that the current behaviour is a bug.
(let (overlay)
(insert "abc")
(setq overlay (make-overlay (- (point) 3) (point)))
(overlay-put overlay 'after-string "hello")
(sit-for 2)
(delete-overlay overlay))
In this case, it seems that the current behaviour is correct
(i.e. the cursor is shown after "hello").
---
Ken'ichi HANDA
handa@m17n.org
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: overlay property `after-string'
2003-04-11 4:53 ` overlay property `after-string' Kenichi Handa
@ 2003-04-11 5:02 ` Miles Bader
2003-04-11 6:30 ` Kenichi Handa
0 siblings, 1 reply; 11+ messages in thread
From: Miles Bader @ 2003-04-11 5:02 UTC (permalink / raw)
Cc: monnier+gnu/emacs
Kenichi Handa <handa@m17n.org> writes:
> I'm not sure that the current behaviour is a bug.
...
> In this case, it seems that the current behaviour is correct
> (i.e. the cursor is shown after "hello").
It's dependent on the insertion-type of the overlay; basically, the
cursor should be displayed relative to the overlay text wherever text
will be inserted relative to the overlay text.
For instance, try this modified version of your example:
(let (overlay)
(insert "abc")
(setq overlay (make-overlay (- (point) 3) (point) nil nil t))
(overlay-put overlay 'after-string "[hello]"))
Now type -- whoa, wierd!
-Miles
--
"1971 pickup truck; will trade for guns"
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: overlay property `after-string'
2003-04-11 5:02 ` Miles Bader
@ 2003-04-11 6:30 ` Kenichi Handa
0 siblings, 0 replies; 11+ messages in thread
From: Kenichi Handa @ 2003-04-11 6:30 UTC (permalink / raw)
Cc: monnier+gnu/emacs
In article <buofzopwrs0.fsf@mcspd15.ucom.lsi.nec.co.jp>, Miles Bader <miles@lsi.nec.co.jp> writes:
> It's dependent on the insertion-type of the overlay; basically, the
> cursor should be displayed relative to the overlay text wherever text
> will be inserted relative to the overlay text.
> For instance, try this modified version of your example:
> (let (overlay)
> (insert "abc")
> (setq overlay (make-overlay (- (point) 3) (point) nil nil t))
> (overlay-put overlay 'after-string "[hello]"))
> Now type -- whoa, wierd!
I see your point. You mean this:
Showing the cursor at where the next typed character
will be displayed.
Correct?
I agree that it is the best behaviour, but, yes, fixing
seems very difficult.
By the way, we will encouter this very tricky case, but it
seems ok to igore such a case.
(let (ov1 ov2)
(insert "abcdef")
(setq ov1 (make-overlay (- (point) 6) (- (point) 3) nil nil t))
(overlay-put ov1 'after-string "[hello]")
(setq ov2 (make-overlay (- (point) 3) (point)))
(overlay-put ov2 'before-string "[world]")
(forward-char -3)
(unwind-protect
(while t
(insert (read-char))
(message (format "%d-%d, %d-%d"
(overlay-start ov1) (overlay-end ov1)
(overlay-start ov2) (overlay-end ov2))))
(delete-overlay ov1)
(delete-overlay ov2)))
---
Ken'ichi HANDA
handa@m17n.org
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Potential problem of minibuffer-message
2003-04-11 2:22 ` Kenichi Handa
2003-04-11 2:38 ` Miles Bader
@ 2003-04-13 11:23 ` Richard Stallman
1 sibling, 0 replies; 11+ messages in thread
From: Richard Stallman @ 2003-04-13 11:23 UTC (permalink / raw)
Cc: monnier+gnu/emacs
o Should minibuffer-message has the same argument as message?
Those two functions are not really similar; there is no need for this
incompatible change.
o Should it pay attention to the case of being called from
non-minibuffer? Should it automatically re-format the
message to " [...]"?
I see no importance in this, but I have no objection to it
if someone finds it useful and wants to do it.
o Should it use minibuffer-message-timeout as timeout?
I think the optional arg is good enough. But if you have a specific
use for adding minibuffer-message-timeout, please do.
o Isn't it better to take care of modified and read-only
flags of the minibuffer?
Would you please be more specific?
o If a rear-advancing overlay is in the minibufer and it
has face (or any hooks) property, simply inserting a
message yields an unpleasant result. It seems that we
should have a new function insert-after-markers (analogous
to insert-before-markers).
Either that, or minibuffer-message-timeout could find all overlays on
the first character of the message, and move their ends back where
they belong.
I would expect that the latter is a less complex change overall.
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2003-04-13 11:23 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-04-10 1:44 Potential problem of minibuffer-message Kenichi Handa
2003-04-10 13:44 ` Stefan Monnier
2003-04-11 2:22 ` Kenichi Handa
2003-04-11 2:38 ` Miles Bader
2003-04-11 4:31 ` Kenichi Handa
2003-04-11 4:37 ` Miles Bader
2003-04-11 4:53 ` overlay property `after-string' Kenichi Handa
2003-04-11 5:02 ` Miles Bader
2003-04-11 6:30 ` Kenichi Handa
2003-04-13 11:23 ` Potential problem of minibuffer-message Richard Stallman
2003-04-10 22:47 ` Richard Stallman
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.