diff options
author | Chong Yidong <cyd@stupidchicken.com> | 2011-01-07 12:34:02 -0500 |
---|---|---|
committer | Chong Yidong <cyd@stupidchicken.com> | 2011-01-07 12:34:02 -0500 |
commit | 93a8aacd371bb57f931bb2f45da2eb4b5839a799 (patch) | |
tree | 79a4ac0487cc36860dd8791bed7581518eb242ab | |
parent | 03cb2511ce692ec87fd60eeb0f7194eb9d501a8d (diff) | |
download | emacs-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/NEWS | 2 | ||||
-rw-r--r-- | lisp/ChangeLog | 4 | ||||
-rw-r--r-- | lisp/subr.el | 99 | ||||
-rw-r--r-- | src/ChangeLog | 4 | ||||
-rw-r--r-- | src/fns.c | 13 |
5 files changed, 63 insertions, 59 deletions
@@ -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) |