changeset 93013:6fb99dfc30ca

(Fcall_interactively): For interactive code letters 'b' and 'B' put the buffer list into the list of default "future" values of the minibuffer.
author Juri Linkov <juri@jurta.org>
date Sun, 16 Mar 2008 17:45:52 +0000
parents b49a04359896
children 85854c112d9a
files src/callint.c
diffstat 1 files changed, 28 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/callint.c	Sun Mar 16 17:45:11 2008 +0000
+++ b/src/callint.c	Sun Mar 16 17:45:52 2008 +0000
@@ -513,16 +513,35 @@
 	  break;
 
 	case 'b':   		/* Name of existing buffer */
-	  args[i] = Fcurrent_buffer ();
-	  if (EQ (selected_window, minibuf_window))
-	    args[i] = Fother_buffer (args[i], Qnil, Qnil);
-	  args[i] = Fread_buffer (callint_message, args[i], Qt);
-	  break;
+	case 'B':		/* Name of buffer, possibly nonexistent */
+	  {
+	    Lisp_Object tema, temb, temc;
+	    int skip_current = 1;
+
+	    if (*tem == 'b' && !EQ (selected_window, minibuf_window))
+	      skip_current = 0;
 
-	case 'B':		/* Name of buffer, possibly nonexistent */
-	  args[i] = Fread_buffer (callint_message,
-				  Fother_buffer (Fcurrent_buffer (), Qnil, Qnil),
-				  Qnil);
+	    /* Get a list of buffer names (except the current buffer and
+	       internal buffers), and use this list for default values.  */
+	    tema = Qnil;
+	    temc = Fcurrent_buffer ();
+	    teml = Fbuffer_list (selected_frame);
+	    for (; CONSP (teml); teml = XCDR (teml))
+	      {
+		temb = XCAR (teml);
+		if (skip_current && EQ (temb, temc))
+		  continue;
+		if (NILP (temb))
+		  continue;
+		if (NILP (XBUFFER (temb)->name))
+		  continue;
+		if (SREF (XBUFFER (temb)->name, 0) == ' ')
+		  continue;
+		tema = Fcons (XBUFFER (temb)->name, tema);
+	      }
+	    args[i] = Fread_buffer (callint_message, Fnreverse (tema),
+				    *tem == 'b' ? Qt : Qnil);
+	  }
 	  break;
 
         case 'c':		/* Character */