From 03ea5b873a2f8c5d19bfe0e5682a9700e86d1160 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Fri, 15 Jul 2011 19:59:25 -0400 Subject: [PATCH] * lisp/subr.el (read-char-choice): Respect help-form. (Bug#9001) --- lisp/ChangeLog | 1 + lisp/subr.el | 43 ++++++++++++++++++++++++++----------------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 1a2c8daed5b..5efd11e542b 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,6 +1,7 @@ 2011-07-15 Glenn Morris * subr.el (read-char-choice): Allow quitting. (Bug#9001) + Respect help-form. 2011-07-09 Lawrence Mitchell diff --git a/lisp/subr.el b/lisp/subr.el index d462283b7bd..ef19797012a 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -2145,25 +2145,34 @@ If optional argument INHIBIT-KEYBOARD-QUIT is non-nil, ignore keyboard-quit events while waiting for a valid input." (unless (consp chars) (error "Called `read-char-choice' without valid char choices")) - (let (char done) + (let (char done show-help (helpbuf " *Char Help*")) (let ((cursor-in-echo-area t) (executing-kbd-macro executing-kbd-macro)) - (while (not done) - (unless (get-text-property 0 'face prompt) - (setq prompt (propertize prompt 'face 'minibuffer-prompt))) - (setq char (let ((inhibit-quit inhibit-keyboard-quit)) - (read-key prompt))) - (cond - ((not (numberp char))) - ((memq char chars) - (setq done t)) - ((and executing-kbd-macro (= char -1)) - ;; read-event returns -1 if we are in a kbd macro and - ;; there are no more events in the macro. Attempt to - ;; get an event interactively. - (setq executing-kbd-macro nil)) - ((and (not inhibit-keyboard-quit) (eq char ?\C-g)) - (keyboard-quit))))) + (save-window-excursion ; in case we call help-form-show + (while (not done) + (unless (get-text-property 0 'face prompt) + (setq prompt (propertize prompt 'face 'minibuffer-prompt))) + (setq char (let ((inhibit-quit inhibit-keyboard-quit)) + (read-key prompt))) + (and show-help (buffer-live-p helpbuf) + (kill-buffer helpbuf)) + (cond + ((not (numberp char))) + ;; If caller has set help-form, that's enough. + ;; They don't explicitly have to add help-char to chars. + ((and help-form + (eq char help-char) + (setq show-help t) + (help-form-show))) + ((memq char chars) + (setq done t)) + ((and executing-kbd-macro (= char -1)) + ;; read-event returns -1 if we are in a kbd macro and + ;; there are no more events in the macro. Attempt to + ;; get an event interactively. + (setq executing-kbd-macro nil)) + ((and (not inhibit-keyboard-quit) (eq char ?\C-g)) + (keyboard-quit)))))) ;; Display the question with the answer. But without cursor-in-echo-area. (message "%s%s" prompt (char-to-string char)) char)) -- 2.39.2