(defvar minibuffer-message-mode-line-string nil) (defvar minibuffer-message-mode-line-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) (when (bufferp minibuffer-message-mode-line-buffer) (with-current-buffer minibuffer-message-mode-line-buffer (let ((mls (and (listp mode-line-format) (assq 'minibuffer-message-mode-line-string mode-line-format)))) (if mls (setq mode-line-format (cadr (remq mls mode-line-format)))))) (setq minibuffer-message-mode-line-buffer nil)))) (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)) (or (eq (window-frame) (window-frame (active-minibuffer-window))) (eq (frame-parameter (window-frame (active-minibuffer-window)) 'minibuffer) 'only))) (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-mode-line-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)))