GNU bug report logs - #34614
26.1.92; When reading input in mini-buffer, message to each area overide the input prompt

Previous Next

Package: emacs;

Reported by: Zhang Haijun <ccsmile2008 <at> outlook.com>

Date: Fri, 22 Feb 2019 12:19:01 UTC

Severity: normal

Tags: fixed

Found in version 26.1.92

Fixed in version 27.0.50

Done: Juri Linkov <juri <at> linkov.net>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Juri Linkov <juri <at> linkov.net>
To: HaiJun Zhang <netjune <at> outlook.com>
Cc: "34614 <at> debbugs.gnu.org" <34614 <at> debbugs.gnu.org>, Zhang Haijun <ccsmile2008 <at> outlook.com>
Subject: bug#34614: 26.1.92; When reading input in mini-buffer, message to each area overide the input prompt
Date: Sun, 10 Nov 2019 01:05:08 +0200
> I got it. Thanks for your explaination.
>
> It is strange that minibuffer-message-timeout is defined in C.
> But the timeout is processed in lisp (in the function minibuffer-message).
>
> 在 2019年11月8日 +0800 AM6:58,Juri Linkov <juri <at> linkov.net>,写道:
>
>         The prompt is replaced with the message from autorevert. And after
>         about 2~3 seconds (not fixed), the prompt comes back. What controls
>         the delay(2~3 seconds)? It is not the value of
>         minibuffer-message-timeout, which is 0.6. Is this expected?
>
>     The problem is that when auto-revert-handler calls minibuffer-message,
>     the current buffer is not the minibuffer, because functions that call
>     auto-revert-handler (auto-revert-notify-handler, auto-revert--end-lockout,
>     or auto-revert-buffers) change the current buffer using with-current-buffer.
>    
>     When the current buffer is not the minibuffer then minibuffer-message
>     just calls (message "%s" message) and then does
>     (sit-for (or minibuffer-message-timeout 1000000))
>
>         And it behaves differently with the following test code:
>        
>         (progn (run-with-idle-timer 3 nil
>         (lambda ()
>         (minibuffer-message "Reverting buffer `%s'." (buffer-name))))
>         (call-interactively 'find-file))
>        
>         This works well. The prompt is NOT replaced. The message is appended
>         to the end of the prompt and disappears after 0.6 second.
>
>     To work well like this, minibuffer-message should be called outside
>     of with-current-buffer code block. Yesterday I fixed Man-bgproc-sentinel
>     in bug#19064 to call minibuffer-message outside of with-current-buffer.
>    
>     But auto-revert functions require complete rewrite. I don't see
>     how this could be fixed with a simple change.

Actually I found a solution with two alternatives, and both works well,
and I can't decide which is less error-prone.  This patch shows both:

diff --git a/lisp/autorevert.el b/lisp/autorevert.el
index 9275513c8d..17678010f1 100644
--- a/lisp/autorevert.el
+++ b/lisp/autorevert.el
@@ -815,7 +815,13 @@ auto-revert-handler
     (when revert
       (when (and auto-revert-verbose
                  (not (eq revert 'fast)))
-        (message "Reverting buffer `%s'." (buffer-name)))
+        ;; 1.
+        (with-selected-window (old-selected-window)
+          (minibuffer-message "Reverting buffer `%s'." (buffer-name)))
+        ;; 2.
+        ;; (with-current-buffer (window-buffer (old-selected-window))
+        ;;   (minibuffer-message "Reverting buffer `%s'." (buffer-name)))
+        )
       ;; If point (or a window point) is at the end of the buffer, we
       ;; want to keep it at the end after reverting.  This allows one
       ;; to tail a file.





This bug report was last modified 5 years and 250 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.