]> code.delx.au - gnu-emacs/blobdiff - src/minibuf.c
(wait_reading_process_input): Don't signal SIGIO in batch mode.
[gnu-emacs] / src / minibuf.c
index 4b5185abdb164eb28783da4b15aa17c4c9c461db..b0b3cdaa487e7cf1fabaac45dc571cc066263b97 100644 (file)
@@ -1,6 +1,6 @@
 /* Minibuffer input and completion.
    Copyright (C) 1985, 1986, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001 Free Software Foundation, Inc.
+   2000, 2001, 2003 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -159,7 +159,7 @@ choose_minibuf_frame ()
         init_window_once.  That window doesn't have a buffer.  */
       buffer = XWINDOW (minibuf_window)->buffer;
       if (BUFFERP (buffer))
-       Fset_window_buffer (sf->minibuffer_window, buffer);
+       Fset_window_buffer (sf->minibuffer_window, buffer, Qnil);
       minibuf_window = sf->minibuffer_window;
     }
 
@@ -319,13 +319,22 @@ read_minibuf_noninteractive (map, initial, prompt, backup_n, expflag,
 }
 \f
 DEFUN ("minibufferp", Fminibufferp,
-       Sminibufferp, 0, 0, 0,
-       doc: /* Return t if the current buffer is a minibuffer.  */)
-     ()
+       Sminibufferp, 0, 1, 0,
+       doc: /* Return t if BUFFER is a minibuffer.
+No argument or nil as argument means use current buffer as BUFFER.*/)
+     (buffer)
+     Lisp_Object buffer;
 {
   Lisp_Object tem;
 
-  tem = Fmemq (Fcurrent_buffer (), Vminibuffer_list);
+  if (NILP (buffer))
+    buffer = Fcurrent_buffer ();
+  else if (STRINGP (buffer))
+    buffer = Fget_buffer (buffer);
+  else
+    CHECK_BUFFER (buffer);
+
+  tem = Fmemq (buffer, Vminibuffer_list);
   return ! NILP (tem) ? Qt : Qnil;
 }
 
@@ -390,6 +399,8 @@ Lisp_Object
 minibuffer_completion_contents ()
 {
   int prompt_end = XINT (Fminibuffer_prompt_end ());
+  if (PT < prompt_end)
+    error ("Cannot do completion in the prompt");
   return make_buffer_string (prompt_end, PT, 1);
 }
 \f
@@ -404,7 +415,7 @@ minibuffer_completion_contents ()
    match the front of that history list exactly.  The value is pushed onto
    the list as the string that was read.
 
-   DEFALT specifies te default value for the sake of history commands.
+   DEFALT specifies the default value for the sake of history commands.
 
    If ALLOW_PROPS is nonzero, we do not throw away text properties.
 
