]> code.delx.au - gnu-emacs/blobdiff - src/minibuf.c
(message2_nolog): Fix arg types.
[gnu-emacs] / src / minibuf.c
index c518f5243c2fc12970f08fdce59c96cb224221cd..7de73d069e2b504bcbecbc0d426cbd4a1c0ac888 100644 (file)
@@ -1,5 +1,6 @@
 /* Minibuffer input and completion.
-   Copyright (C) 1985, 1986, 93, 94, 95, 1996 Free Software Foundation, Inc.
+   Copyright (C) 1985, 1986, 1993, 1994, 1995, 1996, 1997
+         Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -85,6 +86,9 @@ Lisp_Object Qread_file_name_internal;
 Lisp_Object Qminibuffer_setup_hook, Vminibuffer_setup_hook;
 Lisp_Object Qminibuffer_exit_hook, Vminibuffer_exit_hook;
 
+/* Function to call to read a buffer name.  */
+Lisp_Object Vread_buffer_function; 
+
 /* Nonzero means completion ignores case.  */
 
 int completion_ignore_case;
@@ -112,6 +116,9 @@ Lisp_Object Qminibuffer_default;
 extern Lisp_Object Vminibuf_scroll_window;
 
 extern Lisp_Object Voverriding_local_map;
+
+Lisp_Object Qcurrent_input_method, Qactivate_input_method;
+
 \f
 /* Put minibuf on currently selected frame's minibuffer.
    We do this whenever the user starts a new minibuffer
@@ -148,6 +155,14 @@ choose_minibuf_frame ()
   }
 }
 
+Lisp_Object
+choose_minibuf_frame_1 (ignore)
+     Lisp_Object ignore;
+{
+  choose_minibuf_frame ();
+  return Qnil;
+}
+
 DEFUN ("set-minibuffer-window", Fset_minibuffer_window,
        Sset_minibuffer_window, 1, 1, 0,
   "Specify which minibuffer window to use for the minibuffer.\n\
@@ -168,7 +183,7 @@ without invoking the usual minibuffer commands.")
 \f
 /* Actual minibuffer invocation. */
 
-static void read_minibuf_unwind ();
+static Lisp_Object read_minibuf_unwind ();
 Lisp_Object get_minibuffer ();
 static Lisp_Object read_minibuf ();
 
@@ -185,11 +200,14 @@ static Lisp_Object read_minibuf ();
 
    DEFALT specifies te default value for the sake of history commands.
 
-   If ALLOW_PROPS is nonzero, we do not throw away text properties.  */
+   If ALLOW_PROPS is nonzero, we do not throw away text properties.
+
+   if INHERIT_INPUT_METHOD is nonzeor, the minibuffer inherit the
+   current input method.  */
 
 static Lisp_Object
 read_minibuf (map, initial, prompt, backup_n, expflag,
-             histvar, histpos, defalt, allow_props)
+             histvar, histpos, defalt, allow_props, inherit_input_method)
      Lisp_Object map;
      Lisp_Object initial;
      Lisp_Object prompt;
