summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuri Linkov <juri@linkov.net>2019-06-03 23:27:19 +0300
committerJuri Linkov <juri@linkov.net>2019-06-03 23:27:19 +0300
commit2aae063055283ee64ecf339c812a1fe6d1cb106e (patch)
tree8960dde95c069c045dbd3348b82f4eedf93a307f
parent9d72d6a3a2fb23c6f7123c5aba2457dee93d9454 (diff)
downloademacs-2aae063055283ee64ecf339c812a1fe6d1cb106e.tar.gz
User-friendly display of error messages at the end of minibuffer
* lisp/simple.el (minibuffer-setup-hook): Add minibuffer-error-initialize. (minibuffer-error-initialize, minibuffer-error-function): New functions. (Bug#34939)
-rw-r--r--etc/NEWS6
-rw-r--r--lisp/simple.el22
2 files changed, 28 insertions, 0 deletions
diff --git a/etc/NEWS b/etc/NEWS
index 975fab495a9..980f5123a1d 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -471,6 +471,12 @@ its functions.
names match certain regular expressions as big. Ido won't attempt to
list the contents of such directories when completing file names.
+** Minibuffer
+
+---
+*** Minibuffer now uses 'minibuffer-message' to display error messages
+at the end of the active minibuffer.
+
** map.el
*** Now also understands plists.
*** Now defined via generic functions that can be extended via 'cl-defmethod'.
diff --git a/lisp/simple.el b/lisp/simple.el
index 4454791ad20..6bc3bc5304c 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -2440,6 +2440,28 @@ Go to the history element by the absolute history position HIST-POS."
(goto-history-element hist-pos))
+(add-hook 'minibuffer-setup-hook 'minibuffer-error-initialize)
+
+(defun minibuffer-error-initialize ()
+ "Set up minibuffer error processing."
+ (setq-local command-error-function 'minibuffer-error-function))
+
+(defun minibuffer-error-function (data context caller)
+ "Display error messages in the active minibuffer.
+The same as `command-error-default-function' but display error messages
+at the end of the minibuffer using `minibuffer-message' to not obscure
+the minibuffer contents."
+ (discard-input)
+ (ding)
+ (let ((string (error-message-string data)))
+ ;; If we know from where the error was signaled, show it in
+ ;; *Messages*.
+ (let ((inhibit-message t))
+ (message "%s%s" (if caller (format "%s: " caller) "") string))
+ ;; Display an error message at the end of the minibuffer.
+ (minibuffer-message (concat context string))))
+
+
;Put this on C-x u, so we can force that rather than C-_ into startup msg
(define-obsolete-function-alias 'advertised-undo 'undo "23.2")