(defface mode-line-minibuffer-message-face `((t (:background ,(face-attribute 'default :background)))) "") (defvar-local mode-line-minibuffer-message-string nil) (defvar mode-line-minibuffer-message-buffer nil) (defvar mode-line-minibuffer-message-timer nil) (defun mode-line-minibuffer-message-clear () (when (not noninteractive) (when (timerp minibuffer-message-timer) (cancel-timer mode-line-minibuffer-message-timer) (setq mode-line-minibuffer-message-timer nil)) (when (buffer-live-p mode-line-minibuffer-message-buffer) (with-current-buffer mode-line-minibuffer-message-buffer (setq mode-line-minibuffer-message-string nil) (force-mode-line-update))))) (defun mode-line-minibuffer-message-set (message) (let* ((minibuf-window (active-minibuffer-window)) (minibuf-frame (and (window-live-p minibuf-window) (window-frame minibuf-window)))) (when (and (not noninteractive) (window-live-p minibuf-window) (or (eq (window-frame) minibuf-frame) (eq (frame-parameter minibuf-frame 'minibuffer) 'only))) (progn (when (numberp minibuffer-message-clear-timeout) (setq mode-line-minibuffer-message-timer (run-with-timer minibuffer-message-clear-timeout nil #'mode-line-minibuffer-message-clear))) (with-current-buffer (window-buffer (or (window-in-direction 'above minibuf-window) (minibuffer-selected-window) (get-largest-window))) (mode-line-minibuffer-message-clear) (setq mode-line-minibuffer-message-buffer (current-buffer)) (when (and mode-line-format (not (and (listp mode-line-format) (assq 'mode-line-minibuffer-message-string mode-line-format)))) (setq mode-line-format (list '(mode-line-minibuffer-message-string (:eval mode-line-minibuffer-message-string)) mode-line-format))) (setq mode-line-minibuffer-message-string message) (add-face-text-property 0 (length mode-line-minibuffer-message-string) 'mode-line-minibuffer-message-face t mode-line-minibuffer-message-string) (force-mode-line-update)) t)))) (setq clear-message-function #'mode-line-minibuffer-message-clear) (setq set-message-function #'mode-line-minibuffer-message-set)