@@ -430,6 +441,10 @@ read_minibuf (map, initial, prompt, backup_n, expflag,
   Lisp_Object mini_frame, ambient_dir, minibuffer, input_method;
   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
   Lisp_Object enable_multibyte;
+
+  /* String to add to the history.  */
+  Lisp_Object histstring;
+
   extern Lisp_Object Qfront_sticky;
   extern Lisp_Object Qrear_nonsticky;
 
@@ -573,8 +588,8 @@ read_minibuf (map, initial, prompt, backup_n, expflag,
   Vminibuf_scroll_window = selected_window;
   if (minibuf_level == 1 || !EQ (minibuf_window, selected_window))
     minibuf_selected_window = selected_window;
-  Fset_window_buffer (minibuf_window, Fcurrent_buffer ());
-  Fselect_window (minibuf_window);
+  Fset_window_buffer (minibuf_window, Fcurrent_buffer (), Qnil);
+  Fselect_window (minibuf_window, Qnil);
   XSETFASTINT (XWINDOW (minibuf_window)->hscroll, 0);
 
   Fmake_local_variable (Qprint_escape_newlines);
@@ -664,9 +679,17 @@ read_minibuf (map, initial, prompt, backup_n, expflag,
 
   last_minibuf_string = val;
 
-  /* Add the value to the appropriate history list unless it is empty.  */
-  if (SCHARS (val) != 0
-      && SYMBOLP (Vminibuffer_history_variable))
+  /* Choose the string to add to the history.  */
+  if (SCHARS (val) != 0)
+    histstring = val;
+  else if (STRINGP (defalt))
+    histstring = defalt;
+  else
+    histstring = Qnil;
+
+  /* Add the value to the appropriate history list, if any.  */
+  if (SYMBOLP (Vminibuffer_history_variable)
+      && !NILP (histstring))
     {
       /* If the caller wanted to save the value read on a history list,
         then do so if the value is not already the front of the list.  */
@@ -680,13 +703,15 @@ read_minibuf (map, initial, prompt, backup_n, expflag,
 
       /* The value of the history variable must be a cons or nil.  Other
         values are unacceptable.  We silently ignore these values.  */
+
       if (NILP (histval)
          || (CONSP (histval)
-             && NILP (Fequal (last_minibuf_string, Fcar (histval)))))
+             /* Don't duplicate the most recent entry in the history.  */
+             && NILP (Fequal (histstring, Fcar (histval)))))
        {
          Lisp_Object length;
 
-         histval = Fcons (last_minibuf_string, histval);
+         histval = Fcons (histstring, histval);
          Fset (Vminibuffer_history_variable, histval);
 
          /* Truncate if requested.  */
@@ -1026,7 +1051,7 @@ Prompt with PROMPT.  */)
 DEFUN ("read-variable", Fread_variable, Sread_variable, 1, 2, 0,
        doc: /* Read the name of a user variable and return it as a symbol.
 Prompt with PROMPT.  By default, return DEFAULT-VALUE.
-A user variable is one whose documentation starts with a `*' character.  */)
+A user variable is one for which `user-variable-p' returns non-nil.  */)
      (prompt, default_value)
      Lisp_Object prompt, default_value;
 {
@@ -1531,6 +1556,9 @@ HIST, if non-nil, specifies a history list
   and HISTPOS is the initial position (the position in the list
   which INITIAL-INPUT corresponds to).
   Positions are counted starting from 1 at the beginning of the list.
+  The variable `history-length' controls the maximum length of a
+  history list.
+
 DEF, if non-nil, is the default value.
 
 If INHERIT-INPUT-METHOD is non-nil, the minibuffer inherits
@@ -1705,7 +1733,7 @@ do_completion ()
   if (NILP (completion))
     {
       bitch_at_user ();
-      temp_echo_area_glyphs (" [No match]");
+      temp_echo_area_glyphs (build_string (" [No match]"));
       UNGCPRO;
       return 0;
     }
@@ -1769,7 +1797,7 @@ do_completion ()
       else if (!NILP (Vcompletion_auto_help))
        Fminibuffer_completion_help ();
       else
-       temp_echo_area_glyphs (" [Next char not unique]");
+       temp_echo_area_glyphs (build_string (" [Next char not unique]"));
       return 6;
     }
   else if (completedp)
@@ -1868,13 +1896,13 @@ scroll the window of possible completions.  */)
     case 1:
       if (PT != ZV)
        Fgoto_char (make_number (ZV));
-      temp_echo_area_glyphs (" [Sole completion]");
+      temp_echo_area_glyphs (build_string (" [Sole completion]"));
       break;
 
     case 3:
       if (PT != ZV)
        Fgoto_char (make_number (ZV));
-      temp_echo_area_glyphs (" [Complete, but not unique]");
+      temp_echo_area_glyphs (build_string (" [Complete, but not unique]"));
       break;
     }
 
@@ -1935,7 +1963,7 @@ a repetition of this command will exit.  */)
     case 4:
       if (!NILP (Vminibuffer_completion_confirm))
        {
-         temp_echo_area_glyphs (" [Confirm]");
+         temp_echo_area_glyphs (build_string (" [Confirm]"));
          return Qnil;
        }
       else
@@ -1972,7 +2000,7 @@ Return nil if there is no valid completion, else t.  */)
   if (NILP (completion))
     {
       bitch_at_user ();
-      temp_echo_area_glyphs (" [No match]");
+      temp_echo_area_glyphs (build_string (" [No match]"));
       return Qnil;
     }
   if (EQ (completion, Qt))
@@ -2044,7 +2072,7 @@ Return nil if there is no valid completion, else t.  */)
            i++;
            buffer_nchars--;
          }
-       del_range (1, i + 1);
+       del_range (start_pos, start_pos + buffer_nchars);
       }
     UNGCPRO;
   }
@@ -2330,7 +2358,7 @@ DEFUN ("minibuffer-completion-help", Fminibuffer_completion_help, Sminibuffer_co
   if (NILP (completions))
     {
       bitch_at_user ();
-      temp_echo_area_glyphs (" [No completions]");
+      temp_echo_area_glyphs (build_string (" [No completions]"));
     }
   else
     internal_with_output_to_temp_buffer ("*Completions*",
@@ -2374,15 +2402,15 @@ If no minibuffer is active, return nil.  */)
 }
 
 \f
-/* Temporarily display the string M at the end of the current
+/* Temporarily display STRING at the end of the current
    minibuffer contents.  This is used to display things like
    "[No Match]" when the user requests a completion for a prefix
    that has no possible completions, and other quick, unobtrusive
    messages.  */
 
 void
-temp_echo_area_glyphs (m)
-     const char *m;
+temp_echo_area_glyphs (string)
+     Lisp_Object string;
 {
   int osize = ZV;
   int osize_byte = ZV_BYTE;
@@ -2395,7 +2423,7 @@ temp_echo_area_glyphs (m)
   message (0);
 
   SET_PT_BOTH (osize, osize_byte);
-  insert_string (m);
+  insert_from_string (string, 0, 0, SCHARS (string), SBYTES (string), 0);
   SET_PT_BOTH (opoint, opoint_byte);
   Vinhibit_quit = Qt;
   Fsit_for (make_number (2), Qnil, Qnil);
@@ -2417,7 +2445,8 @@ or until the next input event arrives, whichever comes first.  */)
      (string)
      Lisp_Object string;
 {
-  temp_echo_area_glyphs (SDATA (string));
+  CHECK_STRING (string);
+  temp_echo_area_glyphs (string);
   return Qnil;
 }
 \f