From a40be60ec89d0eb75cd1e48793f85433de0d3e45 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sun, 6 Dec 2020 23:12:13 +0200 Subject: [PATCH] Backport Handle read-char-from-minibuffer and y-or-n-p from pre-command-hook * lisp/subr.el (read-char-from-minibuffer-insert-char) (read-char-from-minibuffer-insert-other, y-or-n-p-insert-y) (y-or-n-p-insert-n, y-or-n-p-insert-other): Check for 'minibufferp' before executing the body. (read-char-from-minibuffer, y-or-n-p): Let-bind this-command before calling read-from-minibuffer. (Bug#45029) ; Do not merge to master. --- lisp/subr.el | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/lisp/subr.el b/lisp/subr.el index d5cf7fb0031..9081de55c74 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -2697,20 +2697,22 @@ floating point support." "Insert the character you type in the minibuffer and exit. Discard all previous input before inserting and exiting the minibuffer." (interactive) - (delete-minibuffer-contents) - (insert last-command-event) - (exit-minibuffer)) + (when (minibufferp) + (delete-minibuffer-contents) + (insert last-command-event) + (exit-minibuffer))) (defun read-char-from-minibuffer-insert-other () "Handle inserting of a character other than allowed. Display an error on trying to insert a disallowed character. Also discard all previous input in the minibuffer." (interactive) - (delete-minibuffer-contents) - (ding) - (discard-input) - (minibuffer-message "Wrong answer") - (sit-for 2)) + (when (minibufferp) + (delete-minibuffer-contents) + (ding) + (discard-input) + (minibuffer-message "Wrong answer") + (sit-for 2))) (defvar empty-history) @@ -2737,6 +2739,8 @@ history." map) read-char-from-minibuffer-map-hash)) read-char-from-minibuffer-map)) + ;; Protect this-command when called from pre-command-hook (bug#45029) + (this-command this-command) (result (read-from-minibuffer prompt nil map nil (or history 'empty-history))) @@ -2791,28 +2795,31 @@ history." "Insert the answer \"y\" and exit the minibuffer of `y-or-n-p'. Discard all previous input before inserting and exiting the minibuffer." (interactive) - (delete-minibuffer-contents) - (insert "y") - (exit-minibuffer)) + (when (minibufferp) + (delete-minibuffer-contents) + (insert "y") + (exit-minibuffer))) (defun y-or-n-p-insert-n () "Insert the answer \"n\" and exit the minibuffer of `y-or-n-p'. Discard all previous input before inserting and exiting the minibuffer." (interactive) - (delete-minibuffer-contents) - (insert "n") - (exit-minibuffer)) + (when (minibufferp) + (delete-minibuffer-contents) + (insert "n") + (exit-minibuffer))) (defun y-or-n-p-insert-other () "Handle inserting of other answers in the minibuffer of `y-or-n-p'. Display an error on trying to insert a disallowed character. Also discard all previous input in the minibuffer." (interactive) - (delete-minibuffer-contents) - (ding) - (discard-input) - (minibuffer-message "Please answer y or n") - (sit-for 2)) + (when (minibufferp) + (delete-minibuffer-contents) + (ding) + (discard-input) + (minibuffer-message "Please answer y or n") + (sit-for 2))) (defvar empty-history) @@ -2865,6 +2872,8 @@ is nil and `use-dialog-box' is non-nil." (setq prompt (funcall padded prompt)) (let* ((empty-history '()) (enable-recursive-minibuffers t) + ;; Protect this-command when called from pre-command-hook (bug#45029) + (this-command this-command) (str (read-from-minibuffer prompt nil (make-composed-keymap y-or-n-p-map query-replace-map) -- 2.39.2