summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChong Yidong <cyd@stupidchicken.com>2011-01-07 12:34:02 -0500
committerChong Yidong <cyd@stupidchicken.com>2011-01-07 12:34:02 -0500
commit93a8aacd371bb57f931bb2f45da2eb4b5839a799 (patch)
tree79a4ac0487cc36860dd8791bed7581518eb242ab
parent03cb2511ce692ec87fd60eeb0f7194eb9d501a8d (diff)
downloademacs-93a8aacd371bb57f931bb2f45da2eb4b5839a799.tar.gz
Allow format args for y-or-n-p and yes-or-no-p.
* lisp/subr.el (y-or-n-p): Accept format string args. * src/fns.c (Fyes_or_no_p): Accept format string args.
-rw-r--r--etc/NEWS2
-rw-r--r--lisp/ChangeLog4
-rw-r--r--lisp/subr.el99
-rw-r--r--src/ChangeLog4
-rw-r--r--src/fns.c13
5 files changed, 63 insertions, 59 deletions
diff --git a/etc/NEWS b/etc/NEWS
index b55820dac0d..fdc066870ef 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -662,6 +662,8 @@ sc.el, x-menu.el, rnews.el, rnewspost.el
* Lisp changes in Emacs 24.1
+** `y-or-n-p' and `yes-or-no-p' now accept format string arguments.
+
** `image-library-alist' is renamed to `dynamic-library-alist'.
The variable is now used to load all kind of supported dynamic libraries,
not just image libraries. The previous name is still available as an
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 5dfe9a40afd..0ca69d1b5a2 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,7 @@
+2011-01-07 Chong Yidong <cyd@stupidchicken.com>
+
+ * subr.el (y-or-n-p): Accept format string args.
+
2011-01-07 Glenn Morris <rgm@gnu.org>
* Makefile.in (EMACSOPT): Add --no-site-lisp.
diff --git a/lisp/subr.el b/lisp/subr.el
index 8a8e4410ce6..ce0149a477b 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -2011,6 +2011,55 @@ floating point support."
(push read unread-command-events)
nil))))))
(set-advertised-calling-convention 'sit-for '(seconds &optional nodisp) "22.1")
+
+(defun y-or-n-p (prompt &rest args)
+ "Ask user a \"y or n\" question. Return t if answer is \"y\".
+The argument PROMPT is the string to display to ask the question.
+It should end in a space; `y-or-n-p' adds `(y or n) ' to it.
+No confirmation of the answer is requested; a single character is enough.
+Also accepts Space to mean yes, or Delete to mean no. \(Actually, it uses
+the bindings in `query-replace-map'; see the documentation of that variable
+for more information. In this case, the useful bindings are `act', `skip',
+`recenter', and `quit'.\)
+
+Under a windowing system a dialog box will be used if `last-nonmenu-event'
+is nil and `use-dialog-box' is non-nil."
+ ;; ¡Beware! when I tried to edebug this code, Emacs got into a weird state
+ ;; where all the keys were unbound (i.e. it somehow got triggered
+ ;; within read-key, apparently). I had to kill it.
+ (let ((answer 'recenter))
+ (if (and (display-popup-menus-p)
+ (listp last-nonmenu-event)
+ use-dialog-box)
+ (setq answer
+ (x-popup-dialog t `(,prompt ("yes" . act) ("No" . skip))))
+ (setq prompt (concat (apply 'format prompt args)
+ (if (eq ?\s (aref prompt (1- (length prompt))))
+ "" " ")
+ "(y or n) "))
+ (while
+ (let* ((key
+ (let ((cursor-in-echo-area t))
+ (when minibuffer-auto-raise
+ (raise-frame (window-frame (minibuffer-window))))
+ (read-key (propertize (if (eq answer 'recenter)
+ prompt
+ (concat "Please answer y or n. "
+ prompt))
+ 'face 'minibuffer-prompt)))))
+ (setq answer (lookup-key query-replace-map (vector key) t))
+ (cond
+ ((memq answer '(skip act)) nil)
+ ((eq answer 'recenter) (recenter) t)
+ ((memq answer '(exit-prefix quit)) (signal 'quit nil) t)
+ (t t)))
+ (ding)
+ (discard-input)))
+ (let ((ret (eq answer 'act)))
+ (unless noninteractive
+ (message "%s %s" prompt (if ret "y" "n")))
+ ret)))
+
;;; Atomic change groups.
@@ -3305,56 +3354,6 @@ clone should be incorporated in the clone."
(overlay-put ol2 'evaporate t)
(overlay-put ol2 'text-clones dups)))
-;;;; Misc functions moved over from the C side.
-
-(defun y-or-n-p (prompt)
- "Ask user a \"y or n\" question. Return t if answer is \"y\".
-The argument PROMPT is the string to display to ask the question.
-It should end in a space; `y-or-n-p' adds `(y or n) ' to it.
-No confirmation of the answer is requested; a single character is enough.
-Also accepts Space to mean yes, or Delete to mean no. \(Actually, it uses
-the bindings in `query-replace-map'; see the documentation of that variable
-for more information. In this case, the useful bindings are `act', `skip',
-`recenter', and `quit'.\)
-
-Under a windowing system a dialog box will be used if `last-nonmenu-event'
-is nil and `use-dialog-box' is non-nil."
- ;; ¡Beware! when I tried to edebug this code, Emacs got into a weird state
- ;; where all the keys were unbound (i.e. it somehow got triggered
- ;; within read-key, apparently). I had to kill it.
- (let ((answer 'recenter))
- (if (and (display-popup-menus-p)
- (listp last-nonmenu-event)
- use-dialog-box)
- (setq answer
- (x-popup-dialog t `(,prompt ("yes" . act) ("No" . skip))))
- (setq prompt (concat prompt
- (if (eq ?\s (aref prompt (1- (length prompt))))
- "" " ")
- "(y or n) "))
- (while
- (let* ((key
- (let ((cursor-in-echo-area t))
- (when minibuffer-auto-raise
- (raise-frame (window-frame (minibuffer-window))))
- (read-key (propertize (if (eq answer 'recenter)
- prompt
- (concat "Please answer y or n. "
- prompt))
- 'face 'minibuffer-prompt)))))
- (setq answer (lookup-key query-replace-map (vector key) t))
- (cond
- ((memq answer '(skip act)) nil)
- ((eq answer 'recenter) (recenter) t)
- ((memq answer '(exit-prefix quit)) (signal 'quit nil) t)
- (t t)))
- (ding)
- (discard-input)))
- (let ((ret (eq answer 'act)))
- (unless noninteractive
- (message "%s %s" prompt (if ret "y" "n")))
- ret)))
-
;;;; Mail user agents.
;; Here we include just enough for other packages to be able
diff --git a/src/ChangeLog b/src/ChangeLog
index 817d10526eb..9496139f20c 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2011-01-07 Chong Yidong <cyd@stupidchicken.com>
+
+ * fns.c (Fyes_or_no_p): Accept format string args.
+
2011-01-07 Glenn Morris <rgm@gnu.org>
* emacs.c (no_site_lisp): New int.
diff --git a/src/fns.c b/src/fns.c
index 8d54b73586f..3282b300f49 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -2460,7 +2460,7 @@ do_yes_or_no_p (Lisp_Object prompt)
/* Anything that calls this function must protect from GC! */
-DEFUN ("yes-or-no-p", Fyes_or_no_p, Syes_or_no_p, 1, 1, 0,
+DEFUN ("yes-or-no-p", Fyes_or_no_p, Syes_or_no_p, 1, MANY, 0,
doc: /* Ask user a yes-or-no question. Return t if answer is yes.
Takes one argument, which is the string to display to ask the question.
It should end in a space; `yes-or-no-p' adds `(yes or no) ' to it.
@@ -2469,13 +2469,11 @@ and can edit it until it has been confirmed.
Under a windowing system a dialog box will be used if `last-nonmenu-event'
is nil, and `use-dialog-box' is non-nil. */)
- (Lisp_Object prompt)
+ (int nargs, Lisp_Object *args)
{
register Lisp_Object ans;
- Lisp_Object args[2];
struct gcpro gcpro1;
-
- CHECK_STRING (prompt);
+ Lisp_Object prompt = Fformat (nargs, args);
#ifdef HAVE_MENUS
if (FRAME_WINDOW_P (SELECTED_FRAME ())
@@ -2496,10 +2494,7 @@ is nil, and `use-dialog-box' is non-nil. */)
}
#endif /* HAVE_MENUS */
- args[0] = prompt;
- args[1] = build_string ("(yes or no) ");
- prompt = Fconcat (2, args);
-
+ prompt = concat2 (prompt, build_string ("(yes or no) "));
GCPRO1 (prompt);
while (1)