]> code.delx.au - gnu-emacs/blobdiff - src/minibuf.c
(gc_cons_threshold): Not static.
[gnu-emacs] / src / minibuf.c
index d9fec427ec4cc1c801c209f406ec1cc4d4af419c..1d2d7372a4af503d3d6ff27e582e738942dac6d1 100644 (file)
@@ -1,5 +1,5 @@
 /* Minibuffer input and completion.
-   Copyright (C) 1985,86,93,94,95,96,97,98,99,2000,01,03,04
+   Copyright (C) 1985,86,93,94,95,96,97,98,99,2000,01,03,04,05
              Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -16,8 +16,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 
 #include <config.h>
@@ -349,7 +349,7 @@ BUFFER can be a buffer or a buffer name.  */)
 DEFUN ("minibuffer-prompt-end", Fminibuffer_prompt_end,
        Sminibuffer_prompt_end, 0, 0, 0,
        doc: /* Return the buffer position of the end of the minibuffer prompt.
-Return (point-min) if current buffer is not a mini-buffer.  */)
+Return (point-min) if current buffer is not a minibuffer.  */)
      ()
 {
   /* This function is written to be most efficient when there's a prompt.  */
@@ -1014,7 +1014,7 @@ DEFUN ("eval-minibuffer", Feval_minibuffer, Seval_minibuffer, 1, 2, 0,
 Prompt with PROMPT.  If non-nil, optional second arg INITIAL-CONTENTS
 is a string to insert in the minibuffer before reading.
 \(INITIAL-CONTENTS can also be a cons of a string and an integer.  Such
-arguments are used as in `read-from-minibuffer')  */)
+arguments are used as in `read-from-minibuffer'.)  */)
      (prompt, initial_contents)
      Lisp_Object prompt, initial_contents;
 {
@@ -1181,13 +1181,16 @@ minibuf_conform_representation (string, basis)
 DEFUN ("try-completion", Ftry_completion, Stry_completion, 2, 3, 0,
        doc: /* Return common substring of all completions of STRING in ALIST.
 Each car of each element of ALIST (or each element if it is not a cons cell)
-is tested to see if it begins with STRING.
+is tested to see if it begins with STRING.  The possible matches may be
+strings or symbols.  Symbols are converted to strings before testing,
+see `symbol-name'.
 All that match are compared together; the longest initial sequence
 common to all matches is returned as a string.
 If there is no match at all, nil is returned.
 For a unique match which is exact, t is returned.
 
-If ALIST is a hash-table, all the string keys are the possible matches.
+If ALIST is a hash-table, all the string and symbol keys are the
+possible matches.
 If ALIST is an obarray, the names of all symbols in the obarray
 are the possible matches.
 
@@ -1227,6 +1230,7 @@ is used to further constrain the set of candidates.  */)
     return call3 (alist, string, predicate, Qnil);
 
   bestmatch = bucket = Qnil;
+  zero = make_number (0);
 
   /* If ALIST is not a list, set TAIL just for gc pro.  */
   tail = alist;
@@ -1253,10 +1257,10 @@ is used to further constrain the set of candidates.  */)
        }
       else if (type == 2)
        {
-         if (!EQ (bucket, make_number (0)))
+         if (!EQ (bucket, zero))
            {
              elt = bucket;
-             eltstring = Fsymbol_name (elt);
+             eltstring = elt;
              if (XSYMBOL (bucket)->next)
                XSETSYMBOL (bucket, XSYMBOL (bucket)->next);
              else
@@ -1283,18 +1287,19 @@ is used to further constrain the set of candidates.  */)
 
       /* Is this element a possible completion? */
 
+      if (SYMBOLP (eltstring))
+       eltstring = Fsymbol_name (eltstring);
+
       if (STRINGP (eltstring)
          && SCHARS (string) <= SCHARS (eltstring)
-         && (tem = Fcompare_strings (eltstring, make_number (0),
+         && (tem = Fcompare_strings (eltstring, zero,
                                      make_number (SCHARS (string)),
-                                     string, make_number (0), Qnil,
+                                     string, zero, Qnil,
                                      completion_ignore_case ? Qt : Qnil),
              EQ (Qt, tem)))
        {
          /* Yes. */
          Lisp_Object regexps;
-         Lisp_Object zero;
-         XSETFASTINT (zero, 0);
 
          /* Ignore this element if it fails to match all the regexps.  */
          {
@@ -1348,9 +1353,9 @@ is used to further constrain the set of candidates.  */)
          else
            {
              compare = min (bestmatchsize, SCHARS (eltstring));
-             tem = Fcompare_strings (bestmatch, make_number (0),
+             tem = Fcompare_strings (bestmatch, zero,
                                      make_number (compare),
-                                     eltstring, make_number (0),
+                                     eltstring, zero,
                                      make_number (compare),
                                      completion_ignore_case ? Qt : Qnil);
              if (EQ (tem, Qt))
@@ -1381,15 +1386,15 @@ is used to further constrain the set of candidates.  */)
                      ((matchsize == SCHARS (eltstring))
                       ==
                       (matchsize == SCHARS (bestmatch))
-                      && (tem = Fcompare_strings (eltstring, make_number (0),
+                      && (tem = Fcompare_strings (eltstring, zero,
                                                   make_number (SCHARS (string)),
-                                                  string, make_number (0),
+                                                  string, zero,
                                                   Qnil,
                                                   Qnil),
                           EQ (Qt, tem))
-                      && (tem = Fcompare_strings (bestmatch, make_number (0),
+                      && (tem = Fcompare_strings (bestmatch, zero,
                                                   make_number (SCHARS (string)),
-                                                  string, make_number (0),
+                                                  string, zero,
                                                   Qnil,
                                                   Qnil),
                           ! EQ (Qt, tem))))
@@ -1441,10 +1446,13 @@ is used to further constrain the set of candidates.  */)
 DEFUN ("all-completions", Fall_completions, Sall_completions, 2, 4, 0,
        doc: /* Search for partial matches to STRING in ALIST.
 Each car of each element of ALIST (or each element if it is not a cons cell)
-is tested to see if it begins with STRING.
+is tested to see if it begins with STRING.  The possible matches may be
+strings or symbols.  Symbols are converted to strings before testing,
+see `symbol-name'.
 The value is a list of all the strings from ALIST that match.
 
-If ALIST is a hash-table, all the string keys are the possible matches.
+If ALIST is a hash-table, all the string and symbol keys are the
+possible matches.
 If ALIST is an obarray, the names of all symbols in the obarray
 are the possible matches.
 
@@ -1476,13 +1484,14 @@ are ignored unless STRING itself starts with a space.  */)
                           || NILP (XCAR (alist))));
   int index = 0, obsize = 0;
   int bindcount = -1;
-  Lisp_Object bucket, tem;
+  Lisp_Object bucket, tem, zero;
   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
 
   CHECK_STRING (string);
   if (type == 0)
     return call3 (alist, string, predicate, Qt);
   allmatches = bucket = Qnil;
+  zero = make_number (0);
 
   /* If ALIST is not a list, set TAIL just for gc pro.  */
   tail = alist;
@@ -1509,10 +1518,10 @@ are ignored unless STRING itself starts with a space.  */)
        }
       else if (type == 2)
        {
-         if (!EQ (bucket, make_number (0)))
+         if (!EQ (bucket, zero))
            {
              elt = bucket;
-             eltstring = Fsymbol_name (elt);
+             eltstring = elt;
              if (XSYMBOL (bucket)->next)
                XSETSYMBOL (bucket, XSYMBOL (bucket)->next);
              else
@@ -1539,6 +1548,9 @@ are ignored unless STRING itself starts with a space.  */)
 
       /* Is this element a possible completion? */
 
+      if (SYMBOLP (eltstring))
+       eltstring = Fsymbol_name (eltstring);
+
       if (STRINGP (eltstring)
          && SCHARS (string) <= SCHARS (eltstring)
          /* If HIDE_SPACES, reject alternatives that start with space
@@ -1547,9 +1559,9 @@ are ignored unless STRING itself starts with a space.  */)
               && SREF (string, 0) == ' ')
              || SREF (eltstring, 0) != ' '
              || NILP (hide_spaces))
-         && (tem = Fcompare_strings (eltstring, make_number (0),
+         && (tem = Fcompare_strings (eltstring, zero,
                                      make_number (SCHARS (string)),
-                                     string, make_number (0),
+                                     string, zero,
                                      make_number (SCHARS (string)),
                                      completion_ignore_case ? Qt : Qnil),
              EQ (Qt, tem)))
@@ -1746,7 +1758,7 @@ the values STRING, PREDICATE and `lambda'.  */)
       || NILP (alist))
     {
       tem = Fassoc_string (string, alist, completion_ignore_case ? Qt : Qnil);
-      if NILP (tem)
+      if (NILP (tem))
        return Qnil;
     }
   else if (VECTORP (alist))
@@ -2068,6 +2080,8 @@ complete_and_exit_2 (ignore)
   return make_number (1);
 }
 
+EXFUN (Fexit_minibuffer, 0) NO_RETURN;
+
 DEFUN ("minibuffer-complete-and-exit", Fminibuffer_complete_and_exit,
        Sminibuffer_complete_and_exit, 0, 0, "",
        doc: /* If the minibuffer contents is a valid completion then exit.
@@ -2130,7 +2144,7 @@ a repetition of this command will exit.  */)
       return Qnil;
     }
  exit:
-  return Fthrow (Qexit, Qnil);
+  return Fexit_minibuffer ();
   /* NOTREACHED */
 }
 
@@ -2537,14 +2551,21 @@ DEFUN ("self-insert-and-exit", Fself_insert_and_exit, Sself_insert_and_exit, 0,
   else
     bitch_at_user ();
 
-  return Fthrow (Qexit, Qnil);
+  return Fexit_minibuffer ();
 }
 
 DEFUN ("exit-minibuffer", Fexit_minibuffer, Sexit_minibuffer, 0, 0, "",
        doc: /* Terminate this minibuffer argument.  */)
      ()
 {
-  return Fthrow (Qexit, Qnil);
+  /* If the command that uses this has made modifications in the minibuffer,
+     we don't want them to cause deactivation of the mark in the original
+     buffer.
+     A better solution would be to make deactivate-mark buffer-local
+     (or to turn it into a list of buffers, ...), but in the mean time,
+     this should do the trick in most cases.  */
+  Vdeactivate_mark = Qnil;
+  Fthrow (Qexit, Qnil);
 }
 
 DEFUN ("minibuffer-depth", Fminibuffer_depth, Sminibuffer_depth, 0, 0, 0,