emacs-devel
[Top][All Lists]
Advanced

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

Re: New multi-command facility displays in the wrong echo area.


From: Gregory Heytings
Subject: Re: New multi-command facility displays in the wrong echo area.
Date: Tue, 13 Oct 2020 19:27:28 +0000
User-agent: Alpine 2.22 (NEB 394 2020-01-19)


Hi Eli,

Thanks for your comments.

(defvar minibuffer-message-mode-line-string nil)
(setq minibuffer-message-clear-timeout 3)

This seem to make the message clear automatically after a 3-sec timeout? If so, this is also a change in behavior wrt what 'message' does: the current behavior is to clear the message only when an input event comes in, the timeout is optional and off by default.


Indeed, sorry, I forgot to remove that line (which I used to test the function) before sending my mail. It can of course be removed.

Here is a slightly improved version of the code, which removes the (minibuffer-message-mode-line-string ...) from mode-line-format when clearing the minibuffer message.

(defvar minibuffer-message-mode-line-string nil)
(defvar minibuffer-message-buffer nil)
(defun clear-minibuffer-message ()
  (when (not noninteractive)
    (when (timerp minibuffer-message-timer)
      (cancel-timer minibuffer-message-timer)
      (setq minibuffer-message-timer nil))
    (setq minibuffer-message-mode-line-string nil)
    (if (bufferp minibuffer-message-buffer)
        (with-current-buffer minibuffer-message-buffer
          (let ((mls (and (listp mode-line-format)
                          (assq 'minibuffer-message-mode-line-string
                                mode-line-format))))
            (if mls (setq mode-line-format (remq mls mode-line-format))))))))
(defface minibuffer-message-face
  `((t (:background ,(face-attribute 'default :background)
        :foreground ,(face-attribute 'default :foreground)))) "")
(defun set-minibuffer-message (message)
  (when (and (not noninteractive)
             (window-live-p (active-minibuffer-window))
             (eq (window-frame) (window-frame (active-minibuffer-window))))
    (progn
      (when (numberp minibuffer-message-clear-timeout)
        (setq minibuffer-message-timer
              (run-with-timer minibuffer-message-clear-timeout nil
                              #'clear-minibuffer-message)))
      (with-current-buffer
          (window-buffer
           (or (window-in-direction 'above (minibuffer-window))
               (minibuffer-selected-window)
               (get-largest-window)))
        (clear-minibuffer-message)
        (when (and mode-line-format
                   (not (and (listp mode-line-format)
                             (assq 'minibuffer-message-mode-line-string
                                   mode-line-format))))
          (setq minibuffer-message-buffer (current-buffer))
          (setq mode-line-format
                (list "" '(minibuffer-message-mode-line-string
                           (" " (:propertize minibuffer-message-mode-line-string
                                             face minibuffer-message-face) " "))
                      mode-line-format)))
        (setq minibuffer-message-mode-line-string message)
        (force-mode-line-update))
      t)))



reply via email to

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