Commit f216f388 authored by Juri Linkov's avatar Juri Linkov

Move read-char-from-minibuffer from simple.el to subr.el and document it.

* doc/lispref/minibuf.texi (Multiple Queries):
Document read-char-from-minibuffer (bug#10477, bug#38076).

* lisp/subr.el (read-char-history)
(read-char-from-minibuffer-map)
(read-char-from-minibuffer-map-hash)
(read-char-from-minibuffer-insert-char)
(read-char-from-minibuffer-insert-other, empty-history)
(read-char-from-minibuffer): Move from simple.el to subr.el.
parent b15a2fc3
Pipeline #4001 failed with stage
in 90 minutes and 1 second
...@@ -2253,6 +2253,18 @@ Here is an example of using this function: ...@@ -2253,6 +2253,18 @@ Here is an example of using this function:
@end lisp @end lisp
@end defun @end defun
If you need a function to read a character like @code{read-char} or
@code{read-char-choice} (@pxref{Reading One Event}) but using the
minibuffer, use @code{read-char-from-minibuffer}.
@defun read-char-from-minibuffer prompt &optional chars history
This function uses the minibuffer to read and return a single
character. Optionally, it ignores any input that is not a member of
@var{chars}, a list of accepted characters. The @var{history}
argument specifies the history list symbol to use; if is omitted or
@code{nil}, it doesn't use the history.
@end defun
@node Reading a Password @node Reading a Password
@section Reading a Password @section Reading a Password
@cindex passwords, reading @cindex passwords, reading
......
...@@ -2573,6 +2573,7 @@ This macro works like 'progn', but messages how long it takes to ...@@ -2573,6 +2573,7 @@ This macro works like 'progn', but messages how long it takes to
evaluate the body forms. The value of the last form is the return evaluate the body forms. The value of the last form is the return
value. value.
+++
** New function 'read-char-from-minibuffer'. ** New function 'read-char-from-minibuffer'.
This function works like 'read-char', but uses 'read-from-minibuffer' This function works like 'read-char', but uses 'read-from-minibuffer'
to read a character, so it maintains a history that can be navigated to read a character, so it maintains a history that can be navigated
......
...@@ -5174,76 +5174,6 @@ and KILLP is t if a prefix arg was specified." ...@@ -5174,76 +5174,6 @@ and KILLP is t if a prefix arg was specified."
;; Avoid warning about delete-backward-char ;; Avoid warning about delete-backward-char
(with-no-warnings (delete-backward-char n killp)))) (with-no-warnings (delete-backward-char n killp))))
(defvar read-char-history nil
"The default history for the `read-char-from-minibuffer' function.")
(defvar read-char-from-minibuffer-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent map minibuffer-local-map)
(define-key map [remap self-insert-command]
'read-char-from-minibuffer-insert-char)
map)
"Keymap for the `read-char-from-minibuffer' function.")
(defconst read-char-from-minibuffer-map-hash
(make-hash-table :weakness 'key :test 'equal))
(defun read-char-from-minibuffer-insert-char ()
"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))
(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)
(minibuffer-message "Wrong answer")
(sit-for 2))
(defvar empty-history)
(defun read-char-from-minibuffer (prompt &optional chars history)
"Read a character from the minibuffer, prompting for PROMPT.
Like `read-char', but uses the minibuffer to read and return a character.
When CHARS is non-nil, any input that is not one of CHARS is ignored.
When HISTORY is a symbol, then allows navigating in a history.
The navigation commands are `M-p' and `M-n', with `RET' to select
a character from history."
(discard-input)
(let* ((empty-history '())
(map (if (consp chars)
(or (gethash chars read-char-from-minibuffer-map-hash)
(puthash chars
(let ((map (make-sparse-keymap)))
(set-keymap-parent map read-char-from-minibuffer-map)
(dolist (char chars)
(define-key map (vector char)
'read-char-from-minibuffer-insert-char))
(define-key map [remap self-insert-command]
'read-char-from-minibuffer-insert-other)
map)
read-char-from-minibuffer-map-hash))
read-char-from-minibuffer-map))
(result
(read-from-minibuffer prompt nil map nil
(or history 'empty-history)))
(char
(if (> (length result) 0)
;; We have a string (with one character), so return the first one.
(elt result 0)
;; The default value is RET.
(when history (push "\r" (symbol-value history)))
?\r)))
;; Display the question with the answer.
(message "%s%s" prompt (char-to-string char))
char))
(defun zap-to-char (arg char) (defun zap-to-char (arg char)
"Kill up to and including ARGth occurrence of CHAR. "Kill up to and including ARGth occurrence of CHAR.
Case is ignored if `case-fold-search' is non-nil in the current buffer. Case is ignored if `case-fold-search' is non-nil in the current buffer.
......
...@@ -2665,6 +2665,78 @@ floating point support." ...@@ -2665,6 +2665,78 @@ floating point support."
(push (cons t read) unread-command-events) (push (cons t read) unread-command-events)
nil)))))) nil))))))
(defvar read-char-history nil
"The default history for the `read-char-from-minibuffer' function.")
(defvar read-char-from-minibuffer-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent map minibuffer-local-map)
(define-key map [remap self-insert-command]
'read-char-from-minibuffer-insert-char)
map)
"Keymap for the `read-char-from-minibuffer' function.")
(defconst read-char-from-minibuffer-map-hash
(make-hash-table :weakness 'key :test 'equal))
(defun read-char-from-minibuffer-insert-char ()
"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))
(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)
(minibuffer-message "Wrong answer")
(sit-for 2))
(defvar empty-history)
(defun read-char-from-minibuffer (prompt &optional chars history)
"Read a character from the minibuffer, prompting for PROMPT.
Like `read-char', but uses the minibuffer to read and return a character.
When CHARS is non-nil, any input that is not one of CHARS is ignored.
When HISTORY is a symbol, then allows navigating in a history.
The navigation commands are `M-p' and `M-n', with `RET' to select
a character from history."
(discard-input)
(let* ((empty-history '())
(map (if (consp chars)
(or (gethash chars read-char-from-minibuffer-map-hash)
(puthash chars
(let ((map (make-sparse-keymap)))
(set-keymap-parent map read-char-from-minibuffer-map)
(dolist (char chars)
(define-key map (vector char)
'read-char-from-minibuffer-insert-char))
(define-key map [remap self-insert-command]
'read-char-from-minibuffer-insert-other)
map)
read-char-from-minibuffer-map-hash))
read-char-from-minibuffer-map))
(result
(read-from-minibuffer prompt nil map nil
(or history 'empty-history)))
(char
(if (> (length result) 0)
;; We have a string (with one character), so return the first one.
(elt result 0)
;; The default value is RET.
(when history (push "\r" (symbol-value history)))
?\r)))
;; Display the question with the answer.
(message "%s%s" prompt (char-to-string char))
char))
;; Behind display-popup-menus-p test. ;; Behind display-popup-menus-p test.
(declare-function x-popup-dialog "menu.c" (position contents &optional header)) (declare-function x-popup-dialog "menu.c" (position contents &optional header))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment