/[emacs]/emacs/src/minibuf.c
ViewVC logotype

Diff of /emacs/src/minibuf.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.240 by ttn, Mon Jun 3 01:42:52 2002 UTC revision 1.240.2.1 by miles, Fri Apr 4 06:21:02 2003 UTC
# Line 1  Line 1 
1  /* Minibuffer input and completion.  /* Minibuffer input and completion.
2     Copyright (C) 1985, 1986, 1993, 1994, 1995, 1996, 1997, 1998, 1999,     Copyright (C) 1985, 1986, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3     2000, 2001 Free Software Foundation, Inc.     2000, 2001, 2003 Free Software Foundation, Inc.
4    
5  This file is part of GNU Emacs.  This file is part of GNU Emacs.
6    
# Line 233  string_to_object (val, defalt) Line 233  string_to_object (val, defalt)
233    
234    GCPRO2 (val, defalt);    GCPRO2 (val, defalt);
235    
236    if (STRINGP (val) && XSTRING (val)->size == 0    if (STRINGP (val) && SCHARS (val) == 0
237        && STRINGP (defalt))        && STRINGP (defalt))
238      val = defalt;      val = defalt;
239    
240    expr_and_pos = Fread_from_string (val, Qnil, Qnil);    expr_and_pos = Fread_from_string (val, Qnil, Qnil);
241    pos = XINT (Fcdr (expr_and_pos));    pos = XINT (Fcdr (expr_and_pos));
242    if (pos != XSTRING (val)->size)    if (pos != SCHARS (val))
243      {      {
244        /* Ignore trailing whitespace; any other trailing junk        /* Ignore trailing whitespace; any other trailing junk
245           is an error.  */           is an error.  */
246        int i;        int i;
247        pos = string_char_to_byte (val, pos);        pos = string_char_to_byte (val, pos);
248        for (i = pos; i < STRING_BYTES (XSTRING (val)); i++)        for (i = pos; i < SBYTES (val); i++)
249          {          {
250            int c = XSTRING (val)->data[i];            int c = SREF (val, i);
251            if (c != ' ' && c != '\t' && c != '\n')            if (c != ' ' && c != '\t' && c != '\n')
252              error ("Trailing garbage following expression");              error ("Trailing garbage following expression");
253          }          }
# Line 280  read_minibuf_noninteractive (map, initia Line 280  read_minibuf_noninteractive (map, initia
280    char *line, *s;    char *line, *s;
281    Lisp_Object val;    Lisp_Object val;
282    
283    fprintf (stdout, "%s", XSTRING (prompt)->data);    fprintf (stdout, "%s", SDATA (prompt));
284    fflush (stdout);    fflush (stdout);
285    
286    val = Qnil;    val = Qnil;
# Line 317  read_minibuf_noninteractive (map, initia Line 317  read_minibuf_noninteractive (map, initia
317    
318    return val;    return val;
319  }  }
320    
321    DEFUN ("minibufferp", Fminibufferp,
322           Sminibufferp, 0, 1, 0,
323           doc: /* Return t if BUFFER is a minibuffer.
324    No argument or nil as argument means use current buffer as BUFFER.*/)
325         (buffer)
326         Lisp_Object buffer;
327    {
328      Lisp_Object tem;
329    
330      if (NILP (buffer))
331        buffer = Fcurrent_buffer ();
332      else if (STRINGP (buffer))
333        buffer = Fget_buffer (buffer);
334      else
335        CHECK_BUFFER (buffer);
336    
337      tem = Fmemq (buffer, Vminibuffer_list);
338      return ! NILP (tem) ? Qt : Qnil;
339    }
340    
341  DEFUN ("minibuffer-prompt-end", Fminibuffer_prompt_end,  DEFUN ("minibuffer-prompt-end", Fminibuffer_prompt_end,
342         Sminibuffer_prompt_end, 0, 0, 0,         Sminibuffer_prompt_end, 0, 0, 0,
# Line 326  Return (point-min) if current buffer is Line 345  Return (point-min) if current buffer is
345       ()       ()
346  {  {
347    /* This function is written to be most efficient when there's a prompt.  */    /* This function is written to be most efficient when there's a prompt.  */
348    Lisp_Object beg = make_number (BEGV);    Lisp_Object beg, end, tem;
349    Lisp_Object end = Ffield_end (beg, Qnil, Qnil);    beg = make_number (BEGV);
350    
351      tem = Fmemq (Fcurrent_buffer (), Vminibuffer_list);
352      if (NILP (tem))
353        return beg;
354    
355      end = Ffield_end (beg, Qnil, Qnil);
356    
357    if (XINT (end) == ZV && NILP (Fget_char_property (beg, Qfield, Qnil)))    if (XINT (end) == ZV && NILP (Fget_char_property (beg, Qfield, Qnil)))
358      return beg;      return beg;
# Line 367  The current buffer must be a minibuffer. Line 392  The current buffer must be a minibuffer.
392    return Qnil;    return Qnil;
393  }  }
394    
395    /* Get the text in the minibuffer before point.
396       That is what completion commands operate on.  */
397    
398    Lisp_Object
399    minibuffer_completion_contents ()
400    {
401      int prompt_end = XINT (Fminibuffer_prompt_end ());
402      if (PT < prompt_end)
403        error ("Cannot do completion in the prompt");
404      return make_buffer_string (prompt_end, PT, 1);
405    }
406    
407  /* Read from the minibuffer using keymap MAP, initial contents INITIAL  /* Read from the minibuffer using keymap MAP, initial contents INITIAL
408     (a string), putting point minus BACKUP_N bytes from the end of INITIAL,     (a string), putting point minus BACKUP_N bytes from the end of INITIAL,
409     prompting with PROMPT (a string), using history list HISTVAR     prompting with PROMPT (a string), using history list HISTVAR
# Line 401  read_minibuf (map, initial, prompt, back Line 437  read_minibuf (map, initial, prompt, back
437       int inherit_input_method;       int inherit_input_method;
438  {  {
439    Lisp_Object val;    Lisp_Object val;
440    int count = specpdl_ptr - specpdl;    int count = SPECPDL_INDEX ();
441    Lisp_Object mini_frame, ambient_dir, minibuffer, input_method;    Lisp_Object mini_frame, ambient_dir, minibuffer, input_method;
442    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
443    Lisp_Object enable_multibyte;    Lisp_Object enable_multibyte;
# Line 557  read_minibuf (map, initial, prompt, back Line 593  read_minibuf (map, initial, prompt, back
593    
594    /* Erase the buffer.  */    /* Erase the buffer.  */
595    {    {
596      int count1 = BINDING_STACK_SIZE ();      int count1 = SPECPDL_INDEX ();
597      specbind (Qinhibit_read_only, Qt);      specbind (Qinhibit_read_only, Qt);
598      specbind (Qinhibit_modification_hooks, Qt);      specbind (Qinhibit_modification_hooks, Qt);
599      Ferase_buffer ();      Ferase_buffer ();
# Line 640  read_minibuf (map, initial, prompt, back Line 676  read_minibuf (map, initial, prompt, back
676    last_minibuf_string = val;    last_minibuf_string = val;
677    
678    /* Add the value to the appropriate history list unless it is empty.  */    /* Add the value to the appropriate history list unless it is empty.  */
679    if (XSTRING (val)->size != 0    if (SCHARS (val) != 0
680        && SYMBOLP (Vminibuffer_history_variable))        && SYMBOLP (Vminibuffer_history_variable))
681      {      {
682        /* If the caller wanted to save the value read on a history list,        /* If the caller wanted to save the value read on a history list,
# Line 724  get_minibuffer (depth) Line 760  get_minibuffer (depth)
760      }      }
761    else    else
762      {      {
763        int count = specpdl_ptr - specpdl;        int count = SPECPDL_INDEX ();
764    
765        reset_buffer (XBUFFER (buf));        reset_buffer (XBUFFER (buf));
766        record_unwind_protect (Fset_buffer, Fcurrent_buffer ());        record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
# Line 785  read_minibuf_unwind (data) Line 821  read_minibuf_unwind (data)
821    
822    /* Erase the minibuffer we were using at this level.  */    /* Erase the minibuffer we were using at this level.  */
823    {    {
824      int count = specpdl_ptr - specpdl;      int count = SPECPDL_INDEX ();
825      /* Prevent error in erase-buffer.  */      /* Prevent error in erase-buffer.  */
826      specbind (Qinhibit_read_only, Qt);      specbind (Qinhibit_read_only, Qt);
827      specbind (Qinhibit_modification_hooks, Qt);      specbind (Qinhibit_modification_hooks, Qt);
# Line 860  If the variable `minibuffer-allow-text-p Line 896  If the variable `minibuffer-allow-text-p
896            /* Convert to distance from end of input.  */            /* Convert to distance from end of input.  */
897            if (XINT (position) < 1)            if (XINT (position) < 1)
898              /* A number too small means the beginning of the string.  */              /* A number too small means the beginning of the string.  */
899              pos =  - XSTRING (initial_contents)->size;              pos =  - SCHARS (initial_contents);
900            else            else
901              pos = XINT (position) - 1 - XSTRING (initial_contents)->size;              pos = XINT (position) - 1 - SCHARS (initial_contents);
902          }          }
903      }      }
904    
# Line 942  Fifth arg INHERIT-INPUT-METHOD, if non-n Line 978  Fifth arg INHERIT-INPUT-METHOD, if non-n
978    val = Fread_from_minibuffer (prompt, initial_input, Qnil,    val = Fread_from_minibuffer (prompt, initial_input, Qnil,
979                                 Qnil, history, default_value,                                 Qnil, history, default_value,
980                                 inherit_input_method);                                 inherit_input_method);
981    if (STRINGP (val) && XSTRING (val)->size == 0 && ! NILP (default_value))    if (STRINGP (val) && SCHARS (val) == 0 && ! NILP (default_value))
982      val = default_value;      val = default_value;
983    return val;    return val;
984  }  }
# Line 1001  Prompt with PROMPT.  */) Line 1037  Prompt with PROMPT.  */)
1037  DEFUN ("read-variable", Fread_variable, Sread_variable, 1, 2, 0,  DEFUN ("read-variable", Fread_variable, Sread_variable, 1, 2, 0,
1038         doc: /* Read the name of a user variable and return it as a symbol.         doc: /* Read the name of a user variable and return it as a symbol.
1039  Prompt with PROMPT.  By default, return DEFAULT-VALUE.  Prompt with PROMPT.  By default, return DEFAULT-VALUE.
1040  A user variable is one whose documentation starts with a `*' character.  */)  A user variable is one for which `user-variable-p' returns non-nil.  */)
1041       (prompt, default_value)       (prompt, default_value)
1042       Lisp_Object prompt, default_value;       Lisp_Object prompt, default_value;
1043  {  {
# Line 1081  common to all matches is returned as a s Line 1117  common to all matches is returned as a s
1117  If there is no match at all, nil is returned.  If there is no match at all, nil is returned.
1118  For a unique match which is exact, t is returned.  For a unique match which is exact, t is returned.
1119    
1120  ALIST can be an obarray instead of an alist.  If ALIST is a hash-table, all the string keys are the possible matches.
1121  Then the print names of all symbols in the obarray are the possible matches.  If ALIST is an obarray, the names of all symbols in the obarray
1122    are the possible matches.
1123    
1124  ALIST can also be a function to do the completion itself.  ALIST can also be a function to do the completion itself.
1125  It receives three arguments: the values STRING, PREDICATE and nil.  It receives three arguments: the values STRING, PREDICATE and nil.
# Line 1092  If optional third argument PREDICATE is Line 1129  If optional third argument PREDICATE is
1129  it is used to test each possible match.  it is used to test each possible match.
1130  The match is a candidate only if PREDICATE returns non-nil.  The match is a candidate only if PREDICATE returns non-nil.
1131  The argument given to PREDICATE is the alist element  The argument given to PREDICATE is the alist element
1132  or the symbol from the obarray.  or the symbol from the obarray.  If ALIST is a hash-table,
1133    predicate is called with two arguments: the key and the value.
1134  Additionally to this predicate, `completion-regexp-list'  Additionally to this predicate, `completion-regexp-list'
1135  is used to further constrain the set of candidates.  */)  is used to further constrain the set of candidates.  */)
1136       (string, alist, predicate)       (string, alist, predicate)
# Line 1103  is used to further constrain the set of Line 1141  is used to further constrain the set of
1141    int bestmatchsize = 0;    int bestmatchsize = 0;
1142    /* These are in bytes, too.  */    /* These are in bytes, too.  */
1143    int compare, matchsize;    int compare, matchsize;
1144    int list = NILP (alist) || (CONSP (alist)    int type = HASH_TABLE_P (alist) ? 3
1145                                && (!SYMBOLP (XCAR (alist))      : VECTORP (alist) ? 2
1146                                    || NILP (XCAR (alist))));      : NILP (alist) || (CONSP (alist)
1147                           && (!SYMBOLP (XCAR (alist))
1148                               || NILP (XCAR (alist))));
1149    int index = 0, obsize = 0;    int index = 0, obsize = 0;
1150    int matchcount = 0;    int matchcount = 0;
1151    Lisp_Object bucket, zero, end, tem;    Lisp_Object bucket, zero, end, tem;
1152    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1153    
1154    CHECK_STRING (string);    CHECK_STRING (string);
1155    if (!list && !VECTORP (alist))    if (type == 0)
1156      return call3 (alist, string, predicate, Qnil);      return call3 (alist, string, predicate, Qnil);
1157    
1158    bestmatch = bucket = Qnil;    bestmatch = bucket = Qnil;
1159    
1160    /* If ALIST is not a list, set TAIL just for gc pro.  */    /* If ALIST is not a list, set TAIL just for gc pro.  */
1161    tail = alist;    tail = alist;
1162    if (! list)    if (type == 2)
1163      {      {
       index = 0;  
1164        obsize = XVECTOR (alist)->size;        obsize = XVECTOR (alist)->size;
1165        bucket = XVECTOR (alist)->contents[index];        bucket = XVECTOR (alist)->contents[index];
1166      }      }
1167    
1168    while (1)    while (1)
1169      {      {
1170        /* Get the next element of the alist or obarray. */        /* Get the next element of the alist, obarray, or hash-table. */
1171        /* Exit the loop if the elements are all used up. */        /* Exit the loop if the elements are all used up. */
1172        /* elt gets the alist element or symbol.        /* elt gets the alist element or symbol.
1173           eltstring gets the name to check as a completion. */           eltstring gets the name to check as a completion. */
1174    
1175        if (list)        if (type == 1)
1176          {          {
1177            if (!CONSP (tail))            if (!CONSP (tail))
1178              break;              break;
# Line 1141  is used to further constrain the set of Line 1180  is used to further constrain the set of
1180            eltstring = CONSP (elt) ? XCAR (elt) : elt;            eltstring = CONSP (elt) ? XCAR (elt) : elt;
1181            tail = XCDR (tail);            tail = XCDR (tail);
1182          }          }
1183        else        else if (type == 2)
1184          {          {
1185            if (XFASTINT (bucket) != 0)            if (XFASTINT (bucket) != 0)
1186              {              {
# Line 1160  is used to further constrain the set of Line 1199  is used to further constrain the set of
1199                continue;                continue;
1200              }              }
1201          }          }
1202          else /* if (type == 3) */
1203            {
1204              while (index < HASH_TABLE_SIZE (XHASH_TABLE (alist))
1205                     && NILP (HASH_HASH (XHASH_TABLE (alist), index)))
1206                index++;
1207              if (index >= HASH_TABLE_SIZE (XHASH_TABLE (alist)))
1208                break;
1209              else
1210                elt = eltstring = HASH_KEY (XHASH_TABLE (alist), index++);
1211            }
1212    
1213        /* Is this element a possible completion? */        /* Is this element a possible completion? */
1214    
1215        if (STRINGP (eltstring)        if (STRINGP (eltstring)
1216            && XSTRING (string)->size <= XSTRING (eltstring)->size            && SCHARS (string) <= SCHARS (eltstring)
1217            && (tem = Fcompare_strings (eltstring, make_number (0),            && (tem = Fcompare_strings (eltstring, make_number (0),
1218                                        make_number (XSTRING (string)->size),                                        make_number (SCHARS (string)),
1219                                        string, make_number (0), Qnil,                                        string, make_number (0), Qnil,
1220                                        completion_ignore_case ?Qt : Qnil),                                        completion_ignore_case ?Qt : Qnil),
1221                EQ (Qt, tem)))                EQ (Qt, tem)))
# Line 1197  is used to further constrain the set of Line 1246  is used to further constrain the set of
1246                else                else
1247                  {                  {
1248                    GCPRO4 (tail, string, eltstring, bestmatch);                    GCPRO4 (tail, string, eltstring, bestmatch);
1249                    tem = call1 (predicate, elt);                    tem = type == 3
1250                        ? call2 (predicate, elt,
1251                                 HASH_VALUE (XHASH_TABLE (alist), index - 1))
1252                        : call1 (predicate, elt);
1253                    UNGCPRO;                    UNGCPRO;
1254                  }                  }
1255                if (NILP (tem)) continue;                if (NILP (tem)) continue;
# Line 1205  is used to further constrain the set of Line 1257  is used to further constrain the set of
1257    
1258            /* Update computation of how much all possible completions match */            /* Update computation of how much all possible completions match */
1259    
           matchcount++;  
1260            if (NILP (bestmatch))            if (NILP (bestmatch))
1261              {              {
1262                  matchcount = 1;
1263                bestmatch = eltstring;                bestmatch = eltstring;
1264                bestmatchsize = XSTRING (eltstring)->size;                bestmatchsize = SCHARS (eltstring);
1265              }              }
1266            else            else
1267              {              {
1268                compare = min (bestmatchsize, XSTRING (eltstring)->size);                compare = min (bestmatchsize, SCHARS (eltstring));
1269                tem = Fcompare_strings (bestmatch, make_number (0),                tem = Fcompare_strings (bestmatch, make_number (0),
1270                                        make_number (compare),                                        make_number (compare),
1271                                        eltstring, make_number (0),                                        eltstring, make_number (0),
# Line 1235  is used to further constrain the set of Line 1287  is used to further constrain the set of
1287                       use it as the best match rather than one that is not an                       use it as the best match rather than one that is not an
1288                       exact match.  This way, we get the case pattern                       exact match.  This way, we get the case pattern
1289                       of the actual match.  */                       of the actual match.  */
1290                    if ((matchsize == XSTRING (eltstring)->size                    if ((matchsize == SCHARS (eltstring)
1291                         && matchsize < XSTRING (bestmatch)->size)                         && matchsize < SCHARS (bestmatch))
1292                        ||                        ||
1293                        /* If there is more than one exact match ignoring case,                        /* If there is more than one exact match ignoring case,
1294                           and one of them is exact including case,                           and one of them is exact including case,
# Line 1244  is used to further constrain the set of Line 1296  is used to further constrain the set of
1296                        /* If there is no exact match ignoring case,                        /* If there is no exact match ignoring case,
1297                           prefer a match that does not change the case                           prefer a match that does not change the case
1298                           of the input.  */                           of the input.  */
1299                        ((matchsize == XSTRING (eltstring)->size)                        ((matchsize == SCHARS (eltstring))
1300                         ==                         ==
1301                         (matchsize == XSTRING (bestmatch)->size)                         (matchsize == SCHARS (bestmatch))
1302                         && (tem = Fcompare_strings (eltstring, make_number (0),                         && (tem = Fcompare_strings (eltstring, make_number (0),
1303                                                     make_number (XSTRING (string)->size),                                                     make_number (SCHARS (string)),
1304                                                     string, make_number (0),                                                     string, make_number (0),
1305                                                     Qnil,                                                     Qnil,
1306                                                     Qnil),                                                     Qnil),
1307                             EQ (Qt, tem))                             EQ (Qt, tem))
1308                         && (tem = Fcompare_strings (bestmatch, make_number (0),                         && (tem = Fcompare_strings (bestmatch, make_number (0),
1309                                                     make_number (XSTRING (string)->size),                                                     make_number (SCHARS (string)),
1310                                                     string, make_number (0),                                                     string, make_number (0),
1311                                                     Qnil,                                                     Qnil,
1312                                                     Qnil),                                                     Qnil),
1313                             ! EQ (Qt, tem))))                             ! EQ (Qt, tem))))
1314                      bestmatch = eltstring;                      bestmatch = eltstring;
1315                  }                  }
1316                  if (bestmatchsize != SCHARS (eltstring)
1317                      || bestmatchsize != matchsize)
1318                    /* Don't count the same string multiple times.  */
1319                    matchcount++;
1320                bestmatchsize = matchsize;                bestmatchsize = matchsize;
1321                if (matchsize <= XSTRING (string)->size                if (matchsize <= SCHARS (string)
1322                    && matchcount > 1)                    && matchcount > 1)
1323                  /* No need to look any further.  */                  /* No need to look any further.  */
1324                  break;                  break;
# Line 1275  is used to further constrain the set of Line 1331  is used to further constrain the set of
1331    /* If we are ignoring case, and there is no exact match,    /* If we are ignoring case, and there is no exact match,
1332       and no additional text was supplied,       and no additional text was supplied,
1333       don't change the case of what the user typed.  */       don't change the case of what the user typed.  */
1334    if (completion_ignore_case && bestmatchsize == XSTRING (string)->size    if (completion_ignore_case && bestmatchsize == SCHARS (string)
1335        && XSTRING (bestmatch)->size > bestmatchsize)        && SCHARS (bestmatch) > bestmatchsize)
1336      return minibuf_conform_representation (string, bestmatch);      return minibuf_conform_representation (string, bestmatch);
1337    
1338    /* Return t if the supplied string is an exact match (counting case);    /* Return t if the supplied string is an exact match (counting case);
1339       it does not require any change to be made.  */       it does not require any change to be made.  */
1340    if (matchcount == 1 && bestmatchsize == XSTRING (string)->size    if (matchcount == 1 && bestmatchsize == SCHARS (string)
1341        && (tem = Fcompare_strings (bestmatch, make_number (0),        && (tem = Fcompare_strings (bestmatch, make_number (0),
1342                                    make_number (bestmatchsize),                                    make_number (bestmatchsize),
1343                                    string, make_number (0),                                    string, make_number (0),
# Line 1300  DEFUN ("all-completions", Fall_completio Line 1356  DEFUN ("all-completions", Fall_completio
1356  Each car of each element of ALIST is tested to see if it begins with STRING.  Each car of each element of ALIST is tested to see if it begins with STRING.
1357  The value is a list of all the strings from ALIST that match.  The value is a list of all the strings from ALIST that match.
1358    
1359  ALIST can be an obarray instead of an alist.  If ALIST is a hash-table, all the string keys are the possible matches.
1360  Then the print names of all symbols in the obarray are the possible matches.  If ALIST is an obarray, the names of all symbols in the obarray
1361    are the possible matches.
1362    
1363  ALIST can also be a function to do the completion itself.  ALIST can also be a function to do the completion itself.
1364  It receives three arguments: the values STRING, PREDICATE and t.  It receives three arguments: the values STRING, PREDICATE and t.
# Line 1311  If optional third argument PREDICATE is Line 1368  If optional third argument PREDICATE is
1368  it is used to test each possible match.  it is used to test each possible match.
1369  The match is a candidate only if PREDICATE returns non-nil.  The match is a candidate only if PREDICATE returns non-nil.
1370  The argument given to PREDICATE is the alist element  The argument given to PREDICATE is the alist element
1371  or the symbol from the obarray.  or the symbol from the obarray.  If ALIST is a hash-table,
1372    predicate is called with two arguments: the key and the value.
1373  Additionally to this predicate, `completion-regexp-list'  Additionally to this predicate, `completion-regexp-list'
1374  is used to further constrain the set of candidates.  is used to further constrain the set of candidates.
1375    
# Line 1323  are ignored unless STRING itself starts Line 1381  are ignored unless STRING itself starts
1381  {  {
1382    Lisp_Object tail, elt, eltstring;    Lisp_Object tail, elt, eltstring;
1383    Lisp_Object allmatches;    Lisp_Object allmatches;
1384    int list = NILP (alist) || (CONSP (alist)    int type = HASH_TABLE_P (alist) ? 3
1385                                && (!SYMBOLP (XCAR (alist))      : VECTORP (alist) ? 2
1386                                    || NILP (XCAR (alist))));      : NILP (alist) || (CONSP (alist)
1387                           && (!SYMBOLP (XCAR (alist))
1388                               || NILP (XCAR (alist))));
1389    int index = 0, obsize = 0;    int index = 0, obsize = 0;
1390    Lisp_Object bucket, tem;    Lisp_Object bucket, tem;
1391    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1392    
1393    CHECK_STRING (string);    CHECK_STRING (string);
1394    if (!list && !VECTORP (alist))    if (type == 0)
1395      {      return call3 (alist, string, predicate, Qt);
       return call3 (alist, string, predicate, Qt);  
     }  
1396    allmatches = bucket = Qnil;    allmatches = bucket = Qnil;
1397    
1398    /* If ALIST is not a list, set TAIL just for gc pro.  */    /* If ALIST is not a list, set TAIL just for gc pro.  */
1399    tail = alist;    tail = alist;
1400    if (! list)    if (type == 2)
1401      {      {
       index = 0;  
1402        obsize = XVECTOR (alist)->size;        obsize = XVECTOR (alist)->size;
1403        bucket = XVECTOR (alist)->contents[index];        bucket = XVECTOR (alist)->contents[index];
1404      }      }
1405    
1406    while (1)    while (1)
1407      {      {
1408        /* Get the next element of the alist or obarray. */        /* Get the next element of the alist, obarray, or hash-table. */
1409        /* Exit the loop if the elements are all used up. */        /* Exit the loop if the elements are all used up. */
1410        /* elt gets the alist element or symbol.        /* elt gets the alist element or symbol.
1411           eltstring gets the name to check as a completion. */           eltstring gets the name to check as a completion. */
1412    
1413        if (list)        if (type == 1)
1414          {          {
1415            if (!CONSP (tail))            if (!CONSP (tail))
1416              break;              break;
# Line 1361  are ignored unless STRING itself starts Line 1418  are ignored unless STRING itself starts
1418            eltstring = CONSP (elt) ? XCAR (elt) : elt;            eltstring = CONSP (elt) ? XCAR (elt) : elt;
1419            tail = XCDR (tail);            tail = XCDR (tail);
1420          }          }
1421        else        else if (type == 2)
1422          {          {
1423            if (XFASTINT (bucket) != 0)            if (XFASTINT (bucket) != 0)
1424              {              {
# Line 1380  are ignored unless STRING itself starts Line 1437  are ignored unless STRING itself starts
1437                continue;                continue;
1438              }              }
1439          }          }
1440          else /* if (type == 3) */
1441            {
1442              while (index < HASH_TABLE_SIZE (XHASH_TABLE (alist))
1443                     && NILP (HASH_HASH (XHASH_TABLE (alist), index)))
1444                index++;
1445              if (index >= HASH_TABLE_SIZE (XHASH_TABLE (alist)))
1446                break;
1447              else
1448                elt = eltstring = HASH_KEY (XHASH_TABLE (alist), index++);
1449            }
1450    
1451        /* Is this element a possible completion? */        /* Is this element a possible completion? */
1452    
1453        if (STRINGP (eltstring)        if (STRINGP (eltstring)
1454            && XSTRING (string)->size <= XSTRING (eltstring)->size            && SCHARS (string) <= SCHARS (eltstring)
1455            /* If HIDE_SPACES, reject alternatives that start with space            /* If HIDE_SPACES, reject alternatives that start with space
1456               unless the input starts with space.  */               unless the input starts with space.  */
1457            && ((STRING_BYTES (XSTRING (string)) > 0            && ((SBYTES (string) > 0
1458                 && XSTRING (string)->data[0] == ' ')                 && SREF (string, 0) == ' ')
1459                || XSTRING (eltstring)->data[0] != ' '                || SREF (eltstring, 0) != ' '
1460                || NILP (hide_spaces))                || NILP (hide_spaces))
1461            && (tem = Fcompare_strings (eltstring, make_number (0),            && (tem = Fcompare_strings (eltstring, make_number (0),
1462                                        make_number (XSTRING (string)->size),                                        make_number (SCHARS (string)),
1463                                        string, make_number (0),                                        string, make_number (0),
1464                                        make_number (XSTRING (string)->size),                                        make_number (SCHARS (string)),
1465                                        completion_ignore_case ? Qt : Qnil),                                        completion_ignore_case ? Qt : Qnil),
1466                EQ (Qt, tem)))                EQ (Qt, tem)))
1467          {          {
# Line 1424  are ignored unless STRING itself starts Line 1491  are ignored unless STRING itself starts
1491                else                else
1492                  {                  {
1493                    GCPRO4 (tail, eltstring, allmatches, string);                    GCPRO4 (tail, eltstring, allmatches, string);
1494                    tem = call1 (predicate, elt);                    tem = type == 3
1495                        ? call2 (predicate, elt,
1496                                 HASH_VALUE (XHASH_TABLE (alist), index - 1))
1497                        : call1 (predicate, elt);
1498                    UNGCPRO;                    UNGCPRO;
1499                  }                  }
1500                if (NILP (tem)) continue;                if (NILP (tem)) continue;
# Line 1472  HIST, if non-nil, specifies a history li Line 1542  HIST, if non-nil, specifies a history li
1542    and HISTPOS is the initial position (the position in the list    and HISTPOS is the initial position (the position in the list
1543    which INITIAL-INPUT corresponds to).    which INITIAL-INPUT corresponds to).
1544    Positions are counted starting from 1 at the beginning of the list.    Positions are counted starting from 1 at the beginning of the list.
1545      The variable `history-length' controls the maximum length of a
1546      history list.
1547    
1548  DEF, if non-nil, is the default value.  DEF, if non-nil, is the default value.
1549    
1550  If INHERIT-INPUT-METHOD is non-nil, the minibuffer inherits  If INHERIT-INPUT-METHOD is non-nil, the minibuffer inherits
# Line 1486  Completion ignores case if the ambient v Line 1559  Completion ignores case if the ambient v
1559    Lisp_Object val, histvar, histpos, position;    Lisp_Object val, histvar, histpos, position;
1560    Lisp_Object init;    Lisp_Object init;
1561    int pos = 0;    int pos = 0;
1562    int count = specpdl_ptr - specpdl;    int count = SPECPDL_INDEX ();
1563    struct gcpro gcpro1;    struct gcpro gcpro1;
1564    
1565    init = initial_input;    init = initial_input;
# Line 1511  Completion ignores case if the ambient v Line 1584  Completion ignores case if the ambient v
1584          {          {
1585            CHECK_NUMBER (position);            CHECK_NUMBER (position);
1586            /* Convert to distance from end of input.  */            /* Convert to distance from end of input.  */
1587            pos = XINT (position) - XSTRING (init)->size;            pos = XINT (position) - SCHARS (init);
1588          }          }
1589      }      }
1590    
# Line 1537  Completion ignores case if the ambient v Line 1610  Completion ignores case if the ambient v
1610                        histvar, histpos, def, 0,                        histvar, histpos, def, 0,
1611                        !NILP (inherit_input_method));                        !NILP (inherit_input_method));
1612    
1613    if (STRINGP (val) && XSTRING (val)->size == 0 && ! NILP (def))    if (STRINGP (val) && SCHARS (val) == 0 && ! NILP (def))
1614      val = def;      val = def;
1615    
1616    RETURN_UNGCPRO (unbind_to (count, val));    RETURN_UNGCPRO (unbind_to (count, val));
# Line 1556  the values STRING, PREDICATE and `lambda Line 1629  the values STRING, PREDICATE and `lambda
1629       Lisp_Object string, alist, predicate;       Lisp_Object string, alist, predicate;
1630  {  {
1631    Lisp_Object regexps, tem = Qnil;    Lisp_Object regexps, tem = Qnil;
1632      int i = 0;
1633    
1634    CHECK_STRING (string);    CHECK_STRING (string);
1635    
# Line 1563  the values STRING, PREDICATE and `lambda Line 1637  the values STRING, PREDICATE and `lambda
1637        || NILP (alist))        || NILP (alist))
1638      {      {
1639        tem = Fassoc_string (string, alist, completion_ignore_case ? Qt : Qnil);        tem = Fassoc_string (string, alist, completion_ignore_case ? Qt : Qnil);
1640        if (CONSP (tem))        if NILP (tem)
         tem = XCAR (tem);  
       else  
1641          return Qnil;          return Qnil;
1642      }      }
1643    else if (VECTORP (alist))    else if (VECTORP (alist))
1644      {      {
1645        /* Bypass intern-soft as that loses for nil.  */        /* Bypass intern-soft as that loses for nil.  */
1646        tem = oblookup (alist,        tem = oblookup (alist,
1647                        XSTRING (string)->data,                        SDATA (string),
1648                        XSTRING (string)->size,                        SCHARS (string),
1649                        STRING_BYTES (XSTRING (string)));                        SBYTES (string));
1650        if (!SYMBOLP (tem))        if (!SYMBOLP (tem))
1651          {          {
1652            if (STRING_MULTIBYTE (string))            if (STRING_MULTIBYTE (string))
# Line 1583  the values STRING, PREDICATE and `lambda Line 1655  the values STRING, PREDICATE and `lambda
1655              string = Fstring_make_multibyte (string);              string = Fstring_make_multibyte (string);
1656    
1657            tem = oblookup (Vminibuffer_completion_table,            tem = oblookup (Vminibuffer_completion_table,
1658                            XSTRING (string)->data,                            SDATA (string),
1659                            XSTRING (string)->size,                            SCHARS (string),
1660                            STRING_BYTES (XSTRING (string)));                            SBYTES (string));
1661            if (!SYMBOLP (tem))            if (!SYMBOLP (tem))
1662              return Qnil;              return Qnil;
1663          }          }
1664      }      }
1665      else if (HASH_TABLE_P (alist))
1666        {
1667          i = hash_lookup (XHASH_TABLE (alist), string, NULL);
1668          if (i >= 0)
1669            tem = HASH_KEY (XHASH_TABLE (alist), i);
1670          else
1671            return Qnil;
1672        }
1673    else    else
1674      return call3 (alist, string, predicate, Qlambda);      return call3 (alist, string, predicate, Qlambda);
1675    
# Line 1605  the values STRING, PREDICATE and `lambda Line 1685  the values STRING, PREDICATE and `lambda
1685    
1686    /* Finally, check the predicate.  */    /* Finally, check the predicate.  */
1687    if (!NILP (predicate))    if (!NILP (predicate))
1688      return call1 (predicate, tem);      return HASH_TABLE_P (alist)
1689          ? call2 (predicate, tem, HASH_VALUE (XHASH_TABLE (alist), i))
1690          : call1 (predicate, tem);
1691    else    else
1692      return Qt;      return Qt;
1693  }  }
# Line 1626  do_completion () Line 1708  do_completion ()
1708    Lisp_Object last;    Lisp_Object last;
1709    struct gcpro gcpro1, gcpro2;    struct gcpro gcpro1, gcpro2;
1710    
1711    completion = Ftry_completion (Fminibuffer_contents (),    completion = Ftry_completion (minibuffer_completion_contents (),
1712                                  Vminibuffer_completion_table,                                  Vminibuffer_completion_table,
1713                                  Vminibuffer_completion_predicate);                                  Vminibuffer_completion_predicate);
1714    last = last_exact_completion;    last = last_exact_completion;
# Line 1648  do_completion () Line 1730  do_completion ()
1730        return 1;        return 1;
1731      }      }
1732    
1733    string = Fminibuffer_contents ();    string = minibuffer_completion_contents ();
1734    
1735    /* COMPLETEDP should be true if some completion was done, which    /* COMPLETEDP should be true if some completion was done, which
1736       doesn't include simply changing the case of the entered string.       doesn't include simply changing the case of the entered string.
# Line 1661  do_completion () Line 1743  do_completion ()
1743    if (!EQ (tem, Qt))    if (!EQ (tem, Qt))
1744      /* Rewrite the user's input.  */      /* Rewrite the user's input.  */
1745      {      {
1746        Fdelete_minibuffer_contents (); /* Some completion happened */        int prompt_end = XINT (Fminibuffer_prompt_end ());
1747          /* Some completion happened */
1748    
1749          if (! NILP (Vminibuffer_completing_file_name)
1750              && SREF (completion, SBYTES (completion) - 1) == '/'
1751              && PT < ZV
1752              && FETCH_CHAR (PT_BYTE) == '/')
1753            {
1754              del_range (prompt_end, PT + 1);
1755            }
1756          else
1757            del_range (prompt_end, PT);
1758    
1759        Finsert (1, &completion);        Finsert (1, &completion);
1760    
1761        if (! completedp)        if (! completedp)
# Line 1703  do_completion () Line 1797  do_completion ()
1797    last_exact_completion = completion;    last_exact_completion = completion;
1798    if (!NILP (last))    if (!NILP (last))
1799      {      {
1800        tem = Fminibuffer_contents ();        tem = minibuffer_completion_contents ();
1801        if (!NILP (Fequal (tem, last)))        if (!NILP (Fequal (tem, last)))
1802          Fminibuffer_completion_help ();          Fminibuffer_completion_help ();
1803      }      }
# Line 1841  a repetition of this command will exit. Line 1935  a repetition of this command will exit.
1935      goto exit;      goto exit;
1936    
1937    /* Call do_completion, but ignore errors.  */    /* Call do_completion, but ignore errors.  */
1938      SET_PT (ZV);
1939    val = internal_condition_case (complete_and_exit_1, Qerror,    val = internal_condition_case (complete_and_exit_1, Qerror,
1940                                   complete_and_exit_2);                                   complete_and_exit_2);
1941    
# Line 1878  Return nil if there is no valid completi Line 1973  Return nil if there is no valid completi
1973  {  {
1974    Lisp_Object completion, tem, tem1;    Lisp_Object completion, tem, tem1;
1975    register int i, i_byte;    register int i, i_byte;
1976    register unsigned char *completion_string;    register const unsigned char *completion_string;
1977    struct gcpro gcpro1, gcpro2;    struct gcpro gcpro1, gcpro2;
1978    int prompt_end_charpos;    int prompt_end_charpos = XINT (Fminibuffer_prompt_end ());
1979    
1980    /* We keep calling Fbuffer_string rather than arrange for GC to    /* We keep calling Fbuffer_string rather than arrange for GC to
1981       hold onto a pointer to one of the strings thus made.  */       hold onto a pointer to one of the strings thus made.  */
1982    
1983    completion = Ftry_completion (Fminibuffer_contents (),    completion = Ftry_completion (minibuffer_completion_contents (),
1984                                  Vminibuffer_completion_table,                                  Vminibuffer_completion_table,
1985                                  Vminibuffer_completion_predicate);                                  Vminibuffer_completion_predicate);
1986    if (NILP (completion))    if (NILP (completion))
# Line 1899  Return nil if there is no valid completi Line 1994  Return nil if there is no valid completi
1994    
1995  #if 0 /* How the below code used to look, for reference. */  #if 0 /* How the below code used to look, for reference. */
1996    tem = Fminibuffer_contents ();    tem = Fminibuffer_contents ();
1997    b = XSTRING (tem)->data;    b = SDATA (tem);
1998    i = ZV - 1 - XSTRING (completion)->size;    i = ZV - 1 - SCHARS (completion);
1999    p = XSTRING (completion)->data;    p = SDATA (completion);
2000    if (i > 0 ||    if (i > 0 ||
2001        0 <= scmp (b, p, ZV - 1))        0 <= scmp (b, p, ZV - 1))
2002      {      {
# Line 1917  Return nil if there is no valid completi Line 2012  Return nil if there is no valid completi
2012      int buffer_nchars, completion_nchars;      int buffer_nchars, completion_nchars;
2013    
2014      CHECK_STRING (completion);      CHECK_STRING (completion);
2015      tem = Fminibuffer_contents ();      tem = minibuffer_completion_contents ();
2016      GCPRO2 (completion, tem);      GCPRO2 (completion, tem);
2017      /* If reading a file name,      /* If reading a file name,
2018         expand any $ENVVAR refs in the buffer and in TEM.  */         expand any $ENVVAR refs in the buffer and in TEM.  */
# Line 1928  Return nil if there is no valid completi Line 2023  Return nil if there is no valid completi
2023          if (! EQ (substituted, tem))          if (! EQ (substituted, tem))
2024            {            {
2025              tem = substituted;              tem = substituted;
2026              Fdelete_minibuffer_contents ();              del_range (prompt_end_charpos, PT);
2027              insert_from_string (tem, 0, 0, XSTRING (tem)->size,              Finsert (1, &tem);
                                 STRING_BYTES (XSTRING (tem)), 0);  
2028            }            }
2029        }        }
2030      buffer_nchars = XSTRING (tem)->size; /* ie ZV - BEGV */      buffer_nchars = SCHARS (tem); /* # chars in what we completed.  */
2031      completion_nchars = XSTRING (completion)->size;      completion_nchars = SCHARS (completion);
2032      i = buffer_nchars - completion_nchars;      i = buffer_nchars - completion_nchars;
2033      if (i > 0      if (i > 0
2034          ||          ||
# Line 1947  Return nil if there is no valid completi Line 2041  Return nil if there is no valid completi
2041        {        {
2042          int start_pos;          int start_pos;
2043    
2044          /* Set buffer to longest match of buffer tail and completion head.  */          /* Make buffer (before point) contain the longest match
2045               of TEM's tail and COMPLETION's head.  */
2046          if (i <= 0) i = 1;          if (i <= 0) i = 1;
2047          start_pos= i;          start_pos= i;
2048          buffer_nchars -= i;          buffer_nchars -= i;
# Line 1964  Return nil if there is no valid completi Line 2059  Return nil if there is no valid completi
2059              buffer_nchars--;              buffer_nchars--;
2060            }            }
2061          del_range (1, i + 1);          del_range (1, i + 1);
         SET_PT_BOTH (ZV, ZV_BYTE);  
2062        }        }
2063      UNGCPRO;      UNGCPRO;
2064    }    }
2065  #endif /* Rewritten code */  #endif /* Rewritten code */
2066    
   prompt_end_charpos = XINT (Fminibuffer_prompt_end ());  
   
2067    {    {
2068      int prompt_end_bytepos;      int prompt_end_bytepos;
2069      prompt_end_bytepos = CHAR_TO_BYTE (prompt_end_charpos);      prompt_end_bytepos = CHAR_TO_BYTE (prompt_end_charpos);
2070      i = ZV - prompt_end_charpos;      i = PT - prompt_end_charpos;
2071      i_byte = ZV_BYTE - prompt_end_bytepos;      i_byte = PT_BYTE - prompt_end_bytepos;
2072    }    }
2073    
2074    /* If completion finds next char not unique,    /* If completion finds next char not unique,
2075       consider adding a space or a hyphen. */       consider adding a space or a hyphen. */
2076    if (i == XSTRING (completion)->size)    if (i == SCHARS (completion))
2077      {      {
2078        GCPRO1 (completion);        GCPRO1 (completion);
2079        tem = Ftry_completion (concat2 (Fminibuffer_contents (), build_string (" ")),        tem = Ftry_completion (concat2 (minibuffer_completion_contents (),
2080                                          build_string (" ")),
2081                               Vminibuffer_completion_table,                               Vminibuffer_completion_table,
2082                               Vminibuffer_completion_predicate);                               Vminibuffer_completion_predicate);
2083        UNGCPRO;        UNGCPRO;
# Line 1995  Return nil if there is no valid completi Line 2088  Return nil if there is no valid completi
2088          {          {
2089            GCPRO1 (completion);            GCPRO1 (completion);
2090            tem =            tem =
2091              Ftry_completion (concat2 (Fminibuffer_contents (), build_string ("-")),              Ftry_completion (concat2 (minibuffer_completion_contents (),
2092                                          build_string ("-")),
2093                               Vminibuffer_completion_table,                               Vminibuffer_completion_table,
2094                               Vminibuffer_completion_predicate);                               Vminibuffer_completion_predicate);
2095            UNGCPRO;            UNGCPRO;
# Line 2009  Return nil if there is no valid completi Line 2103  Return nil if there is no valid completi
2103       i gets index in string of where to stop completing.  */       i gets index in string of where to stop completing.  */
2104    {    {
2105      int len, c;      int len, c;
2106      int bytes = STRING_BYTES (XSTRING (completion));      int bytes = SBYTES (completion);
2107      completion_string = XSTRING (completion)->data;      completion_string = SDATA (completion);
2108      for (; i_byte < STRING_BYTES (XSTRING (completion)); i_byte += len, i++)      for (; i_byte < SBYTES (completion); i_byte += len, i++)
2109        {        {
2110          c = STRING_CHAR_AND_LENGTH (completion_string + i_byte,          c = STRING_CHAR_AND_LENGTH (completion_string + i_byte,
2111                                      bytes - i_byte,                                      bytes - i_byte,
# Line 2027  Return nil if there is no valid completi Line 2121  Return nil if there is no valid completi
2121    
2122    /* If got no characters, print help for user.  */    /* If got no characters, print help for user.  */
2123    
2124    if (i == ZV - prompt_end_charpos)    if (i == PT - prompt_end_charpos)
2125      {      {
2126        if (!NILP (Vcompletion_auto_help))        if (!NILP (Vcompletion_auto_help))
2127          Fminibuffer_completion_help ();          Fminibuffer_completion_help ();
# Line 2036  Return nil if there is no valid completi Line 2130  Return nil if there is no valid completi
2130    
2131    /* Otherwise insert in minibuffer the chars we got */    /* Otherwise insert in minibuffer the chars we got */
2132    
2133    Fdelete_minibuffer_contents ();    if (! NILP (Vminibuffer_completing_file_name)
2134          && SREF (completion, SBYTES (completion) - 1) == '/'
2135          && PT < ZV
2136          && FETCH_CHAR (PT_BYTE) == '/')
2137        {
2138          del_range (prompt_end_charpos, PT + 1);
2139        }
2140      else
2141        del_range (prompt_end_charpos, PT);
2142    
2143    insert_from_string (completion, 0, 0, i, i_byte, 1);    insert_from_string (completion, 0, 0, i, i_byte, 1);
2144    return Qt;    return Qt;
2145  }  }
# Line 2091  It can find the completion buffer in `st Line 2194  It can find the completion buffer in `st
2194              {              {
2195                tem = XCAR (elt);                tem = XCAR (elt);
2196                CHECK_STRING (tem);                CHECK_STRING (tem);
2197                length = XSTRING (tem)->size;                length = SCHARS (tem);
2198    
2199                tem = Fcar (XCDR (elt));                tem = Fcar (XCDR (elt));
2200                CHECK_STRING (tem);                CHECK_STRING (tem);
2201                length += XSTRING (tem)->size;                length += SCHARS (tem);
2202              }              }
2203            else            else
2204              {              {
2205                CHECK_STRING (elt);                CHECK_STRING (elt);
2206                length = XSTRING (elt)->size;                length = SCHARS (elt);
2207              }              }
2208    
2209            /* This does a bad job for narrower than usual windows.            /* This does a bad job for narrower than usual windows.
# Line 2232  DEFUN ("minibuffer-completion-help", Fmi Line 2335  DEFUN ("minibuffer-completion-help", Fmi
2335    Lisp_Object completions;    Lisp_Object completions;
2336    
2337    message ("Making completion list...");    message ("Making completion list...");
2338    completions = Fall_completions (Fminibuffer_contents (),    completions = Fall_completions (minibuffer_completion_contents (),
2339                                    Vminibuffer_completion_table,                                    Vminibuffer_completion_table,
2340                                    Vminibuffer_completion_predicate,                                    Vminibuffer_completion_predicate,
2341                                    Qt);                                    Qt);
# Line 2293  If no minibuffer is active, return nil. Line 2396  If no minibuffer is active, return nil.
2396    
2397  void  void
2398  temp_echo_area_glyphs (m)  temp_echo_area_glyphs (m)
2399       char *m;       const char *m;
2400  {  {
2401    int osize = ZV;    int osize = ZV;
2402    int osize_byte = ZV_BYTE;    int osize_byte = ZV_BYTE;
# Line 2328  or until the next input event arrives, w Line 2431  or until the next input event arrives, w
2431       (string)       (string)
2432       Lisp_Object string;       Lisp_Object string;
2433  {  {
2434    temp_echo_area_glyphs (XSTRING (string)->data);    CHECK_STRING (string);
2435      temp_echo_area_glyphs (SDATA (string));
2436    return Qnil;    return Qnil;
2437  }  }
2438    
# Line 2509  properties.  */); Line 2613  properties.  */);
2613    defsubr (&Sminibuffer_depth);    defsubr (&Sminibuffer_depth);
2614    defsubr (&Sminibuffer_prompt);    defsubr (&Sminibuffer_prompt);
2615    
2616      defsubr (&Sminibufferp);
2617    defsubr (&Sminibuffer_prompt_end);    defsubr (&Sminibuffer_prompt_end);
2618    defsubr (&Sminibuffer_contents);    defsubr (&Sminibuffer_contents);
2619    defsubr (&Sminibuffer_contents_no_properties);    defsubr (&Sminibuffer_contents_no_properties);

Legend:
Removed from v.1.240  
changed lines
  Added in v.1.240.2.1

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26