@@ -198,11 +216,13 @@ read_minibuf (map, initial, prompt, backup_n, expflag,
      Lisp_Object histvar;
      Lisp_Object histpos;
      Lisp_Object defalt;
+     int inherit_input_method;
 {
   Lisp_Object val;
   int count = specpdl_ptr - specpdl;
-  Lisp_Object mini_frame, ambient_dir, minibuffer;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  Lisp_Object mini_frame, ambient_dir, minibuffer, input_method;
+  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+  Lisp_Object enable_multibyte;
 
   specbind (Qminibuffer_default, defalt);
 
@@ -210,11 +230,13 @@ read_minibuf (map, initial, prompt, backup_n, expflag,
 
   val = Qnil;
   ambient_dir = current_buffer->directory;
+  input_method = Qnil;
+  enable_multibyte = Qnil;
 
   /* Don't need to protect PROMPT, HISTVAR, and HISTPOS because we
      store them away before we can GC.  Don't need to protect
      BACKUP_N because we use the value only if it is an integer.  */
-  GCPRO4 (map, initial, val, ambient_dir);
+  GCPRO5 (map, initial, val, ambient_dir, input_method);
 
   if (!STRINGP (prompt))
     prompt = build_string ("");
@@ -234,6 +256,8 @@ read_minibuf (map, initial, prompt, backup_n, expflag,
 
   choose_minibuf_frame ();
 
+  record_unwind_protect (choose_minibuf_frame_1, Qnil);
+
   record_unwind_protect (Fset_window_configuration,
                         Fcurrent_window_configuration (Qnil));
 
@@ -280,6 +304,14 @@ read_minibuf (map, initial, prompt, backup_n, expflag,
   Vminibuffer_history_variable = histvar;
   Vhelp_form = Vminibuffer_help_form;
 
+  if (inherit_input_method)
+    {
+      /* `current-input-method' is buffer local.  So, remeber it in
+        INPUT_METHOD before changing the current buffer.  */
+      input_method = Fsymbol_value (Qcurrent_input_method);
+      enable_multibyte = current_buffer->enable_multibyte_characters;
+    }
+
   /* Switch to the minibuffer.  */
 
   minibuffer = get_minibuffer (minibuf_level);
@@ -347,6 +379,14 @@ read_minibuf (map, initial, prompt, backup_n, expflag,
 
   current_buffer->keymap = map;
 
+  /* Turn on an input method stored in INPUT_METHOD if any.  */
+  if (STRINGP (input_method) && !NILP (Ffboundp (Qactivate_input_method)))
+    call1 (Qactivate_input_method, input_method);
+
+  /* If appropriate, copy enable-multibyte-characters into the minibuffer.  */
+  if (inherit_input_method)
+    current_buffer->enable_multibyte_characters = enable_multibyte;
+
   /* Run our hook, but not if it is empty.
      (run-hooks would do nothing if it is empty,
      but it's important to save time here in the usual case).  */
@@ -376,6 +416,10 @@ read_minibuf (map, initial, prompt, backup_n, expflag,
 #endif
 
   /* VAL is the string of minibuffer text.  */
+
+  if (STRINGP (val) && XSTRING (val)->size == 0 && ! NILP (defalt))
+    val = defalt;
+
   last_minibuf_string = val;
 
   /* Add the value to the appropriate history list unless it is empty.  */
@@ -484,7 +528,7 @@ get_minibuffer (depth)
 /* This function is called on exiting minibuffer, whether normally or not,
  and it restores the current window, buffer, etc. */
 
-static void
+static Lisp_Object
 read_minibuf_unwind (data)
      Lisp_Object data;
 {
@@ -539,14 +583,12 @@ read_minibuf_unwind (data)
     unbind_to (count, Qnil);
   }
 
-  /* Make the minibuffer follow the selected frame
-     (in case we are exiting a recursive minibuffer).  */
-  choose_minibuf_frame ();
-
   /* Make sure minibuffer window is erased, not ignored.  */
   windows_or_buffers_changed++;
   XSETFASTINT (XWINDOW (window)->last_modified, 0);
   XSETFASTINT (XWINDOW (window)->last_overlay_modified, 0);
+
+  return Qnil;
 }
 \f
 
@@ -554,7 +596,7 @@ read_minibuf_unwind (data)
    for make-docfile to see.  We cannot put this in the real DEFUN
    due to limits in the Unix cpp.
 
-DEFUN ("read-from-minibuffer", Fread_from_minibuffer, Sread_from_minibuffer, 1, 6, 0,
+DEFUN ("read-from-minibuffer", Fread_from_minibuffer, Sread_from_minibuffer, 1, 7, 0,
   "Read a string from the minibuffer, prompting with string PROMPT.\n\
 If optional second arg INITIAL-CONTENTS is non-nil, it is a string\n\
   to be inserted into the minibuffer before reading input.\n\
@@ -576,14 +618,19 @@ Fifth arg HIST, if non-nil, specifies a history list\n\
 Sixth arg DEFAULT-VALUE is the default value.  If non-nil, it is used\n\
  for history commands, and as the value to return if the user enters\n\
  the empty string.\n\
+Seventh arg INHERIT-INPUT-METHOD, if non-nil, means the minibuffer inherits\n\
+ the current input method and the setting of enable-multibyte-characters.\n\
 If the variable `minibuffer-allow-text-properties is non-nil,\n\
  then the string which is returned includes whatever text properties\n\
- were present in the minibuffer.  Otherwise the value has no text properties.  */
+ were present in the minibuffer.  Otherwise the value has no text properties.")
+  (prompt, initial_contents, keymap, read, hist, default_value, inherit_input_method)
+  */
 
-DEFUN ("read-from-minibuffer", Fread_from_minibuffer, Sread_from_minibuffer, 1, 6, 0,
+DEFUN ("read-from-minibuffer", Fread_from_minibuffer, Sread_from_minibuffer, 1, 7, 0,
   0 /* See immediately above */)
-  (prompt, initial_contents, keymap, read, hist, default_value)
+  (prompt, initial_contents, keymap, read, hist, default_value, inherit_input_method)
      Lisp_Object prompt, initial_contents, keymap, read, hist, default_value;
+     Lisp_Object inherit_input_method;
 {
   int pos = 0;
   Lisp_Object histvar, histpos, position, val;
@@ -615,7 +662,7 @@ DEFUN ("read-from-minibuffer", Fread_from_minibuffer, Sread_from_minibuffer, 1,
   if (NILP (keymap))
     keymap = Vminibuffer_local_map;
   else
-    keymap = get_keymap (keymap,2);
+    keymap = get_keymap (keymap);
 
   if (SYMBOLP (hist))
     {
@@ -636,9 +683,8 @@ DEFUN ("read-from-minibuffer", Fread_from_minibuffer, Sread_from_minibuffer, 1,
   val = read_minibuf (keymap, initial_contents, prompt,
                      make_number (pos), !NILP (read),
                      histvar, histpos, default_value,
-                     minibuffer_allow_text_properties);
-  if (STRINGP (val) && XSTRING (val)->size == 0 && ! NILP (default_value))
-    val = default_value;
+                     minibuffer_allow_text_properties,
+                     !NILP (inherit_input_method));
   UNGCPRO;
   return val;
 }
@@ -655,7 +701,7 @@ is a string to insert in the minibuffer before reading.")
     CHECK_STRING (initial_contents, 1);
   return read_minibuf (Vminibuffer_local_map, initial_contents,
                       prompt, Qnil, 1, Qminibuffer_history,
-                      make_number (0), Qnil, 0);
+                      make_number (0), Qnil, 0, 0);
 }
 
 DEFUN ("eval-minibuffer", Feval_minibuffer, Seval_minibuffer, 1, 2, 0,
@@ -670,31 +716,38 @@ is a string to insert in the minibuffer before reading.")
 
 /* Functions that use the minibuffer to read various things. */
 
-DEFUN ("read-string", Fread_string, Sread_string, 1, 4, 0,
+DEFUN ("read-string", Fread_string, Sread_string, 1, 5, 0,
   "Read a string from the minibuffer, prompting with string PROMPT.\n\
 If non-nil, second arg INITIAL-INPUT is a string to insert before reading.\n\
 The third arg HISTORY, if non-nil, specifies a history list\n\
   and optionally the initial position in the list.\n\
-See `read-from-minibuffer' for details of HISTORY argument.")
-  (prompt, initial_input, history, default_value)
+See `read-from-minibuffer' for details of HISTORY argument.\n\
+Fourth arg INHERIT-INPUT-METHOD, if non-nil, means the minibuffer inherits\n\
+ the current input method and the setting of enable-multibyte-characters.")
+  (prompt, initial_input, history, default_value, inherit_input_method)
      Lisp_Object prompt, initial_input, history, default_value;
+     Lisp_Object inherit_input_method;
 {
   return Fread_from_minibuffer (prompt, initial_input, Qnil,
-                               Qnil, history, default_value);
+                               Qnil, history, default_value,
+                               inherit_input_method);
 }
 
-DEFUN ("read-no-blanks-input", Fread_no_blanks_input, Sread_no_blanks_input, 1, 2, 0,
+DEFUN ("read-no-blanks-input", Fread_no_blanks_input, Sread_no_blanks_input, 1, 3, 0,
   "Args PROMPT and INIT, strings.  Read a string from the terminal, not allowing blanks.\n\
-Prompt with PROMPT, and provide INIT as an initial value of the input string.")
-  (prompt, init)
-     Lisp_Object prompt, init;
+Prompt with PROMPT, and provide INIT as an initial value of the input string.\n\
+Third arg INHERIT-INPUT-METHOD, if non-nil, means the minibuffer inherits\n\
+the current input method and the setting of enable-multibyte-characters.")
+  (prompt, init, inherit_input_method)
+     Lisp_Object prompt, init, inherit_input_method;
 {
   CHECK_STRING (prompt, 0);
   if (! NILP (init))
     CHECK_STRING (init, 1);
 
   return read_minibuf (Vminibuffer_local_ns_map, init, prompt, Qnil,
-                      0, Qminibuffer_history, make_number (0), Qnil, 0);
+                      0, Qminibuffer_history, make_number (0), Qnil, 0,
+                      !NILP (inherit_input_method));
 }
 
 DEFUN ("read-command", Fread_command, Sread_command, 1, 2, 0,
@@ -703,9 +756,20 @@ Prompts with PROMPT.  By default, return DEFAULT-VALUE.")
   (prompt, default_value)
      Lisp_Object prompt, default_value;
 {
-  return Fintern (Fcompleting_read (prompt, Vobarray, Qcommandp, Qt,
-                                   Qnil, Qnil, default_value),
-                 Qnil);
+  Lisp_Object name, default_string;
+
+  if (NILP (default_value))
+    default_string = Qnil;
+  else if (SYMBOLP (default_value))
+    default_string = XSYMBOL (default_value)->name;
+  else
+    default_string = default_value;
+    
+  name = Fcompleting_read (prompt, Vobarray, Qcommandp, Qt,
+                          Qnil, Qnil, default_string, Qnil);
+  if (NILP (name))
+    return name;
+  return Fintern (name, Qnil);
 }
 
 #ifdef NOTDEF
@@ -715,7 +779,7 @@ Prompts with PROMPT.")
   (prompt)
      Lisp_Object prompt;
 {
-  return Fintern (Fcompleting_read (prompt, Vobarray, Qfboundp, Qt, Qnil, Qnil, Qnil),
+  return Fintern (Fcompleting_read (prompt, Vobarray, Qfboundp, Qt, Qnil, Qnil, Qnil, Qnil),
                  Qnil);
 }
 #endif /* NOTDEF */
@@ -727,10 +791,21 @@ A user variable is one whose documentation starts with a `*' character.")
   (prompt, default_value)
      Lisp_Object prompt, default_value;
 {
-  return Fintern (Fcompleting_read (prompt, Vobarray,
-                                   Quser_variable_p, Qt,
-                                   Qnil, Qnil, default_value),
-                 Qnil);
+  Lisp_Object name, default_string;
+
+  if (NILP (default_value))
+    default_string = Qnil;
+  else if (SYMBOLP (default_value))
+    default_string = XSYMBOL (default_value)->name;
+  else
+    default_string = default_value;
+    
+  name = Fcompleting_read (prompt, Vobarray,
+                          Quser_variable_p, Qt,
+                          Qnil, Qnil, default_string, Qnil);
+  if (NILP (name))
+    return name;
+  return Fintern (name, Qnil);
 }
 
 DEFUN ("read-buffer", Fread_buffer, Sread_buffer, 1, 3, 0,
@@ -742,19 +817,32 @@ If optional third arg REQUIRE-MATCH is non-nil, only existing buffer names are a
      Lisp_Object prompt, def, require_match;
 {
   Lisp_Object tem;
-  Lisp_Object args[3];
-
+  Lisp_Object args[4];
+  
   if (BUFFERP (def))
     def = XBUFFER (def)->name;
-  if (!NILP (def))
+
+  if (NILP (Vread_buffer_function))
     {
-      args[0] = build_string ("%s(default %s) ");
+      if (!NILP (def))
+       {
+         args[0] = build_string ("%s(default %s) ");
+         args[1] = prompt;
+         args[2] = def;
+         prompt = Fformat (3, args);
+       }
+
+      return Fcompleting_read (prompt, Vbuffer_alist, Qnil,
+                              require_match, Qnil, Qnil, def, Qnil);
+    }
+  else
+    {
+      args[0] = Vread_buffer_function;
       args[1] = prompt;
       args[2] = def;
-      prompt = Fformat (3, args);
+      args[3] = require_match;
+      return Ffuncall(4, args);
     }
-  return Fcompleting_read (prompt, Vbuffer_alist, Qnil,
-                          require_match, Qnil, Qnil, def);
 }
 \f
 DEFUN ("try-completion", Ftry_completion, Stry_completion, 2, 3, 0,
@@ -956,7 +1044,7 @@ scmp (s1, s2, len)
 
   if (completion_ignore_case)
     {
-      while (l && EQ (DOWNCASE (*s1++), DOWNCASE (*s2++)))
+      while (l && DOWNCASE (*s1++) == DOWNCASE (*s2++))
        l--;
     }
   else
@@ -1119,7 +1207,7 @@ Lisp_Object Vminibuffer_completion_confirm, Qminibuffer_completion_confirm;
    for make-docfile to see.  We cannot put this in the real DEFUN
    due to limits in the Unix cpp.
 
-DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 7, 0,
+DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 8, 0,
   "Read a string in the minibuffer, with completion.\n\
 PROMPT is a string to prompt with; normally it ends in a colon and a space.\n\
 TABLE is an alist whose elements' cars are strings, or an obarray.\n\
@@ -1144,19 +1232,28 @@ HIST, if non-nil, specifies a history list\n\
   and HISTPOS is the initial position (the position in the list\n\
   which INITIAL-CONTENTS corresponds to).\n\
   Positions are counted starting from 1 at the beginning of the list.\n\
-DEF, if non-nil, is the default value.
-
+DEF, if non-nil, is the default value.\n\
+\n\
+If INHERIT-INPUT-METHOD is non-nil, the minibuffer inherits\n\
+  the current input method and the setting of enable-multibyte-characters.\n\
+\n\
 Completion ignores case if the ambient value of\n\
   `completion-ignore-case' is non-nil."
 */
-DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 7, 0,
+DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 8, 0,
   0 /* See immediately above */)
-  (prompt, table, predicate, require_match, init, hist, def)
+  (prompt, table, predicate, require_match, init, hist, def, inherit_input_method)
      Lisp_Object prompt, table, predicate, require_match, init, hist, def;
+     Lisp_Object inherit_input_method;
 {
   Lisp_Object val, histvar, histpos, position;
   int pos = 0;
   int count = specpdl_ptr - specpdl;
+  struct gcpro gcpro1;
+  int disable_multibyte = EQ (table, Qread_file_name_internal);
+
+  GCPRO1 (def);
+
   specbind (Qminibuffer_completion_table, table);
   specbind (Qminibuffer_completion_predicate, predicate);
   specbind (Qminibuffer_completion_confirm,
@@ -1199,10 +1296,9 @@ DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 7, 0,
                      ? Vminibuffer_local_completion_map
                      : Vminibuffer_local_must_match_map,
                      init, prompt, make_number (pos), 0,
-                     histvar, histpos, def, 0);
-  if (STRINGP (val) && XSTRING (val)->size == 0 && ! NILP (def))
-    val = def;
-  return unbind_to (count, val);
+                     histvar, histpos, def, 0,
+                     !NILP (inherit_input_method));
+  RETURN_UNGCPRO (unbind_to (count, val));
 }
 \f
 Lisp_Object Fminibuffer_completion_help ();
@@ -1373,7 +1469,7 @@ scroll the window of possible completions.")
       tem = Fpos_visible_in_window_p (make_number (ZV), window);
       if (! NILP (tem))
        /* If end is in view, scroll up to the beginning.  */
-       Fset_window_start (window, BEGV, Qnil);
+       Fset_window_start (window, make_number (BEGV), Qnil);
       else
        /* Else scroll down one screen.  */
        Fscroll_other_window (Qnil);
@@ -1825,6 +1921,7 @@ DEFUN ("minibuffer-prompt-width", Fminibuffer_prompt_width,
    that has no possible completions, and other quick, unobtrusive
    messages.  */
 
+void
 temp_echo_area_glyphs (m)
      char *m;
 {
@@ -1863,12 +1960,14 @@ or until the next input event arrives, whichever comes first.")
   return Qnil;
 }
 \f
+void
 init_minibuf_once ()
 {
   Vminibuffer_list = Qnil;
   staticpro (&Vminibuffer_list);
 }
 
+void
 syms_of_minibuf ()
 {
   minibuf_level = 0;
@@ -1915,6 +2014,16 @@ syms_of_minibuf ()
   Qhistory_length = intern ("history-length");
   staticpro (&Qhistory_length);
 
+  Qcurrent_input_method = intern ("current-input-method");
+  staticpro (&Qcurrent_input_method);
+
+  Qactivate_input_method = intern ("activate-input-method");
+  staticpro (&Qactivate_input_method);
+
+  DEFVAR_LISP ("read-buffer-function", &Vread_buffer_function, 
+    "If this is non-nil, `read-buffer' does its work by calling this function.");
+  Vread_buffer_function = Qnil;
+
   DEFVAR_LISP ("minibuffer-setup-hook", &Vminibuffer_setup_hook, 
     "Normal hook run just after entry to minibuffer.");
   Vminibuffer_setup_hook = Qnil;
@@ -1940,9 +2049,7 @@ property of a history variable overrides this default.");
 
   DEFVAR_BOOL ("enable-recursive-minibuffers", &enable_recursive_minibuffers,
     "*Non-nil means to allow minibuffer commands while in the minibuffer.\n\
-More precisely, this variable makes a difference when the minibuffer window\n\
-is the selected window.  If you are in some other window, minibuffer commands\n\
-are allowed even if a minibuffer is active.");
+This variable makes a difference whenever the minibuffer window is active.");
   enable_recursive_minibuffers = 0;
 
   DEFVAR_LISP ("minibuffer-completion-table", &Vminibuffer_completion_table,
@@ -1997,7 +2104,7 @@ Some uses of the echo area also raise that frame (since they use it too).");
     "Non-nil means `read-from-miniffer' should not discard text properties.\n\
 This also affects `read-string', but it does not affect `read-minibuffer',\n\
 `read-no-blanks-input', or any of the functions that do minibuffer input\n\
-with completion; they always discard text properties.")
+with completion; they always discard text properties.");
   minibuffer_allow_text_properties = 0;
 
   defsubr (&Sset_minibuffer_window);
@@ -2028,6 +2135,7 @@ with completion; they always discard text properties.")
   defsubr (&Sminibuffer_message);
 }
 
+void
 keys_of_minibuf ()
 {
   initial_define_key (Vminibuffer_local_map, Ctl ('g'),