emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Idle timers with the active minibuffer


From: Johan Bockgård
Subject: Re: Idle timers with the active minibuffer
Date: Thu, 08 Nov 2007 14:53:37 +0100
User-agent: Gnus/5.110007 (No Gnus v0.7) Emacs/23.0.50 (gnu/linux)

Juri Linkov <address@hidden> writes:

> Why idle timers don't run when the minibuffer is activated?
>
> I discovered this behavior when tried using isearch in the original
> buffer after switching to it from the minibuffer without exiting it.
> The idle timer for lazy-highlighting doesn't run.  Steps to reproduce:
>
> 1. activate the minibuffer by e.g. `M-:'
> 2. switch back to the original buffer by `C-x o'
> 3. start isearch C-s and search for a string that have multiple
> occurrences in the original buffer.
>
> Other occurrences are not highlighted by lazy-highlight face.
> Putting a breakpoint on isearch-lazy-highlight-update shows
> that run-with-idle-timer from isearch-lazy-highlight-new-loop
> never runs it when the minibuffer is not yet exited.
>
> Is it an intentional behavior or a bug?

It worked in Emacs 21. The problem seems to come from the change
to command_loop_1 in the following set of changes:

revision 1.312
date: 2006-10-10 03:20:20 +0200;  author: cyd;  state: Exp;  lines: +2 -5;
        * dispnew.c (sit_for): Sit forever if TIMEOUT is t.

        * keyboard.c (command_loop_1): Handle non-number values of
        `minibuffer-message-timeout'.
        (Fexecute_extended_command): Fix typo.

        * minibuf.c (temp_echo_area_glyphs): Sit for
        `minibuffer-message-timeout' seconds.

The change in question was this:

--- keyboard.c  15 Sep 2006 07:19:14 -0000      1.877
+++ keyboard.c  10 Oct 2006 01:20:20 -0000      1.878
@@ -1546,15 +1546,17 @@
 
       if (minibuf_level
          && !NILP (echo_area_buffer[0])
-         && EQ (minibuf_window, echo_area_window)
-         && NUMBERP (Vminibuffer_message_timeout))
+         && EQ (minibuf_window, echo_area_window))
        {
          /* Bind inhibit-quit to t so that C-g gets read in
             rather than quitting back to the minibuffer.  */
          int count = SPECPDL_INDEX ();
          specbind (Qinhibit_quit, Qt);
 
-         sit_for (Vminibuffer_message_timeout, 0, 2);
+         if (NUMBERP (Vminibuffer_message_timeout))
+           sit_for (Vminibuffer_message_timeout, 0, 2);
+         else
+           sit_for (Qt, 0, 2);
 
          /* Clear the echo area.  */
          message2 (0, 0, 0);

I thinks it was made in response to this bug report

[minibuffer-message-timeout has no effect]
http://lists.gnu.org/archive/html/emacs-devel/2006-10/msg00216.html

Reverting the change fixes the isearch problem. The bug report contained
no test case, but the following example works correctly without the
change to command_loop_1 (the fix to temp_echo_area_glyphs is enough).

    (defun foo ()
      (interactive)
      (let ((minibuffer-message-timeout 0.2))
        (minibuffer-message "foo")))

    (global-set-key [f7] 'foo)

    ;; M-: <f7>

-- 
Johan Bockgård





reply via email to

[Prev in Thread] Current Thread [Next in Thread]