/* Minibuffer input and completion.
- Copyright (C) 1985,86,93,94,95,96,97,98,99,2000,01,03,04
- Free Software Foundation, Inc.
+ Copyright (C) 1985, 1986, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+ 2001, 2002, 2003, 2004, 2005,
+ 2006, 2007 Free Software Foundation, Inc.
This file is part of GNU Emacs.
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>
Lisp_Object Qhistory_length, Vhistory_length;
+/* No duplicates in history. */
+
+int history_delete_duplicates;
+
+/* Non-nil means add new input to history. */
+
+Lisp_Object Vhistory_add_new_input;
+
/* Fread_minibuffer leaves the input here as a string. */
Lisp_Object last_minibuf_string;
static Lisp_Object last_exact_completion;
-extern Lisp_Object Voverriding_local_map;
+/* Keymap for reading expressions. */
+Lisp_Object Vread_expression_map;
+
+Lisp_Object Vminibuffer_completion_table, Qminibuffer_completion_table;
+Lisp_Object Vminibuffer_completion_predicate, Qminibuffer_completion_predicate;
+Lisp_Object Vminibuffer_completion_confirm, Qminibuffer_completion_confirm;
+Lisp_Object Vminibuffer_completing_file_name;
Lisp_Object Quser_variable_p;
Lisp_Object Qcase_fold_search;
+Lisp_Object Qread_expression_history;
+
+extern Lisp_Object Voverriding_local_map;
+
extern Lisp_Object Qmouse_face;
extern Lisp_Object Qfield;
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. */
DEFUN ("minibuffer-contents", Fminibuffer_contents,
Sminibuffer_contents, 0, 0, 0,
doc: /* Return the user input in a minibuffer as a string.
-The current buffer must be a minibuffer. */)
+If the current buffer is not a minibuffer, return its entire contents. */)
()
{
int prompt_end = XINT (Fminibuffer_prompt_end ());
DEFUN ("minibuffer-contents-no-properties", Fminibuffer_contents_no_properties,
Sminibuffer_contents_no_properties, 0, 0, 0,
doc: /* Return the user input in a minibuffer as a string, without text-properties.
-The current buffer must be a minibuffer. */)
+If the current buffer is not a minibuffer, return its entire contents. */)
()
{
int prompt_end = XINT (Fminibuffer_prompt_end ());
return make_buffer_string (prompt_end, ZV, 0);
}
+DEFUN ("minibuffer-completion-contents", Fminibuffer_completion_contents,
+ Sminibuffer_completion_contents, 0, 0, 0,
+ doc: /* Return the user input in a minibuffer before point as a string.
+That is what completion commands operate on.
+If the current buffer is not a minibuffer, return its entire 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);
+}
+
DEFUN ("delete-minibuffer-contents", Fdelete_minibuffer_contents,
Sdelete_minibuffer_contents, 0, 0, 0,
doc: /* Delete all user input in a minibuffer.
-The current buffer must be a minibuffer. */)
+If the current buffer is not a minibuffer, erase its entire contents. */)
()
{
int prompt_end = XINT (Fminibuffer_prompt_end ());
return Qnil;
}
-/* Get the text in the minibuffer before point.
- That is what completion commands operate on. */
-
-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
/* Read from the minibuffer using keymap MAP and initial contents INITIAL,
putting point minus BACKUP_N bytes from the end of INITIAL,
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
Lisp_Object enable_multibyte;
int pos = INTEGERP (backup_n) ? XINT (backup_n) : 0;
-
/* String to add to the history. */
Lisp_Object histstring;
+ Lisp_Object empty_minibuf;
+ Lisp_Object dummy, frame;
+
extern Lisp_Object Qfront_sticky;
extern Lisp_Object Qrear_nonsticky;
specbind (Qminibuffer_default, defalt);
+ /* If Vminibuffer_completing_file_name is `lambda' on entry, it was t
+ in previous recursive minibuffer, but was not set explicitly
+ to t for this invocation, so set it to nil in this minibuffer.
+ Save the old value now, before we change it. */
+ specbind (intern ("minibuffer-completing-file-name"), Vminibuffer_completing_file_name);
+ if (EQ (Vminibuffer_completing_file_name, Qlambda))
+ Vminibuffer_completing_file_name = Qnil;
+
single_kboard_state ();
#ifdef HAVE_X_WINDOWS
if (display_hourglass_p)
GCPRO5 (map, initial, val, ambient_dir, input_method);
if (!STRINGP (prompt))
- prompt = empty_string;
+ prompt = empty_unibyte_string;
if (!enable_recursive_minibuffers
&& minibuf_level > 0)
build_string ("Command attempted to use minibuffer while in minibuffer"));
}
- if (noninteractive)
+ if (noninteractive && NILP (Vexecuting_kbd_macro))
{
val = read_minibuf_noninteractive (map, initial, prompt,
make_number (pos),
specpdl slots. */
minibuf_save_list
= Fcons (Voverriding_local_map,
- Fcons (minibuf_window, minibuf_save_list));
+ Fcons (minibuf_window,
+ minibuf_save_list));
minibuf_save_list
= Fcons (minibuf_prompt,
Fcons (make_number (minibuf_prompt_width),
Vminibuffer_history_position = histpos;
Vminibuffer_history_variable = histvar;
Vhelp_form = Vminibuffer_help_form;
+ /* If this minibuffer is reading a file name, that doesn't mean
+ recursive ones are. But we cannot set it to nil, because
+ completion code still need to know the minibuffer is completing a
+ file name. So use `lambda' as intermediate value meaning
+ "t" in this minibuffer, but "nil" in next minibuffer. */
+ if (!NILP (Vminibuffer_completing_file_name))
+ Vminibuffer_completing_file_name = Qlambda;
if (inherit_input_method)
{
minibuffer = get_minibuffer (minibuf_level);
Fset_buffer (minibuffer);
+ /* If appropriate, copy enable-multibyte-characters into the minibuffer. */
+ if (inherit_input_method)
+ current_buffer->enable_multibyte_characters = enable_multibyte;
+
/* The current buffer's default directory is usually the right thing
for our minibuffer here. However, if you're typing a command at
a minibuffer-only frame when minibuf_level is zero, then buf IS
Vminibuf_scroll_window = selected_window;
if (minibuf_level == 1 || !EQ (minibuf_window, selected_window))
minibuf_selected_window = selected_window;
+
+ /* Empty out the minibuffers of all frames other than the one
+ where we are going to display one now.
+ Set them to point to ` *Minibuf-0*', which is always empty. */
+ empty_minibuf = Fget_buffer (build_string (" *Minibuf-0*"));
+
+ FOR_EACH_FRAME (dummy, frame)
+ {
+ Lisp_Object root_window = Fframe_root_window (frame);
+ Lisp_Object mini_window = XWINDOW (root_window)->next;
+
+ if (! NILP (mini_window) && ! EQ (mini_window, minibuf_window)
+ && !NILP (Fwindow_minibuffer_p (mini_window)))
+ Fset_window_buffer (mini_window, empty_minibuf, Qnil);
+ }
+
+ /* Display this minibuffer in the proper window. */
Fset_window_buffer (minibuf_window, Fcurrent_buffer (), Qnil);
Fselect_window (minibuf_window, Qnil);
XSETFASTINT (XWINDOW (minibuf_window)->hscroll, 0);
specbind (Qinhibit_read_only, Qt);
specbind (Qinhibit_modification_hooks, Qt);
Ferase_buffer ();
- unbind_to (count1, Qnil);
- }
- if (!NILP (current_buffer->enable_multibyte_characters)
- && ! STRING_MULTIBYTE (minibuf_prompt))
- minibuf_prompt = Fstring_make_multibyte (minibuf_prompt);
+ if (!NILP (current_buffer->enable_multibyte_characters)
+ && ! STRING_MULTIBYTE (minibuf_prompt))
+ minibuf_prompt = Fstring_make_multibyte (minibuf_prompt);
- /* Insert the prompt, record where it ends. */
- Finsert (1, &minibuf_prompt);
- if (PT > BEG)
- {
- Fput_text_property (make_number (BEG), make_number (PT),
- Qfront_sticky, Qt, Qnil);
- Fput_text_property (make_number (BEG), make_number (PT),
- Qrear_nonsticky, Qt, Qnil);
- Fput_text_property (make_number (BEG), make_number (PT),
- Qfield, Qt, Qnil);
- Fadd_text_properties (make_number (BEG), make_number (PT),
- Vminibuffer_prompt_properties, Qnil);
- }
+ /* Insert the prompt, record where it ends. */
+ Finsert (1, &minibuf_prompt);
+ if (PT > BEG)
+ {
+ Fput_text_property (make_number (BEG), make_number (PT),
+ Qfront_sticky, Qt, Qnil);
+ Fput_text_property (make_number (BEG), make_number (PT),
+ Qrear_nonsticky, Qt, Qnil);
+ Fput_text_property (make_number (BEG), make_number (PT),
+ Qfield, Qt, Qnil);
+ Fadd_text_properties (make_number (BEG), make_number (PT),
+ Vminibuffer_prompt_properties, Qnil);
+ }
+ unbind_to (count1, Qnil);
+ }
minibuf_prompt_width = (int) current_column (); /* iftc */
- /* If appropriate, copy enable-multibyte-characters into the minibuffer. */
- if (inherit_input_method)
- current_buffer->enable_multibyte_characters = enable_multibyte;
-
/* Put in the initial input. */
if (!NILP (initial))
{
histstring = Qnil;
/* Add the value to the appropriate history list, if any. */
- if (SYMBOLP (Vminibuffer_history_variable)
+ if (!NILP (Vhistory_add_new_input)
+ && SYMBOLP (Vminibuffer_history_variable)
&& !NILP (histstring))
{
/* If the caller wanted to save the value read on a history list,
if (NILP (histval)
|| (CONSP (histval)
/* Don't duplicate the most recent entry in the history. */
- && NILP (Fequal (histstring, Fcar (histval)))))
+ && (NILP (Fequal (histstring, Fcar (histval))))))
{
Lisp_Object length;
+ if (history_delete_duplicates) Fdelete (histstring, histval);
histval = Fcons (histstring, histval);
Fset (Vminibuffer_history_variable, histval);
one puts point at the beginning of the string. *Note* that this
behavior differs from the way such arguments are used in `completing-read'
and some related functions, which use zero-indexing for POSITION. */)
- (prompt, initial_contents, keymap, read, hist, default_value, inherit_input_method)
+ (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;
{
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;
{
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;
{
- return Feval (Fread_minibuffer (prompt, initial_contents));
+ return Feval (read_minibuf (Vread_expression_map, initial_contents,
+ prompt, Qnil, 1, Qread_expression_history,
+ make_number (0), Qnil, 0, 0));
}
/* Functions that use the minibuffer to read various things. */
Prompt with PROMPT.
Optional second arg DEF is value to return if user enters an empty line.
If optional third arg REQUIRE-MATCH is non-nil,
- only existing buffer names are allowed. */)
+ only existing buffer names are allowed.
+The argument PROMPT should be a string ending with a colon and a space. */)
(prompt, def, require_match)
Lisp_Object prompt, def, require_match;
{
Lisp_Object args[4];
+ unsigned char *s;
+ int len;
if (BUFFERP (def))
def = XBUFFER (def)->name;
{
if (!NILP (def))
{
- args[0] = build_string ("%s(default %s) ");
+ /* A default value was provided: we must change PROMPT,
+ editing the default value in before the colon. To achieve
+ this, we replace PROMPT with a substring that doesn't
+ contain the terminal space and colon (if present). They
+ are then added back using Fformat. */
+
+ if (STRINGP (prompt))
+ {
+ s = SDATA (prompt);
+ len = strlen (s);
+ if (len >= 2 && s[len - 2] == ':' && s[len - 1] == ' ')
+ len = len - 2;
+ else if (len >= 1 && (s[len - 1] == ':' || s[len - 1] == ' '))
+ len--;
+
+ prompt = make_specified_string (s, -1, len,
+ STRING_MULTIBYTE (prompt));
+ }
+
+ 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, Qbuffer_name_history,
+ return Fcompleting_read (prompt, intern ("internal-complete-buffer"),
+ Qnil, require_match, Qnil, Qbuffer_name_history,
def, Qnil);
}
else
}
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.
-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 an obarray, the names of all symbols in the obarray
-are the possible matches.
-
-ALIST can also be a function to do the completion itself.
+ doc: /* Return common substring of all completions of STRING in COLLECTION.
+Test each possible completion specified by COLLECTION
+to see if it begins with STRING. The possible completions may be
+strings or symbols. Symbols are converted to strings before testing,
+see `symbol-name'.
+All that match STRING are compared together; the longest initial sequence
+common to all these matches is the return value.
+If there is no match at all, the return value is nil.
+For a unique match which is exact, the return value is t.
+
+If COLLECTION is an alist, the keys (cars of elements) are the
+possible completions. If an element is not a cons cell, then the
+element itself is the possible completion.
+If COLLECTION is a hash-table, all the keys that are strings or symbols
+are the possible completions.
+If COLLECTION is an obarray, the names of all symbols in the obarray
+are the possible completions.
+
+COLLECTION can also be a function to do the completion itself.
It receives three arguments: the values STRING, PREDICATE and nil.
Whatever it returns becomes the value of `try-completion'.
it is used to test each possible match.
The match is a candidate only if PREDICATE returns non-nil.
The argument given to PREDICATE is the alist element
-or the symbol from the obarray. If ALIST is a hash-table,
+or the symbol from the obarray. If COLLECTION is a hash-table,
predicate is called with two arguments: the key and the value.
Additionally to this predicate, `completion-regexp-list'
is used to further constrain the set of candidates. */)
- (string, alist, predicate)
- Lisp_Object string, alist, predicate;
+ (string, collection, predicate)
+ Lisp_Object string, collection, predicate;
{
Lisp_Object bestmatch, tail, elt, eltstring;
/* Size in bytes of BESTMATCH. */
int bestmatchsize = 0;
/* These are in bytes, too. */
int compare, matchsize;
- int type = HASH_TABLE_P (alist) ? 3
- : VECTORP (alist) ? 2
- : NILP (alist) || (CONSP (alist)
- && (!SYMBOLP (XCAR (alist))
- || NILP (XCAR (alist))));
+ int type = (HASH_TABLE_P (collection) ? 3
+ : VECTORP (collection) ? 2
+ : NILP (collection) || (CONSP (collection)
+ && (!SYMBOLP (XCAR (collection))
+ || NILP (XCAR (collection)))));
int index = 0, obsize = 0;
int matchcount = 0;
+ int bindcount = -1;
Lisp_Object bucket, zero, end, tem;
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
CHECK_STRING (string);
if (type == 0)
- return call3 (alist, string, predicate, Qnil);
+ return call3 (collection, string, predicate, Qnil);
bestmatch = bucket = Qnil;
+ zero = make_number (0);
- /* If ALIST is not a list, set TAIL just for gc pro. */
- tail = alist;
+ /* If COLLECTION is not a list, set TAIL just for gc pro. */
+ tail = collection;
if (type == 2)
{
- obsize = XVECTOR (alist)->size;
- bucket = XVECTOR (alist)->contents[index];
+ collection = check_obarray (collection);
+ obsize = XVECTOR (collection)->size;
+ bucket = XVECTOR (collection)->contents[index];
}
while (1)
}
else if (type == 2)
{
- if (XFASTINT (bucket) != 0)
+ if (!EQ (bucket, zero))
{
+ if (!SYMBOLP (bucket))
+ error ("Bad data in guts of obarray");
elt = bucket;
- eltstring = Fsymbol_name (elt);
+ eltstring = elt;
if (XSYMBOL (bucket)->next)
XSETSYMBOL (bucket, XSYMBOL (bucket)->next);
else
break;
else
{
- bucket = XVECTOR (alist)->contents[index];
+ bucket = XVECTOR (collection)->contents[index];
continue;
}
}
else /* if (type == 3) */
{
- while (index < HASH_TABLE_SIZE (XHASH_TABLE (alist))
- && NILP (HASH_HASH (XHASH_TABLE (alist), index)))
+ while (index < HASH_TABLE_SIZE (XHASH_TABLE (collection))
+ && NILP (HASH_HASH (XHASH_TABLE (collection), index)))
index++;
- if (index >= HASH_TABLE_SIZE (XHASH_TABLE (alist)))
+ if (index >= HASH_TABLE_SIZE (XHASH_TABLE (collection)))
break;
else
- elt = eltstring = HASH_KEY (XHASH_TABLE (alist), index++);
+ elt = eltstring = HASH_KEY (XHASH_TABLE (collection), index++);
}
/* 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. */
{
- int count = SPECPDL_INDEX ();
- specbind (Qcase_fold_search, completion_ignore_case ? Qt : Qnil);
for (regexps = Vcompletion_regexp_list; CONSP (regexps);
regexps = XCDR (regexps))
{
+ if (bindcount < 0) {
+ bindcount = SPECPDL_INDEX ();
+ specbind (Qcase_fold_search,
+ completion_ignore_case ? Qt : Qnil);
+ }
tem = Fstring_match (XCAR (regexps), eltstring, zero);
if (NILP (tem))
break;
}
- unbind_to (count, Qnil);
if (CONSP (regexps))
continue;
}
tem = Fcommandp (elt, Qnil);
else
{
+ if (bindcount >= 0) {
+ unbind_to (bindcount, Qnil);
+ bindcount = -1;
+ }
GCPRO4 (tail, string, eltstring, bestmatch);
tem = type == 3
? call2 (predicate, elt,
- HASH_VALUE (XHASH_TABLE (alist), index - 1))
+ HASH_VALUE (XHASH_TABLE (collection), index - 1))
: call1 (predicate, elt);
UNGCPRO;
}
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))
((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))))
matchcount++;
bestmatchsize = matchsize;
if (matchsize <= SCHARS (string)
+ /* If completion-ignore-case is non-nil, don't
+ short-circuit because we want to find the best
+ possible match *including* case differences. */
+ && !completion_ignore_case
&& matchcount > 1)
/* No need to look any further. */
break;
}
}
+ if (bindcount >= 0) {
+ unbind_to (bindcount, Qnil);
+ bindcount = -1;
+ }
+
if (NILP (bestmatch))
return Qnil; /* No completions found */
/* If we are ignoring case, and there is no exact match,
}
\f
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.
-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 an obarray, the names of all symbols in the obarray
-are the possible matches.
-
-ALIST can also be a function to do the completion itself.
+ doc: /* Search for partial matches to STRING in COLLECTION.
+Test each of the possible completions specified by COLLECTION
+to see if it begins with STRING. The possible completions may be
+strings or symbols. Symbols are converted to strings before testing,
+see `symbol-name'.
+The value is a list of all the possible completions that match STRING.
+
+If COLLECTION is an alist, the keys (cars of elements) are the
+possible completions. If an element is not a cons cell, then the
+element itself is the possible completion.
+If COLLECTION is a hash-table, all the keys that are strings or symbols
+are the possible completions.
+If COLLECTION is an obarray, the names of all symbols in the obarray
+are the possible completions.
+
+COLLECTION can also be a function to do the completion itself.
It receives three arguments: the values STRING, PREDICATE and t.
Whatever it returns becomes the value of `all-completions'.
it is used to test each possible match.
The match is a candidate only if PREDICATE returns non-nil.
The argument given to PREDICATE is the alist element
-or the symbol from the obarray. If ALIST is a hash-table,
+or the symbol from the obarray. If COLLECTION is a hash-table,
predicate is called with two arguments: the key and the value.
Additionally to this predicate, `completion-regexp-list'
is used to further constrain the set of candidates.
If the optional fourth argument HIDE-SPACES is non-nil,
-strings in ALIST that start with a space
+strings in COLLECTION that start with a space
are ignored unless STRING itself starts with a space. */)
- (string, alist, predicate, hide_spaces)
- Lisp_Object string, alist, predicate, hide_spaces;
+ (string, collection, predicate, hide_spaces)
+ Lisp_Object string, collection, predicate, hide_spaces;
{
Lisp_Object tail, elt, eltstring;
Lisp_Object allmatches;
- int type = HASH_TABLE_P (alist) ? 3
- : VECTORP (alist) ? 2
- : NILP (alist) || (CONSP (alist)
- && (!SYMBOLP (XCAR (alist))
- || NILP (XCAR (alist))));
+ int type = HASH_TABLE_P (collection) ? 3
+ : VECTORP (collection) ? 2
+ : NILP (collection) || (CONSP (collection)
+ && (!SYMBOLP (XCAR (collection))
+ || NILP (XCAR (collection))));
int index = 0, obsize = 0;
- Lisp_Object bucket, tem;
+ int bindcount = -1;
+ Lisp_Object bucket, tem, zero;
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
CHECK_STRING (string);
if (type == 0)
- return call3 (alist, string, predicate, Qt);
+ return call3 (collection, string, predicate, Qt);
allmatches = bucket = Qnil;
+ zero = make_number (0);
- /* If ALIST is not a list, set TAIL just for gc pro. */
- tail = alist;
+ /* If COLLECTION is not a list, set TAIL just for gc pro. */
+ tail = collection;
if (type == 2)
{
- obsize = XVECTOR (alist)->size;
- bucket = XVECTOR (alist)->contents[index];
+ obsize = XVECTOR (collection)->size;
+ bucket = XVECTOR (collection)->contents[index];
}
while (1)
}
else if (type == 2)
{
- if (XFASTINT (bucket) != 0)
+ if (!EQ (bucket, zero))
{
elt = bucket;
- eltstring = Fsymbol_name (elt);
+ eltstring = elt;
if (XSYMBOL (bucket)->next)
XSETSYMBOL (bucket, XSYMBOL (bucket)->next);
else
break;
else
{
- bucket = XVECTOR (alist)->contents[index];
+ bucket = XVECTOR (collection)->contents[index];
continue;
}
}
else /* if (type == 3) */
{
- while (index < HASH_TABLE_SIZE (XHASH_TABLE (alist))
- && NILP (HASH_HASH (XHASH_TABLE (alist), index)))
+ while (index < HASH_TABLE_SIZE (XHASH_TABLE (collection))
+ && NILP (HASH_HASH (XHASH_TABLE (collection), index)))
index++;
- if (index >= HASH_TABLE_SIZE (XHASH_TABLE (alist)))
+ if (index >= HASH_TABLE_SIZE (XHASH_TABLE (collection)))
break;
else
- elt = eltstring = HASH_KEY (XHASH_TABLE (alist), index++);
+ elt = eltstring = HASH_KEY (XHASH_TABLE (collection), index++);
}
/* 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
&& 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)))
/* Ignore this element if it fails to match all the regexps. */
{
- int count = SPECPDL_INDEX ();
- specbind (Qcase_fold_search, completion_ignore_case ? Qt : Qnil);
for (regexps = Vcompletion_regexp_list; CONSP (regexps);
regexps = XCDR (regexps))
{
+ if (bindcount < 0) {
+ bindcount = SPECPDL_INDEX ();
+ specbind (Qcase_fold_search,
+ completion_ignore_case ? Qt : Qnil);
+ }
tem = Fstring_match (XCAR (regexps), eltstring, zero);
if (NILP (tem))
break;
}
- unbind_to (count, Qnil);
if (CONSP (regexps))
continue;
}
tem = Fcommandp (elt, Qnil);
else
{
+ if (bindcount >= 0) {
+ unbind_to (bindcount, Qnil);
+ bindcount = -1;
+ }
GCPRO4 (tail, eltstring, allmatches, string);
tem = type == 3
? call2 (predicate, elt,
- HASH_VALUE (XHASH_TABLE (alist), index - 1))
+ HASH_VALUE (XHASH_TABLE (collection), index - 1))
: call1 (predicate, elt);
UNGCPRO;
}
}
}
+ if (bindcount >= 0) {
+ unbind_to (bindcount, Qnil);
+ bindcount = -1;
+ }
+
return Fnreverse (allmatches);
}
\f
-Lisp_Object Vminibuffer_completion_table, Qminibuffer_completion_table;
-Lisp_Object Vminibuffer_completion_predicate, Qminibuffer_completion_predicate;
-Lisp_Object Vminibuffer_completion_confirm, Qminibuffer_completion_confirm;
-Lisp_Object Vminibuffer_completing_file_name;
-
DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 8, 0,
doc: /* Read a string in the minibuffer, with completion.
PROMPT is a string to prompt with; normally it ends in a colon and a space.
-TABLE can be an list of strings, an alist, an obarray or a hash table.
-TABLE can also be a function to do the completion itself.
-PREDICATE limits completion to a subset of TABLE.
+COLLECTION can be a list of strings, an alist, an obarray or a hash table.
+COLLECTION can also be a function to do the completion itself.
+PREDICATE limits completion to a subset of COLLECTION.
See `try-completion' and `all-completions' for more details
- on completion, TABLE, and PREDICATE.
+ on completion, COLLECTION, and PREDICATE.
If REQUIRE-MATCH is non-nil, the user is not allowed to exit unless
- the input is (or completes to) an element of TABLE or is null.
+ the input is (or completes to) an element of COLLECTION or is null.
If it is also not t, typing RET does not exit if it does non-null completion.
If the input is null, `completing-read' returns DEF, or an empty string
if DEF is nil, regardless of the value of REQUIRE-MATCH.
is the initial position (the position in the list used by the
minibuffer history commands). For consistency, you should also
specify that element of the history as the value of
- INITIAL-CONTENTS. (This is the only case in which you should use
+ INITIAL-INPUT. (This is the only case in which you should use
INITIAL-INPUT instead of DEF.) Positions are counted starting from
1 at the beginning of the list. The variable `history-length'
controls the maximum length of a history list.
Completion ignores case if the ambient value of
`completion-ignore-case' is non-nil. */)
- (prompt, table, predicate, require_match, initial_input, hist, def, inherit_input_method)
- Lisp_Object prompt, table, predicate, require_match, initial_input;
+ (prompt, collection, predicate, require_match, initial_input, hist, def, inherit_input_method)
+ Lisp_Object prompt, collection, predicate, require_match, initial_input;
Lisp_Object hist, def, inherit_input_method;
{
Lisp_Object val, histvar, histpos, position;
init = initial_input;
GCPRO1 (def);
- specbind (Qminibuffer_completion_table, table);
+ specbind (Qminibuffer_completion_table, collection);
specbind (Qminibuffer_completion_predicate, predicate);
specbind (Qminibuffer_completion_confirm,
EQ (require_match, Qt) ? Qnil : require_match);
XSETFASTINT (histpos, 0);
val = read_minibuf (NILP (require_match)
- ? Vminibuffer_local_completion_map
- : Vminibuffer_local_must_match_map,
+ ? (NILP (Vminibuffer_completing_file_name)
+ || EQ (Vminibuffer_completing_file_name, Qlambda)
+ ? Vminibuffer_local_completion_map
+ : Vminibuffer_local_filename_completion_map)
+ : (NILP (Vminibuffer_completing_file_name)
+ || EQ (Vminibuffer_completing_file_name, Qlambda)
+ ? Vminibuffer_local_must_match_map
+ : Vminibuffer_local_must_match_filename_map),
init, prompt, make_number (pos), 0,
histvar, histpos, def, 0,
!NILP (inherit_input_method));
DEFUN ("test-completion", Ftest_completion, Stest_completion, 2, 3, 0,
doc: /* Return non-nil if STRING is a valid completion.
Takes the same arguments as `all-completions' and `try-completion'.
-If ALIST is a function, it is called with three arguments:
+If COLLECTION is a function, it is called with three arguments:
the values STRING, PREDICATE and `lambda'. */)
- (string, alist, predicate)
- Lisp_Object string, alist, predicate;
+ (string, collection, predicate)
+ Lisp_Object string, collection, predicate;
{
Lisp_Object regexps, tail, tem = Qnil;
int i = 0;
CHECK_STRING (string);
- if ((CONSP (alist) && (!SYMBOLP (XCAR (alist)) || NILP (XCAR (alist))))
- || NILP (alist))
+ if ((CONSP (collection)
+ && (!SYMBOLP (XCAR (collection)) || NILP (XCAR (collection))))
+ || NILP (collection))
{
- tem = Fassoc_string (string, alist, completion_ignore_case ? Qt : Qnil);
- if NILP (tem)
+ tem = Fassoc_string (string, collection, completion_ignore_case ? Qt : Qnil);
+ if (NILP (tem))
return Qnil;
}
- else if (VECTORP (alist))
+ else if (VECTORP (collection))
{
/* Bypass intern-soft as that loses for nil. */
- tem = oblookup (alist,
+ tem = oblookup (collection,
SDATA (string),
SCHARS (string),
SBYTES (string));
else
string = Fstring_make_multibyte (string);
- tem = oblookup (alist,
+ tem = oblookup (collection,
SDATA (string),
SCHARS (string),
SBYTES (string));
if (completion_ignore_case && !SYMBOLP (tem))
{
- for (i = XVECTOR (alist)->size - 1; i >= 0; i--)
+ for (i = XVECTOR (collection)->size - 1; i >= 0; i--)
{
- tail = XVECTOR (alist)->contents[i];
+ tail = XVECTOR (collection)->contents[i];
if (SYMBOLP (tail))
while (1)
{
if (!SYMBOLP (tem))
return Qnil;
}
- else if (HASH_TABLE_P (alist))
+ else if (HASH_TABLE_P (collection))
{
- struct Lisp_Hash_Table *h = XHASH_TABLE (alist);
+ struct Lisp_Hash_Table *h = XHASH_TABLE (collection);
i = hash_lookup (h, string, NULL);
if (i >= 0)
tem = HASH_KEY (h, i);
return Qnil;
}
else
- return call3 (alist, string, predicate, Qlambda);
+ return call3 (collection, string, predicate, Qlambda);
/* Reject this element if it fails to match all the regexps. */
- {
- int count = SPECPDL_INDEX ();
- specbind (Qcase_fold_search, completion_ignore_case ? Qt : Qnil);
- for (regexps = Vcompletion_regexp_list; CONSP (regexps);
- regexps = XCDR (regexps))
- {
- if (NILP (Fstring_match (XCAR (regexps),
- SYMBOLP (tem) ? string : tem,
- Qnil)))
- return unbind_to (count, Qnil);
- }
- unbind_to (count, Qnil);
- }
+ if (CONSP (Vcompletion_regexp_list))
+ {
+ int count = SPECPDL_INDEX ();
+ specbind (Qcase_fold_search, completion_ignore_case ? Qt : Qnil);
+ for (regexps = Vcompletion_regexp_list; CONSP (regexps);
+ regexps = XCDR (regexps))
+ {
+ if (NILP (Fstring_match (XCAR (regexps),
+ SYMBOLP (tem) ? string : tem,
+ Qnil)))
+ return unbind_to (count, Qnil);
+ }
+ unbind_to (count, Qnil);
+ }
/* Finally, check the predicate. */
if (!NILP (predicate))
{
- return HASH_TABLE_P (alist)
- ? call2 (predicate, tem, HASH_VALUE (XHASH_TABLE (alist), i))
+ return HASH_TABLE_P (collection)
+ ? call2 (predicate, tem, HASH_VALUE (XHASH_TABLE (collection), i))
: call1 (predicate, tem);
}
else
return Qt;
}
+DEFUN ("internal-complete-buffer", Finternal_complete_buffer, Sinternal_complete_buffer, 3, 3, 0,
+ doc: /* Perform completion on buffer names.
+If the argument FLAG is nil, invoke `try-completion', if it's t, invoke
+`all-completions', otherwise invoke `test-completion'.
+
+The arguments STRING and PREDICATE are as in `try-completion',
+`all-completions', and `test-completion'. */)
+ (string, predicate, flag)
+ Lisp_Object string, predicate, flag;
+{
+ if (NILP (flag))
+ return Ftry_completion (string, Vbuffer_alist, predicate);
+ else if (EQ (flag, Qt))
+ return Fall_completions (string, Vbuffer_alist, predicate, Qt);
+ else /* assume `lambda' */
+ return Ftest_completion (string, Vbuffer_alist, predicate);
+}
+
/* returns:
* 0 no possible completion
* 1 was already an exact and unique completion
Lisp_Object last;
struct gcpro gcpro1, gcpro2;
- completion = Ftry_completion (minibuffer_completion_contents (),
+ completion = Ftry_completion (Fminibuffer_completion_contents (),
Vminibuffer_completion_table,
Vminibuffer_completion_predicate);
last = last_exact_completion;
return 1;
}
- string = minibuffer_completion_contents ();
+ string = Fminibuffer_completion_contents ();
/* COMPLETEDP should be true if some completion was done, which
doesn't include simply changing the case of the entered string.
last_exact_completion = completion;
if (!NILP (last))
{
- tem = minibuffer_completion_contents ();
+ tem = Fminibuffer_completion_contents ();
if (!NILP (Fequal (tem, last)))
Fminibuffer_completion_help ();
}
/* Like assoc but assumes KEY is a string, and ignores case if appropriate. */
DEFUN ("assoc-string", Fassoc_string, Sassoc_string, 2, 3, 0,
- doc: /* Like `assoc' but specifically for strings.
-Unibyte strings are converted to multibyte for comparison.
-And case is ignored if CASE-FOLD is non-nil.
+ doc: /* Like `assoc' but specifically for strings (and symbols).
+Symbols are converted to strings, and unibyte strings are converted to
+multibyte for comparison.
+Case is ignored if optional arg CASE-FOLD is non-nil.
As opposed to `assoc', it will also match an entry consisting of a single
string rather than a cons cell whose car is a string. */)
(key, list, case_fold)
{
register Lisp_Object tail;
+ if (SYMBOLP (key))
+ key = Fsymbol_name (key);
+
for (tail = list; !NILP (tail); tail = Fcdr (tail))
{
register Lisp_Object elt, tem, thiscar;
elt = Fcar (tail);
thiscar = CONSP (elt) ? XCAR (elt) : elt;
- if (!STRINGP (thiscar))
+ if (SYMBOLP (thiscar))
+ thiscar = Fsymbol_name (thiscar);
+ else if (!STRINGP (thiscar))
continue;
tem = Fcompare_strings (thiscar, make_number (0), Qnil,
key, make_number (0), Qnil,
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.
()
{
register int i;
- Lisp_Object val;
+ Lisp_Object val, tem;
/* Allow user to specify null string */
if (XINT (Fminibuffer_prompt_end ()) == ZV)
goto exit;
- if (!NILP (Ftest_completion (Fminibuffer_contents (),
+ val = Fminibuffer_contents ();
+ tem = Ftest_completion (val,
+ Vminibuffer_completion_table,
+ Vminibuffer_completion_predicate);
+ if (!NILP (tem))
+ {
+ if (completion_ignore_case)
+ { /* Fixup case of the field, if necessary. */
+ Lisp_Object compl
+ = Ftry_completion (val,
Vminibuffer_completion_table,
- Vminibuffer_completion_predicate)))
- goto exit;
+ Vminibuffer_completion_predicate);
+ if (STRINGP (compl)
+ /* If it weren't for this piece of paranoia, I'd replace
+ the whole thing with a call to do_completion. */
+ && EQ (Flength (val), Flength (compl)))
+ {
+ del_range (XINT (Fminibuffer_prompt_end ()), ZV);
+ Finsert (1, &compl);
+ }
+ }
+ goto exit;
+ }
/* Call do_completion, but ignore errors. */
SET_PT (ZV);
return Qnil;
}
exit:
- return Fthrow (Qexit, Qnil);
+ return Fexit_minibuffer ();
/* NOTREACHED */
}
{
Lisp_Object completion, tem, tem1;
register int i, i_byte;
- register const unsigned char *completion_string;
struct gcpro gcpro1, gcpro2;
int prompt_end_charpos = XINT (Fminibuffer_prompt_end ());
/* We keep calling Fbuffer_string rather than arrange for GC to
hold onto a pointer to one of the strings thus made. */
- completion = Ftry_completion (minibuffer_completion_contents (),
+ completion = Ftry_completion (Fminibuffer_completion_contents (),
Vminibuffer_completion_table,
Vminibuffer_completion_predicate);
if (NILP (completion))
int buffer_nchars, completion_nchars;
CHECK_STRING (completion);
- tem = minibuffer_completion_contents ();
+ tem = Fminibuffer_completion_contents ();
GCPRO2 (completion, tem);
/* If reading a file name,
expand any $ENVVAR refs in the buffer and in TEM. */
if (i == SCHARS (completion))
{
GCPRO1 (completion);
- tem = Ftry_completion (concat2 (minibuffer_completion_contents (),
+ tem = Ftry_completion (concat2 (Fminibuffer_completion_contents (),
build_string (" ")),
Vminibuffer_completion_table,
Vminibuffer_completion_predicate);
{
GCPRO1 (completion);
tem =
- Ftry_completion (concat2 (minibuffer_completion_contents (),
+ Ftry_completion (concat2 (Fminibuffer_completion_contents (),
build_string ("-")),
Vminibuffer_completion_table,
Vminibuffer_completion_predicate);
{
int len, c;
int bytes = SBYTES (completion);
- completion_string = SDATA (completion);
+ register const unsigned char *completion_string = SDATA (completion);
for (; i_byte < SBYTES (completion); i_byte += len, i++)
{
c = STRING_CHAR_AND_LENGTH (completion_string + i_byte,
}
\f
DEFUN ("display-completion-list", Fdisplay_completion_list, Sdisplay_completion_list,
- 1, 1, 0,
+ 1, 2, 0,
doc: /* Display the list of completions, COMPLETIONS, using `standard-output'.
Each element may be just a symbol or string
or may be a list of two strings to be printed as if concatenated.
The actual completion alternatives, as inserted, are given `mouse-face'
properties of `highlight'.
At the end, this runs the normal hook `completion-setup-hook'.
-It can find the completion buffer in `standard-output'. */)
- (completions)
+It can find the completion buffer in `standard-output'.
+The optional second arg COMMON-SUBSTRING is a string.
+It is used to put faces, `completions-first-difference' and
+`completions-common-part' on the completion buffer. The
+`completions-common-part' face is put on the common substring
+specified by COMMON-SUBSTRING. If COMMON-SUBSTRING is nil
+and the current buffer is not the minibuffer, the faces are not put.
+Internally, COMMON-SUBSTRING is bound to `completion-common-substring'
+during running `completion-setup-hook'. */)
+ (completions, common_substring)
Lisp_Object completions;
+ Lisp_Object common_substring;
{
Lisp_Object tail, elt;
register int i;
int column = 0;
- struct gcpro gcpro1, gcpro2;
+ struct gcpro gcpro1, gcpro2, gcpro3;
struct buffer *old = current_buffer;
int first = 1;
except for ELT. ELT can be pointing to a string
when terpri or Findent_to calls a change hook. */
elt = Qnil;
- GCPRO2 (completions, elt);
+ GCPRO3 (completions, elt, common_substring);
if (BUFFERP (Vstandard_output))
set_buffer_internal (XBUFFER (Vstandard_output));
else
{
write_string ("Possible completions are:", -1);
- for (tail = completions, i = 0; !NILP (tail); tail = Fcdr (tail), i++)
+ for (tail = completions, i = 0; CONSP (tail); tail = XCDR (tail), i++)
{
Lisp_Object tem, string;
int length;
startpos = Qnil;
- elt = Fcar (tail);
+ elt = XCAR (tail);
if (SYMBOLP (elt))
elt = SYMBOL_NAME (elt);
/* Compute the length of this element. */
}
}
- UNGCPRO;
-
if (BUFFERP (Vstandard_output))
set_buffer_internal (old);
if (!NILP (Vrun_hooks))
- call1 (Vrun_hooks, intern ("completion-setup-hook"));
+ {
+ int count1 = SPECPDL_INDEX ();
+
+ specbind (intern ("completion-common-substring"), common_substring);
+ call1 (Vrun_hooks, intern ("completion-setup-hook"));
+
+ unbind_to (count1, Qnil);
+ }
+
+ UNGCPRO;
return Qnil;
}
+
+static Lisp_Object
+display_completion_list_1 (list)
+ Lisp_Object list;
+{
+ return Fdisplay_completion_list (list, Qnil);
+}
+
DEFUN ("minibuffer-completion-help", Fminibuffer_completion_help, Sminibuffer_completion_help,
0, 0, "",
doc: /* Display a list of possible completions of the current minibuffer contents. */)
Lisp_Object completions;
message ("Making completion list...");
- completions = Fall_completions (minibuffer_completion_contents (),
+ completions = Fall_completions (Fminibuffer_completion_contents (),
Vminibuffer_completion_table,
Vminibuffer_completion_predicate,
Qt);
temp_echo_area_glyphs (build_string (" [No completions]"));
}
else
- internal_with_output_to_temp_buffer ("*Completions*",
- Fdisplay_completion_list,
- Fsort (completions, Qstring_lessp));
+ {
+ /* Sort and remove duplicates. */
+ Lisp_Object tmp = completions = Fsort (completions, Qstring_lessp);
+ while (CONSP (tmp))
+ {
+ if (CONSP (XCDR (tmp))
+ && !NILP (Fequal (XCAR (tmp), XCAR (XCDR (tmp)))))
+ XSETCDR (tmp, XCDR (XCDR (tmp)));
+ else
+ tmp = XCDR (tmp);
+ }
+ internal_with_output_to_temp_buffer ("*Completions*",
+ display_completion_list_1,
+ completions);
+ }
return Qnil;
}
\f
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,
that has no possible completions, and other quick, unobtrusive
messages. */
+extern Lisp_Object Vminibuffer_message_timeout;
+
void
temp_echo_area_glyphs (string)
Lisp_Object string;
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);
+
+ if (NUMBERP (Vminibuffer_message_timeout))
+ sit_for (Vminibuffer_message_timeout, 0, 2);
+ else
+ sit_for (Qt, 0, 2);
+
del_range_both (osize, osize_byte, ZV, ZV_BYTE, 1);
SET_PT_BOTH (opoint, opoint_byte);
if (!NILP (Vquit_flag))
DEFUN ("minibuffer-message", Fminibuffer_message, Sminibuffer_message,
1, 1, 0,
doc: /* Temporarily display STRING at the end of the minibuffer.
-The text is displayed for two seconds,
+The text is displayed for a period controlled by `minibuffer-message-timeout',
or until the next input event arrives, whichever comes first. */)
(string)
Lisp_Object string;
Qcase_fold_search = intern ("case-fold-search");
staticpro (&Qcase_fold_search);
+ Qread_expression_history = intern ("read-expression-history");
+ staticpro (&Qread_expression_history);
+
DEFVAR_LISP ("read-buffer-function", &Vread_buffer_function,
doc: /* If this is non-nil, `read-buffer' does its work by calling this function. */);
Vread_buffer_function = Qnil;
DEFVAR_LISP ("history-length", &Vhistory_length,
doc: /* *Maximum length for history lists before truncation takes place.
A number means that length; t means infinite. Truncation takes place
-just after a new element is inserted. Setting the history-length
+just after a new element is inserted. Setting the `history-length'
property of a history variable overrides this default. */);
XSETFASTINT (Vhistory_length, 30);
+ DEFVAR_BOOL ("history-delete-duplicates", &history_delete_duplicates,
+ doc: /* *Non-nil means to delete duplicates in history.
+If set to t when adding a new history element, all previous identical
+elements are deleted from the history list. */);
+ history_delete_duplicates = 0;
+
+ DEFVAR_LISP ("history-add-new-input", &Vhistory_add_new_input,
+ doc: /* *Non-nil means to add new elements in history.
+If set to nil, minibuffer reading functions don't add new elements to the
+history list, so it is possible to do this afterwards by calling
+`add-to-history' explicitly. */);
+ Vhistory_add_new_input = Qt;
+
DEFVAR_LISP ("completion-auto-help", &Vcompletion_auto_help,
- doc: /* *Non-nil means automatically provide help for invalid completion input. */);
+ doc: /* *Non-nil means automatically provide help for invalid completion input.
+Under Partial Completion mode, a non-nil, non-t value has a special meaning;
+see the doc string of `partial-completion-mode' for more details. */);
Vcompletion_auto_help = Qt;
DEFVAR_BOOL ("completion-ignore-case", &completion_ignore_case,
- doc: /* Non-nil means don't consider case significant in completion. */);
+ doc: /* Non-nil means don't consider case significant in completion.
+
+For file-name completion, the variable `read-file-name-completion-ignore-case'
+controls the behavior, rather than this variable. */);
completion_ignore_case = 0;
DEFVAR_BOOL ("enable-recursive-minibuffers", &enable_recursive_minibuffers,
STRING, the current buffer contents;
PREDICATE, the predicate for filtering possible matches;
CODE, which says what kind of things to do.
-CODE can be nil, t or `lambda'.
-nil means to return the best completion of STRING, or nil if there is none.
-t means to return a list of all possible completions of STRING.
-`lambda' means to return t if STRING is a valid completion as it stands. */);
+CODE can be nil, t or `lambda':
+ nil -- return the best completion of STRING, or nil if there is none.
+ t -- return a list of all possible completions of STRING.
+ lambda -- return t if STRING is a valid completion as it stands. */);
Vminibuffer_completion_table = Qnil;
DEFVAR_LISP ("minibuffer-completion-predicate", &Vminibuffer_completion_predicate,
DEFVAR_LISP ("minibuffer-completing-file-name",
&Vminibuffer_completing_file_name,
- doc: /* Non-nil means completing file names. */);
+ doc: /* Non-nil and non-`lambda' means completing file names. */);
Vminibuffer_completing_file_name = Qnil;
DEFVAR_LISP ("minibuffer-help-form", &Vminibuffer_help_form,
Vminibuffer_prompt_properties
= Fcons (intern ("read-only"), Fcons (Qt, Qnil));
+ DEFVAR_LISP ("read-expression-map", &Vread_expression_map,
+ doc: /* Minibuffer keymap used for reading Lisp expressions. */);
+ Vread_expression_map = Qnil;
+
defsubr (&Sset_minibuffer_window);
defsubr (&Sread_from_minibuffer);
defsubr (&Seval_minibuffer);
defsubr (&Sread_string);
defsubr (&Sread_command);
defsubr (&Sread_variable);
+ defsubr (&Sinternal_complete_buffer);
defsubr (&Sread_buffer);
defsubr (&Sread_no_blanks_input);
defsubr (&Sminibuffer_depth);
defsubr (&Sminibuffer_prompt_end);
defsubr (&Sminibuffer_contents);
defsubr (&Sminibuffer_contents_no_properties);
+ defsubr (&Sminibuffer_completion_contents);
defsubr (&Sdelete_minibuffer_contents);
defsubr (&Stry_completion);
initial_define_key (Vminibuffer_local_completion_map, '?',
"minibuffer-completion-help");
+ Fdefine_key (Vminibuffer_local_filename_completion_map,
+ build_string (" "), Qnil);
+
initial_define_key (Vminibuffer_local_must_match_map, Ctl ('m'),
"minibuffer-complete-and-exit");
initial_define_key (Vminibuffer_local_must_match_map, Ctl ('j'),
"minibuffer-complete-and-exit");
+
+ Fdefine_key (Vminibuffer_local_must_match_filename_map,
+ build_string (" "), Qnil);
}
/* arch-tag: 8f69b601-fba3-484c-a6dd-ceaee54a7a73