(rmail-mode-map): Key binding for rmail-sort-by-keywords.
[bpt/emacs.git] / src / minibuf.c
CommitLineData
f927c5ae 1/* Minibuffer input and completion.
c6c5df7f 2 Copyright (C) 1985, 1986, 1993 Free Software Foundation, Inc.
f927c5ae
JB
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
ffd56f97 8the Free Software Foundation; either version 2, or (at your option)
f927c5ae
JB
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
18160b98 21#include <config.h>
f927c5ae
JB
22#include "lisp.h"
23#include "commands.h"
24#include "buffer.h"
25#include "dispextern.h"
ff11dfa1 26#include "frame.h"
f927c5ae
JB
27#include "window.h"
28#include "syntax.h"
29
30#define min(a, b) ((a) < (b) ? (a) : (b))
31
a4e71d81
KH
32extern int quit_char;
33
f927c5ae
JB
34/* List of buffers for use as minibuffers.
35 The first element of the list is used for the outermost minibuffer invocation,
36 the next element is used for a recursive minibuffer invocation, etc.
37 The list is extended at the end as deeped minibuffer recursions are encountered. */
38Lisp_Object Vminibuffer_list;
39
40struct minibuf_save_data
41 {
42 char *prompt;
43 int prompt_width;
44 Lisp_Object help_form;
45 Lisp_Object current_prefix_arg;
770970cb
RS
46 Lisp_Object history_position;
47 Lisp_Object history_variable;
f927c5ae
JB
48 };
49
50int minibuf_save_vector_size;
51struct minibuf_save_data *minibuf_save_vector;
52
53/* Depth in minibuffer invocations. */
54int minibuf_level;
55
56/* Nonzero means display completion help for invalid input */
57int auto_help;
58
b278606c 59/* Fread_minibuffer leaves the input here as a string. */
f927c5ae
JB
60Lisp_Object last_minibuf_string;
61
62/* Nonzero means let functions called when within a minibuffer
63 invoke recursive minibuffers (to read arguments, or whatever) */
64int enable_recursive_minibuffers;
65
66/* help-form is bound to this while in the minibuffer. */
67
68Lisp_Object Vminibuffer_help_form;
69
770970cb
RS
70/* Variable which is the history list to add minibuffer values to. */
71
72Lisp_Object Vminibuffer_history_variable;
73
74/* Current position in the history list (adjusted by M-n and M-p). */
75
76Lisp_Object Vminibuffer_history_position;
77
78Lisp_Object Qminibuffer_history;
79
719b4a40
RS
80Lisp_Object Qread_file_name_internal;
81
5c781212
RS
82/* Normal hook for entry to minibuffer. */
83
84Lisp_Object Qminibuffer_setup_hook, Vminibuffer_setup_hook;
85
f927c5ae
JB
86/* Nonzero means completion ignores case. */
87
88int completion_ignore_case;
89
42006772
RS
90/* List of regexps that should restrict possible completions. */
91
92Lisp_Object Vcompletion_regexp_list;
93
6a9ee000
RS
94/* Nonzero means raise the minibuffer frame when the minibuffer
95 is entered. */
96
97int minibuffer_auto_raise;
98
f927c5ae
JB
99/* If last completion attempt reported "Complete but not unique"
100 then this is the string completed then; otherwise this is nil. */
101
102static Lisp_Object last_exact_completion;
103
104Lisp_Object Quser_variable_p;
2cb6da5c
RS
105
106/* Non-nil means it is the window for C-M-v to scroll
107 when the minibuffer is selected. */
108extern Lisp_Object Vminibuf_scroll_window;
f927c5ae
JB
109\f
110/* Actual minibuffer invocation. */
111
112void read_minibuf_unwind ();
113Lisp_Object get_minibuffer ();
114Lisp_Object read_minibuf ();
115
770970cb 116/* Read from the minibuffer using keymap MAP, initial contents INITIAL
85b5fe07 117 (a string), putting point minus BACKUP_N chars from the end of INITIAL,
770970cb 118 prompting with PROMPT (a string), using history list HISTVAR
85b5fe07 119 with initial position HISTPOS. (BACKUP_N should be <= 0.)
770970cb
RS
120
121 Normally return the result as a string (the text that was read),
b278606c
BF
122 but if EXPFLAG is non-nil, read it and return the object read.
123 If HISTVAR is given, save the value read on that history only if it doesn't
124 match the front of that history list exactly. The value is pushed onto
125 the list as the string that was read, or as the object that resulted iff
126 EXPFLAG is non-nil. */
770970cb 127
f927c5ae 128Lisp_Object
770970cb 129read_minibuf (map, initial, prompt, backup_n, expflag, histvar, histpos)
f927c5ae
JB
130 Lisp_Object map;
131 Lisp_Object initial;
132 Lisp_Object prompt;
5061d9c3 133 Lisp_Object backup_n;
f927c5ae 134 int expflag;
770970cb
RS
135 Lisp_Object histvar;
136 Lisp_Object histpos;
f927c5ae
JB
137{
138 register Lisp_Object val;
139 int count = specpdl_ptr - specpdl;
5061d9c3 140 Lisp_Object mini_frame;
f927c5ae 141 struct gcpro gcpro1, gcpro2;
f927c5ae
JB
142
143 if (XTYPE (prompt) != Lisp_String)
144 prompt = build_string ("");
145
146 /* Emacs in -batch mode calls minibuffer: print the prompt. */
147 if (noninteractive && XTYPE (prompt) == Lisp_String)
148 printf ("%s", XSTRING (prompt)->data);
149
150 if (!enable_recursive_minibuffers
151 && minibuf_level > 0
152 && (EQ (selected_window, minibuf_window)))
153#if 0
ff11dfa1 154 || selected_frame != XFRAME (WINDOW_FRAME (XWINDOW (minibuf_window)))
f927c5ae
JB
155#endif
156 error ("Command attempted to use minibuffer while in minibuffer");
157
158 if (minibuf_level == minibuf_save_vector_size)
159 minibuf_save_vector =
160 (struct minibuf_save_data *)
161 xrealloc (minibuf_save_vector,
162 (minibuf_save_vector_size *= 2)
163 * sizeof (struct minibuf_save_data));
164 minibuf_save_vector[minibuf_level].prompt = minibuf_prompt;
165 minibuf_save_vector[minibuf_level].prompt_width = minibuf_prompt_width;
166 minibuf_prompt_width = 0;
167 /* >> Why is this done this way rather than binding these variables? */
168 minibuf_save_vector[minibuf_level].help_form = Vhelp_form;
169 minibuf_save_vector[minibuf_level].current_prefix_arg = Vcurrent_prefix_arg;
770970cb
RS
170 minibuf_save_vector[minibuf_level].history_position = Vminibuffer_history_position;
171 minibuf_save_vector[minibuf_level].history_variable = Vminibuffer_history_variable;
f927c5ae
JB
172 GCPRO2 (minibuf_save_vector[minibuf_level].help_form,
173 minibuf_save_vector[minibuf_level].current_prefix_arg);
174
175 record_unwind_protect (Fset_window_configuration,
b2b2c677
JB
176 Fcurrent_window_configuration (Qnil));
177
ff11dfa1
JB
178 /* If the minibuffer window is on a different frame, save that
179 frame's configuration too. */
5061d9c3
RS
180#ifdef MULTI_FRAME
181 XSET (mini_frame, Lisp_Frame, WINDOW_FRAME (XWINDOW (minibuf_window)));
ff11dfa1 182 if (XFRAME (mini_frame) != selected_frame)
5061d9c3
RS
183 record_unwind_protect (Fset_window_configuration,
184 Fcurrent_window_configuration (mini_frame));
5563e8e8
KH
185
186 /* If the minibuffer is on an iconified or invisible frame,
187 make it visible now. */
188 Fmake_frame_visible (mini_frame);
189
6a9ee000
RS
190 if (minibuffer_auto_raise)
191 Fraise_frame (mini_frame);
5061d9c3 192#endif
f927c5ae
JB
193
194 val = current_buffer->directory;
195 Fset_buffer (get_minibuffer (minibuf_level));
64a3a3c0
JB
196
197 /* The current buffer's default directory is usually the right thing
198 for our minibuffer here. However, if you're typing a command at
199 a minibuffer-only frame when minibuf_level is zero, then buf IS
200 the current_buffer, so reset_buffer leaves buf's default
201 directory unchanged. This is a bummer when you've just started
202 up Emacs and buf's default directory is Qnil. Here's a hack; can
203 you think of something better to do? Find another buffer with a
204 better directory, and use that one instead. */
205 if (XTYPE (val) == Lisp_String)
206 current_buffer->directory = val;
207 else
208 {
209 Lisp_Object buf_list;
210
211 for (buf_list = Vbuffer_alist;
212 CONSP (buf_list);
213 buf_list = XCONS (buf_list)->cdr)
214 {
1e62748e 215 Lisp_Object other_buf;
64a3a3c0 216
1e62748e 217 other_buf = XCONS (XCONS (buf_list)->car)->cdr;
64a3a3c0
JB
218 if (XTYPE (XBUFFER (other_buf)->directory) == Lisp_String)
219 {
220 current_buffer->directory = XBUFFER (other_buf)->directory;
221 break;
222 }
223 }
224 }
225
33b1baf6 226#ifdef MULTI_FRAME
0abbff13
KH
227 if (XFRAME (mini_frame) != selected_frame)
228 Fredirect_frame_focus (Fselected_frame (), mini_frame);
33b1baf6 229#endif
f927c5ae
JB
230 Fmake_local_variable (Qprint_escape_newlines);
231 print_escape_newlines = 1;
232
43bad991 233 record_unwind_protect (read_minibuf_unwind, Qnil);
43bad991 234
f927c5ae
JB
235 Vminibuf_scroll_window = selected_window;
236 Fset_window_buffer (minibuf_window, Fcurrent_buffer ());
f927c5ae
JB
237 Fselect_window (minibuf_window);
238 XFASTINT (XWINDOW (minibuf_window)->hscroll) = 0;
239
240 Ferase_buffer ();
241 minibuf_level++;
f927c5ae 242
56a98455 243 if (!NILP (initial))
f927c5ae
JB
244 {
245 Finsert (1, &initial);
56a98455 246 if (!NILP (backup_n) && XTYPE (backup_n) == Lisp_Int)
f927c5ae
JB
247 Fforward_char (backup_n);
248 }
249
250 minibuf_prompt = (char *) alloca (XSTRING (prompt)->size + 1);
251 bcopy (XSTRING (prompt)->data, minibuf_prompt, XSTRING (prompt)->size + 1);
252 echo_area_glyphs = 0;
253
254 Vhelp_form = Vminibuffer_help_form;
255 current_buffer->keymap = map;
770970cb
RS
256 Vminibuffer_history_position = histpos;
257 Vminibuffer_history_variable = histvar;
f927c5ae 258
5c781212
RS
259 /* Run our hook, but not if it is empty.
260 (run-hooks would do nothing if it is empty,
261 but it's important to save time here in the usual case. */
92d3b06e
RS
262 if (!NILP (Vminibuffer_setup_hook) && !EQ (Vminibuffer_setup_hook, Qunbound)
263 && !NILP (Vrun_hooks))
5c781212
RS
264 call1 (Vrun_hooks, Qminibuffer_setup_hook);
265
f927c5ae
JB
266/* ??? MCC did redraw_screen here if switching screens. */
267 recursive_edit_1 ();
268
269 /* If cursor is on the minibuffer line,
270 show the user we have exited by putting it in column 0. */
ff11dfa1 271 if ((FRAME_CURSOR_Y (selected_frame)
f927c5ae
JB
272 >= XFASTINT (XWINDOW (minibuf_window)->top))
273 && !noninteractive)
274 {
ff11dfa1
JB
275 FRAME_CURSOR_X (selected_frame) = 0;
276 update_frame (selected_frame, 1, 1);
f927c5ae
JB
277 }
278
279 /* Make minibuffer contents into a string */
ffd56f97 280 val = make_buffer_string (1, Z);
f927c5ae 281 bcopy (GAP_END_ADDR, XSTRING (val)->data + GPT - BEG, Z - GPT);
770970cb 282
b278606c
BF
283 /* VAL is the string of minibuffer text. */
284 last_minibuf_string = val;
285
770970cb
RS
286 /* Add the value to the appropriate history list. */
287 if (XTYPE (Vminibuffer_history_variable) == Lisp_Symbol
b278606c
BF
288 && ! EQ (XSYMBOL (Vminibuffer_history_variable)->value, Qunbound))
289 {
290 /* If the caller wanted to save the value read on a history list,
60b73b25
RS
291 then do so if the value is not already the front of the list. */
292 Lisp_Object histval;
293 histval = Fsymbol_value (Vminibuffer_history_variable);
b278606c
BF
294
295 /* The value of the history variable must be a cons or nil. Other
60b73b25 296 values are unacceptable. We silently ignore these values. */
b278606c 297 if (NILP (histval)
60b73b25
RS
298 || (CONSP (histval)
299 && NILP (Fequal (last_minibuf_string, Fcar (histval)))))
300 Fset (Vminibuffer_history_variable,
301 Fcons (last_minibuf_string, histval));
b278606c 302 }
770970cb 303
60b73b25
RS
304 /* If Lisp form desired instead of string, parse it. */
305 if (expflag)
8acd16de
KH
306 {
307 Lisp_Object expr_and_pos;
308 unsigned char *p;
309
310 expr_and_pos = Fread_from_string (val, Qnil, Qnil);
311 /* Ignore trailing whitespace; any other trailing junk is an error. */
312 for (p = XSTRING (val)->data + XINT (Fcdr (expr_and_pos)); *p; p++)
313 if (*p != ' ' && *p != '\t' && *p != '\n')
314 error ("Trailing garbage following expression");
315 val = Fcar (expr_and_pos);
316 }
60b73b25 317
f927c5ae 318 UNGCPRO;
2cb6da5c
RS
319 return unbind_to (count, val); /* The appropriate frame will get selected
320 in set-window-configuration. */
f927c5ae
JB
321}
322
323/* Return a buffer to be used as the minibuffer at depth `depth'.
324 depth = 0 is the lowest allowed argument, and that is the value
325 used for nonrecursive minibuffer invocations */
326
327Lisp_Object
328get_minibuffer (depth)
329 int depth;
330{
331 Lisp_Object tail, num, buf;
9f6c23bc 332 char name[24];
f927c5ae
JB
333 extern Lisp_Object nconc2 ();
334
335 XFASTINT (num) = depth;
336 tail = Fnthcdr (num, Vminibuffer_list);
56a98455 337 if (NILP (tail))
f927c5ae
JB
338 {
339 tail = Fcons (Qnil, Qnil);
340 Vminibuffer_list = nconc2 (Vminibuffer_list, tail);
341 }
342 buf = Fcar (tail);
56a98455 343 if (NILP (buf) || NILP (XBUFFER (buf)->name))
f927c5ae
JB
344 {
345 sprintf (name, " *Minibuf-%d*", depth);
346 buf = Fget_buffer_create (build_string (name));
5d6533f1
JB
347
348 /* Although the buffer's name starts with a space, undo should be
349 enabled in it. */
350 Fbuffer_enable_undo (buf);
351
f927c5ae
JB
352 XCONS (tail)->car = buf;
353 }
354 else
355 reset_buffer (XBUFFER (buf));
64a3a3c0 356
f927c5ae
JB
357 return buf;
358}
359
360/* This function is called on exiting minibuffer, whether normally or not,
361 and it restores the current window, buffer, etc. */
362
363void
43bad991
JB
364read_minibuf_unwind (data)
365 Lisp_Object data;
f927c5ae
JB
366{
367 /* Erase the minibuffer we were using at this level. */
368 Fset_buffer (XWINDOW (minibuf_window)->buffer);
369
370 /* Prevent error in erase-buffer. */
371 current_buffer->read_only = Qnil;
372 Ferase_buffer ();
373
374 /* If this was a recursive minibuffer,
375 tie the minibuffer window back to the outer level minibuffer buffer */
376 minibuf_level--;
377 /* Make sure minibuffer window is erased, not ignored */
378 windows_or_buffers_changed++;
379 XFASTINT (XWINDOW (minibuf_window)->last_modified) = 0;
380
381 /* Restore prompt from outer minibuffer */
382 minibuf_prompt = minibuf_save_vector[minibuf_level].prompt;
383 minibuf_prompt_width = minibuf_save_vector[minibuf_level].prompt_width;
384 Vhelp_form = minibuf_save_vector[minibuf_level].help_form;
385 Vcurrent_prefix_arg = minibuf_save_vector[minibuf_level].current_prefix_arg;
770970cb
RS
386 Vminibuffer_history_position
387 = minibuf_save_vector[minibuf_level].history_position;
388 Vminibuffer_history_variable
389 = minibuf_save_vector[minibuf_level].history_variable;
f927c5ae
JB
390}
391\f
b9d721de
JB
392
393/* This comment supplies the doc string for read-from-minibuffer,
394 for make-docfile to see. We cannot put this in the real DEFUN
395 due to limits in the Unix cpp.
396
f927c5ae
JB
397DEFUN ("read-from-minibuffer", Fread_from_minibuffer, Sread_from_minibuffer, 1, 5, 0,
398 "Read a string from the minibuffer, prompting with string PROMPT.\n\
399If optional second arg INITIAL-CONTENTS is non-nil, it is a string\n\
400 to be inserted into the minibuffer before reading input.\n\
770970cb
RS
401 If INITIAL-CONTENTS is (STRING . POSITION), the initial input\n\
402 is STRING, but point is placed POSITION characters into the string.\n\
f927c5ae
JB
403Third arg KEYMAP is a keymap to use whilst reading;\n\
404 if omitted or nil, the default is `minibuffer-local-map'.\n\
405If fourth arg READ is non-nil, then interpret the result as a lisp object\n\
406 and return that object:\n\
407 in other words, do `(car (read-from-string INPUT-STRING))'\n\
770970cb
RS
408Fifth arg HIST, if non-nil, specifies a history list\n\
409 and optionally the initial position in the list.\n\
410 It can be a symbol, which is the history list variable to use,\n\
411 or it can be a cons cell (HISTVAR . HISTPOS).\n\
412 In that case, HISTVAR is the history list variable to use,\n\
413 and HISTPOS is the initial position (the position in the list\n\
414 which INITIAL-CONTENTS corresponds to).\n\
b9d721de
JB
415 Positions are counted starting from 1 at the beginning of the list."
416*/
417
418DEFUN ("read-from-minibuffer", Fread_from_minibuffer, Sread_from_minibuffer, 1, 5, 0,
419 0 /* See immediately above */)
68e5a8a2
RS
420 (prompt, initial_contents, keymap, read, hist)
421 Lisp_Object prompt, initial_contents, keymap, read, hist;
f927c5ae
JB
422{
423 int pos = 0;
770970cb
RS
424 Lisp_Object histvar, histpos, position;
425 position = Qnil;
f927c5ae
JB
426
427 CHECK_STRING (prompt, 0);
68e5a8a2 428 if (!NILP (initial_contents))
f927c5ae 429 {
68e5a8a2 430 if (XTYPE (initial_contents) == Lisp_Cons)
770970cb 431 {
68e5a8a2
RS
432 position = Fcdr (initial_contents);
433 initial_contents = Fcar (initial_contents);
770970cb 434 }
68e5a8a2 435 CHECK_STRING (initial_contents, 1);
56a98455 436 if (!NILP (position))
f927c5ae
JB
437 {
438 CHECK_NUMBER (position, 0);
439 /* Convert to distance from end of input. */
68e5a8a2 440 pos = XINT (position) - 1 - XSTRING (initial_contents)->size;
f927c5ae
JB
441 }
442 }
443
56a98455 444 if (NILP (keymap))
f927c5ae
JB
445 keymap = Vminibuffer_local_map;
446 else
447 keymap = get_keymap (keymap,2);
770970cb
RS
448
449 if (XTYPE (hist) == Lisp_Symbol)
450 {
451 histvar = hist;
452 histpos = Qnil;
453 }
454 else
455 {
456 histvar = Fcar_safe (hist);
457 histpos = Fcdr_safe (hist);
458 }
459 if (NILP (histvar))
460 histvar = Qminibuffer_history;
461 if (NILP (histpos))
462 XFASTINT (histpos) = 0;
463
68e5a8a2 464 return read_minibuf (keymap, initial_contents, prompt,
85b5fe07 465 make_number (pos), !NILP (read), histvar, histpos);
f927c5ae
JB
466}
467
468DEFUN ("read-minibuffer", Fread_minibuffer, Sread_minibuffer, 1, 2, 0,
469 "Return a Lisp object read using the minibuffer.\n\
470Prompt with PROMPT. If non-nil, optional second arg INITIAL-CONTENTS\n\
471is a string to insert in the minibuffer before reading.")
472 (prompt, initial_contents)
473 Lisp_Object prompt, initial_contents;
474{
475 CHECK_STRING (prompt, 0);
56a98455 476 if (!NILP (initial_contents))
a1b4b084 477 CHECK_STRING (initial_contents, 1);
770970cb
RS
478 return read_minibuf (Vminibuffer_local_map, initial_contents,
479 prompt, Qnil, 1, Qminibuffer_history, make_number (0));
f927c5ae
JB
480}
481
482DEFUN ("eval-minibuffer", Feval_minibuffer, Seval_minibuffer, 1, 2, 0,
483 "Return value of Lisp expression read using the minibuffer.\n\
484Prompt with PROMPT. If non-nil, optional second arg INITIAL-CONTENTS\n\
485is a string to insert in the minibuffer before reading.")
486 (prompt, initial_contents)
487 Lisp_Object prompt, initial_contents;
488{
489 return Feval (Fread_minibuffer (prompt, initial_contents));
490}
491
492/* Functions that use the minibuffer to read various things. */
493
494DEFUN ("read-string", Fread_string, Sread_string, 1, 2, 0,
495 "Read a string from the minibuffer, prompting with string PROMPT.\n\
496If non-nil second arg INITIAL-INPUT is a string to insert before reading.")
497 (prompt, initial_input)
498 Lisp_Object prompt, initial_input;
499{
500 return Fread_from_minibuffer (prompt, initial_input, Qnil, Qnil, Qnil);
501}
502
b278606c 503DEFUN ("read-no-blanks-input", Fread_no_blanks_input, Sread_no_blanks_input, 1, 2, 0,
f927c5ae
JB
504 "Args PROMPT and INIT, strings. Read a string from the terminal, not allowing blanks.\n\
505Prompt with PROMPT, and provide INIT as an initial value of the input string.")
506 (prompt, init)
507 Lisp_Object prompt, init;
508{
509 CHECK_STRING (prompt, 0);
56a98455 510 if (! NILP (init))
f927c5ae
JB
511 CHECK_STRING (init, 1);
512
770970cb
RS
513 return read_minibuf (Vminibuffer_local_ns_map, init, prompt, Qnil, 0,
514 Qminibuffer_history, make_number (0));
f927c5ae
JB
515}
516
517DEFUN ("read-command", Fread_command, Sread_command, 1, 1, 0,
518 "One arg PROMPT, a string. Read the name of a command and return as a symbol.\n\
519Prompts with PROMPT.")
520 (prompt)
521 Lisp_Object prompt;
522{
523 return Fintern (Fcompleting_read (prompt, Vobarray, Qcommandp, Qt, Qnil, Qnil),
524 Qnil);
525}
526
527#ifdef NOTDEF
528DEFUN ("read-function", Fread_function, Sread_function, 1, 1, 0,
529 "One arg PROMPT, a string. Read the name of a function and return as a symbol.\n\
530Prompts with PROMPT.")
531 (prompt)
532 Lisp_Object prompt;
533{
534 return Fintern (Fcompleting_read (prompt, Vobarray, Qfboundp, Qt, Qnil, Qnil),
535 Qnil);
536}
537#endif /* NOTDEF */
538
539DEFUN ("read-variable", Fread_variable, Sread_variable, 1, 1, 0,
540 "One arg PROMPT, a string. Read the name of a user variable and return\n\
541it as a symbol. Prompts with PROMPT.\n\
542A user variable is one whose documentation starts with a `*' character.")
543 (prompt)
544 Lisp_Object prompt;
545{
546 return Fintern (Fcompleting_read (prompt, Vobarray,
547 Quser_variable_p, Qt, Qnil, Qnil),
548 Qnil);
549}
550
551DEFUN ("read-buffer", Fread_buffer, Sread_buffer, 1, 3, 0,
552 "One arg PROMPT, a string. Read the name of a buffer and return as a string.\n\
553Prompts with PROMPT.\n\
554Optional second arg is value to return if user enters an empty line.\n\
555If optional third arg REQUIRE-MATCH is non-nil, only existing buffer names are allowed.")
556 (prompt, def, require_match)
557 Lisp_Object prompt, def, require_match;
558{
559 Lisp_Object tem;
560 Lisp_Object args[3];
561 struct gcpro gcpro1;
562
563 if (XTYPE (def) == Lisp_Buffer)
564 def = XBUFFER (def)->name;
56a98455 565 if (!NILP (def))
f927c5ae
JB
566 {
567 args[0] = build_string ("%s(default %s) ");
568 args[1] = prompt;
569 args[2] = def;
570 prompt = Fformat (3, args);
571 }
572 GCPRO1 (def);
573 tem = Fcompleting_read (prompt, Vbuffer_alist, Qnil, require_match, Qnil, Qnil);
574 UNGCPRO;
575 if (XSTRING (tem)->size)
576 return tem;
577 return def;
578}
579\f
580DEFUN ("try-completion", Ftry_completion, Stry_completion, 2, 3, 0,
581 "Return common substring of all completions of STRING in ALIST.\n\
582Each car of each element of ALIST is tested to see if it begins with STRING.\n\
583All that match are compared together; the longest initial sequence\n\
584common to all matches is returned as a string.\n\
585If there is no match at all, nil is returned.\n\
586For an exact match, t is returned.\n\
587\n\
588ALIST can be an obarray instead of an alist.\n\
589Then the print names of all symbols in the obarray are the possible matches.\n\
590\n\
591ALIST can also be a function to do the completion itself.\n\
592It receives three arguments: the values STRING, PREDICATE and nil.\n\
593Whatever it returns becomes the value of `try-completion'.\n\
594\n\
595If optional third argument PREDICATE is non-nil,\n\
596it is used to test each possible match.\n\
597The match is a candidate only if PREDICATE returns non-nil.\n\
598The argument given to PREDICATE is the alist element or the symbol from the obarray.")
599 (string, alist, pred)
600 Lisp_Object string, alist, pred;
601{
602 Lisp_Object bestmatch, tail, elt, eltstring;
603 int bestmatchsize;
604 int compare, matchsize;
56a98455 605 int list = CONSP (alist) || NILP (alist);
f927c5ae
JB
606 int index, obsize;
607 int matchcount = 0;
608 Lisp_Object bucket, zero, end, tem;
609 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
610
611 CHECK_STRING (string, 0);
612 if (!list && XTYPE (alist) != Lisp_Vector)
613 return call3 (alist, string, pred, Qnil);
614
615 bestmatch = Qnil;
616
617 /* If ALIST is not a list, set TAIL just for gc pro. */
618 tail = alist;
619 if (! list)
620 {
621 index = 0;
622 obsize = XVECTOR (alist)->size;
623 bucket = XVECTOR (alist)->contents[index];
624 }
625
626 while (1)
627 {
628 /* Get the next element of the alist or obarray. */
629 /* Exit the loop if the elements are all used up. */
630 /* elt gets the alist element or symbol.
631 eltstring gets the name to check as a completion. */
632
633 if (list)
634 {
56a98455 635 if (NILP (tail))
f927c5ae
JB
636 break;
637 elt = Fcar (tail);
638 eltstring = Fcar (elt);
639 tail = Fcdr (tail);
640 }
641 else
642 {
643 if (XFASTINT (bucket) != 0)
644 {
645 elt = bucket;
646 eltstring = Fsymbol_name (elt);
647 if (XSYMBOL (bucket)->next)
648 XSETSYMBOL (bucket, XSYMBOL (bucket)->next);
649 else
650 XFASTINT (bucket) = 0;
651 }
652 else if (++index >= obsize)
653 break;
654 else
655 {
656 bucket = XVECTOR (alist)->contents[index];
657 continue;
658 }
659 }
660
661 /* Is this element a possible completion? */
662
42006772
RS
663 if (XTYPE (eltstring) == Lisp_String
664 && XSTRING (string)->size <= XSTRING (eltstring)->size
665 && 0 > scmp (XSTRING (eltstring)->data, XSTRING (string)->data,
666 XSTRING (string)->size))
f927c5ae
JB
667 {
668 /* Yes. */
42006772
RS
669 Lisp_Object regexps;
670 Lisp_Object zero;
671 XFASTINT (zero) = 0;
672
673 /* Ignore this element if it fails to match all the regexps. */
674 for (regexps = Vcompletion_regexp_list; CONSP (regexps);
675 regexps = XCONS (regexps)->cdr)
676 {
677 tem = Fstring_match (XCONS (regexps)->car, eltstring, zero);
678 if (NILP (tem))
679 break;
680 }
681 if (CONSP (regexps))
682 continue;
683
f927c5ae
JB
684 /* Ignore this element if there is a predicate
685 and the predicate doesn't like it. */
686
56a98455 687 if (!NILP (pred))
f927c5ae
JB
688 {
689 if (EQ (pred, Qcommandp))
690 tem = Fcommandp (elt);
691 else
692 {
693 GCPRO4 (tail, string, eltstring, bestmatch);
694 tem = call1 (pred, elt);
695 UNGCPRO;
696 }
56a98455 697 if (NILP (tem)) continue;
f927c5ae
JB
698 }
699
700 /* Update computation of how much all possible completions match */
701
702 matchcount++;
56a98455 703 if (NILP (bestmatch))
f927c5ae
JB
704 bestmatch = eltstring, bestmatchsize = XSTRING (eltstring)->size;
705 else
706 {
707 compare = min (bestmatchsize, XSTRING (eltstring)->size);
708 matchsize = scmp (XSTRING (bestmatch)->data,
709 XSTRING (eltstring)->data,
710 compare);
52b14ac0
JB
711 if (matchsize < 0)
712 matchsize = compare;
713 if (completion_ignore_case)
714 {
715 /* If this is an exact match except for case,
716 use it as the best match rather than one that is not an
717 exact match. This way, we get the case pattern
718 of the actual match. */
719 if ((matchsize == XSTRING (eltstring)->size
720 && matchsize < XSTRING (bestmatch)->size)
721 ||
722 /* If there is more than one exact match ignoring case,
723 and one of them is exact including case,
724 prefer that one. */
725 /* If there is no exact match ignoring case,
726 prefer a match that does not change the case
727 of the input. */
728 ((matchsize == XSTRING (eltstring)->size)
729 ==
730 (matchsize == XSTRING (bestmatch)->size)
731 && !bcmp (XSTRING (eltstring)->data,
732 XSTRING (string)->data, XSTRING (string)->size)
733 && bcmp (XSTRING (bestmatch)->data,
734 XSTRING (string)->data, XSTRING (string)->size)))
735 bestmatch = eltstring;
736 }
737 bestmatchsize = matchsize;
f927c5ae
JB
738 }
739 }
740 }
741
56a98455 742 if (NILP (bestmatch))
f927c5ae 743 return Qnil; /* No completions found */
52b14ac0
JB
744 /* If we are ignoring case, and there is no exact match,
745 and no additional text was supplied,
746 don't change the case of what the user typed. */
747 if (completion_ignore_case && bestmatchsize == XSTRING (string)->size
748 && XSTRING (bestmatch)->size > bestmatchsize)
749 return string;
750
751 /* Return t if the supplied string is an exact match (counting case);
752 it does not require any change to be made. */
753 if (matchcount == 1 && bestmatchsize == XSTRING (string)->size
754 && !bcmp (XSTRING (bestmatch)->data, XSTRING (string)->data,
755 bestmatchsize))
f927c5ae
JB
756 return Qt;
757
758 XFASTINT (zero) = 0; /* Else extract the part in which */
759 XFASTINT (end) = bestmatchsize; /* all completions agree */
760 return Fsubstring (bestmatch, zero, end);
761}
762
763/* Compare exactly LEN chars of strings at S1 and S2,
764 ignoring case if appropriate.
765 Return -1 if strings match,
766 else number of chars that match at the beginning. */
767
768scmp (s1, s2, len)
769 register char *s1, *s2;
770 int len;
771{
772 register int l = len;
773
774 if (completion_ignore_case)
775 {
776 while (l && DOWNCASE (*s1++) == DOWNCASE (*s2++))
777 l--;
778 }
779 else
780 {
781 while (l && *s1++ == *s2++)
782 l--;
783 }
784 if (l == 0)
785 return -1;
786 else return len - l;
787}
788\f
789DEFUN ("all-completions", Fall_completions, Sall_completions, 2, 3, 0,
790 "Search for partial matches to STRING in ALIST.\n\
791Each car of each element of ALIST is tested to see if it begins with STRING.\n\
792The value is a list of all the strings from ALIST that match.\n\
793ALIST can be an obarray instead of an alist.\n\
794Then the print names of all symbols in the obarray are the possible matches.\n\
795\n\
796ALIST can also be a function to do the completion itself.\n\
797It receives three arguments: the values STRING, PREDICATE and t.\n\
798Whatever it returns becomes the value of `all-completion'.\n\
799\n\
800If optional third argument PREDICATE is non-nil,\n\
801it is used to test each possible match.\n\
802The match is a candidate only if PREDICATE returns non-nil.\n\
803The argument given to PREDICATE is the alist element or the symbol from the obarray.")
804 (string, alist, pred)
805 Lisp_Object string, alist, pred;
806{
807 Lisp_Object tail, elt, eltstring;
808 Lisp_Object allmatches;
56a98455 809 int list = CONSP (alist) || NILP (alist);
f927c5ae
JB
810 int index, obsize;
811 Lisp_Object bucket, tem;
812 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
813
814 CHECK_STRING (string, 0);
815 if (!list && XTYPE (alist) != Lisp_Vector)
816 {
817 return call3 (alist, string, pred, Qt);
818 }
819 allmatches = Qnil;
820
821 /* If ALIST is not a list, set TAIL just for gc pro. */
822 tail = alist;
823 if (! list)
824 {
825 index = 0;
826 obsize = XVECTOR (alist)->size;
827 bucket = XVECTOR (alist)->contents[index];
828 }
829
830 while (1)
831 {
832 /* Get the next element of the alist or obarray. */
833 /* Exit the loop if the elements are all used up. */
834 /* elt gets the alist element or symbol.
835 eltstring gets the name to check as a completion. */
836
837 if (list)
838 {
56a98455 839 if (NILP (tail))
f927c5ae
JB
840 break;
841 elt = Fcar (tail);
842 eltstring = Fcar (elt);
843 tail = Fcdr (tail);
844 }
845 else
846 {
847 if (XFASTINT (bucket) != 0)
848 {
849 elt = bucket;
850 eltstring = Fsymbol_name (elt);
851 if (XSYMBOL (bucket)->next)
852 XSETSYMBOL (bucket, XSYMBOL (bucket)->next);
853 else
854 XFASTINT (bucket) = 0;
855 }
856 else if (++index >= obsize)
857 break;
858 else
859 {
860 bucket = XVECTOR (alist)->contents[index];
861 continue;
862 }
863 }
864
865 /* Is this element a possible completion? */
866
2cbaf886
RS
867 if (XTYPE (eltstring) == Lisp_String
868 && XSTRING (string)->size <= XSTRING (eltstring)->size
869 /* Reject alternatives that start with space
870 unless the input starts with space. */
871 && ((XSTRING (string)->size > 0 && XSTRING (string)->data[0] == ' ')
872 || XSTRING (eltstring)->data[0] != ' ')
873 && 0 > scmp (XSTRING (eltstring)->data, XSTRING (string)->data,
874 XSTRING (string)->size))
f927c5ae
JB
875 {
876 /* Yes. */
42006772
RS
877 Lisp_Object regexps;
878 Lisp_Object zero;
879 XFASTINT (zero) = 0;
880
881 /* Ignore this element if it fails to match all the regexps. */
882 for (regexps = Vcompletion_regexp_list; CONSP (regexps);
883 regexps = XCONS (regexps)->cdr)
884 {
885 tem = Fstring_match (XCONS (regexps)->car, eltstring, zero);
886 if (NILP (tem))
887 break;
888 }
889 if (CONSP (regexps))
890 continue;
891
f927c5ae
JB
892 /* Ignore this element if there is a predicate
893 and the predicate doesn't like it. */
894
56a98455 895 if (!NILP (pred))
f927c5ae
JB
896 {
897 if (EQ (pred, Qcommandp))
898 tem = Fcommandp (elt);
899 else
900 {
901 GCPRO4 (tail, eltstring, allmatches, string);
902 tem = call1 (pred, elt);
903 UNGCPRO;
904 }
56a98455 905 if (NILP (tem)) continue;
f927c5ae
JB
906 }
907 /* Ok => put it on the list. */
908 allmatches = Fcons (eltstring, allmatches);
909 }
910 }
911
912 return Fnreverse (allmatches);
913}
914\f
915Lisp_Object Vminibuffer_completion_table, Qminibuffer_completion_table;
916Lisp_Object Vminibuffer_completion_predicate, Qminibuffer_completion_predicate;
917Lisp_Object Vminibuffer_completion_confirm, Qminibuffer_completion_confirm;
918
b9d721de
JB
919/* This comment supplies the doc string for completing-read,
920 for make-docfile to see. We cannot put this in the real DEFUN
921 due to limits in the Unix cpp.
922
f927c5ae
JB
923DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 6, 0,
924 "Read a string in the minibuffer, with completion.\n\
770970cb 925Args: PROMPT, TABLE, PREDICATE, REQUIRE-MATCH, INITIAL-INPUT, HIST.\n\
f927c5ae
JB
926PROMPT is a string to prompt with; normally it ends in a colon and a space.\n\
927TABLE is an alist whose elements' cars are strings, or an obarray.\n\
928PREDICATE limits completion to a subset of TABLE.\n\
929See `try-completion' for more details on completion, TABLE, and PREDICATE.\n\
930If REQUIRE-MATCH is non-nil, the user is not allowed to exit unless\n\
931 the input is (or completes to) an element of TABLE.\n\
932 If it is also not t, Return does not exit if it does non-null completion.\n\
933If INITIAL-INPUT is non-nil, insert it in the minibuffer initially.\n\
770970cb
RS
934 If it is (STRING . POSITION), the initial input\n\
935 is STRING, but point is placed POSITION characters into the string.\n\
936HIST, if non-nil, specifies a history list\n\
937 and optionally the initial position in the list.\n\
938 It can be a symbol, which is the history list variable to use,\n\
939 or it can be a cons cell (HISTVAR . HISTPOS).\n\
940 In that case, HISTVAR is the history list variable to use,\n\
941 and HISTPOS is the initial position (the position in the list\n\
942 which INITIAL-CONTENTS corresponds to).\n\
943 Positions are counted starting from 1 at the beginning of the list.\n\
944Completion ignores case if the ambient value of\n\
b9d721de
JB
945 `completion-ignore-case' is non-nil."
946*/
947DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 6, 0,
948 0 /* See immediately above */)
770970cb
RS
949 (prompt, table, pred, require_match, init, hist)
950 Lisp_Object prompt, table, pred, require_match, init, hist;
f927c5ae 951{
770970cb
RS
952 Lisp_Object val, histvar, histpos, position;
953 int pos = 0;
f927c5ae
JB
954 int count = specpdl_ptr - specpdl;
955 specbind (Qminibuffer_completion_table, table);
956 specbind (Qminibuffer_completion_predicate, pred);
957 specbind (Qminibuffer_completion_confirm,
958 EQ (require_match, Qt) ? Qnil : Qt);
959 last_exact_completion = Qnil;
770970cb
RS
960
961 position = Qnil;
962 if (!NILP (init))
963 {
964 if (XTYPE (init) == Lisp_Cons)
965 {
966 position = Fcdr (init);
967 init = Fcar (init);
968 }
969 CHECK_STRING (init, 0);
970 if (!NILP (position))
971 {
972 CHECK_NUMBER (position, 0);
973 /* Convert to distance from end of input. */
5dadd3a2 974 pos = XINT (position) - XSTRING (init)->size;
770970cb
RS
975 }
976 }
977
978 if (XTYPE (hist) == Lisp_Symbol)
979 {
980 histvar = hist;
981 histpos = Qnil;
982 }
983 else
984 {
985 histvar = Fcar_safe (hist);
986 histpos = Fcdr_safe (hist);
987 }
988 if (NILP (histvar))
989 histvar = Qminibuffer_history;
990 if (NILP (histpos))
991 XFASTINT (histpos) = 0;
992
56a98455 993 val = read_minibuf (NILP (require_match)
f927c5ae
JB
994 ? Vminibuffer_local_completion_map
995 : Vminibuffer_local_must_match_map,
85b5fe07 996 init, prompt, make_number (pos), 0,
770970cb 997 histvar, histpos);
f927c5ae
JB
998 return unbind_to (count, val);
999}
1000\f
1001/* Temporarily display the string M at the end of the current
1002 minibuffer contents. This is used to display things like
1003 "[No Match]" when the user requests a completion for a prefix
1004 that has no possible completions, and other quick, unobtrusive
1005 messages. */
1006
1007temp_echo_area_glyphs (m)
1008 char *m;
1009{
f927c5ae
JB
1010 int osize = ZV;
1011 Lisp_Object oinhibit;
1012 oinhibit = Vinhibit_quit;
1013
896adf84
JB
1014 /* Clear out any old echo-area message to make way for our new thing. */
1015 message (0);
f927c5ae
JB
1016
1017 SET_PT (osize);
1018 insert_string (m);
1019 SET_PT (osize);
1020 Vinhibit_quit = Qt;
1021 Fsit_for (make_number (2), Qnil, Qnil);
a2dd849e 1022 del_range (PT, ZV);
56a98455 1023 if (!NILP (Vquit_flag))
f927c5ae
JB
1024 {
1025 Vquit_flag = Qnil;
a4e71d81 1026 unread_command_events = Fcons (make_number (quit_char), Qnil);
f927c5ae
JB
1027 }
1028 Vinhibit_quit = oinhibit;
1029}
1030
1031Lisp_Object Fminibuffer_completion_help ();
52b14ac0 1032Lisp_Object assoc_for_completion ();
f927c5ae
JB
1033
1034/* returns:
1035 * 0 no possible completion
1036 * 1 was already an exact and unique completion
1037 * 3 was already an exact completion
1038 * 4 completed to an exact completion
1039 * 5 some completion happened
1040 * 6 no completion happened
1041 */
1042int
1043do_completion ()
1044{
1045 Lisp_Object completion, tem;
1046 int completedp;
1047 Lisp_Object last;
1e00c2ff 1048 struct gcpro gcpro1, gcpro2;
f927c5ae 1049
1e00c2ff 1050 GCPRO2 (completion, last);
f927c5ae
JB
1051 completion = Ftry_completion (Fbuffer_string (), Vminibuffer_completion_table,
1052 Vminibuffer_completion_predicate);
1053 last = last_exact_completion;
1054 last_exact_completion = Qnil;
1055
56a98455 1056 if (NILP (completion))
f927c5ae
JB
1057 {
1058 bitch_at_user ();
1059 temp_echo_area_glyphs (" [No match]");
1e00c2ff 1060 UNGCPRO;
f927c5ae
JB
1061 return 0;
1062 }
1063
1064 if (EQ (completion, Qt)) /* exact and unique match */
1e00c2ff
KH
1065 {
1066 UNGCPRO;
1067 return 1;
1068 }
f927c5ae
JB
1069
1070 /* compiler bug */
1071 tem = Fstring_equal (completion, Fbuffer_string());
56a98455 1072 if (completedp = NILP (tem))
f927c5ae
JB
1073 {
1074 Ferase_buffer (); /* Some completion happened */
1075 Finsert (1, &completion);
1076 }
1077
1078 /* It did find a match. Do we match some possibility exactly now? */
1079 if (CONSP (Vminibuffer_completion_table)
56a98455 1080 || NILP (Vminibuffer_completion_table))
52b14ac0
JB
1081 tem = assoc_for_completion (Fbuffer_string (),
1082 Vminibuffer_completion_table);
f927c5ae
JB
1083 else if (XTYPE (Vminibuffer_completion_table) == Lisp_Vector)
1084 {
1085 /* the primitive used by Fintern_soft */
1086 extern Lisp_Object oblookup ();
1087
1088 tem = Fbuffer_string ();
1089 /* Bypass intern-soft as that loses for nil */
1090 tem = oblookup (Vminibuffer_completion_table,
1091 XSTRING (tem)->data, XSTRING (tem)->size);
1092 if (XTYPE (tem) != Lisp_Symbol)
1093 tem = Qnil;
56a98455 1094 else if (!NILP (Vminibuffer_completion_predicate))
f927c5ae
JB
1095 tem = call1 (Vminibuffer_completion_predicate, tem);
1096 else
1097 tem = Qt;
1098 }
1099 else
1100 tem = call3 (Vminibuffer_completion_table,
1101 Fbuffer_string (),
1102 Vminibuffer_completion_predicate,
1103 Qlambda);
1104
56a98455 1105 if (NILP (tem))
1e00c2ff
KH
1106 {
1107 /* not an exact match */
1108 UNGCPRO;
f927c5ae
JB
1109 if (completedp)
1110 return 5;
1111 else if (auto_help)
1112 Fminibuffer_completion_help ();
1113 else
1114 temp_echo_area_glyphs (" [Next char not unique]");
1115 return 6;
1116 }
1117 else if (completedp)
1e00c2ff
KH
1118 {
1119 UNGCPRO;
1120 return 4;
1121 }
f927c5ae
JB
1122 /* If the last exact completion and this one were the same,
1123 it means we've already given a "Complete but not unique"
52b14ac0 1124 message and the user's hit TAB again, so now we give him help. */
f927c5ae 1125 last_exact_completion = completion;
56a98455 1126 if (!NILP (last))
f927c5ae
JB
1127 {
1128 tem = Fbuffer_string ();
56a98455 1129 if (!NILP (Fequal (tem, last)))
f927c5ae
JB
1130 Fminibuffer_completion_help ();
1131 }
1e00c2ff 1132 UNGCPRO;
f927c5ae 1133 return 3;
f927c5ae 1134}
1e00c2ff 1135
52b14ac0
JB
1136/* Like assoc but assumes KEY is a string, and ignores case if appropriate. */
1137
1138Lisp_Object
1139assoc_for_completion (key, list)
1140 register Lisp_Object key;
1141 Lisp_Object list;
1142{
1143 register Lisp_Object tail;
1144
1145 if (completion_ignore_case)
1146 key = Fupcase (key);
1147
56a98455 1148 for (tail = list; !NILP (tail); tail = Fcdr (tail))
52b14ac0
JB
1149 {
1150 register Lisp_Object elt, tem, thiscar;
1151 elt = Fcar (tail);
1152 if (!CONSP (elt)) continue;
1153 thiscar = Fcar (elt);
1154 if (XTYPE (thiscar) != Lisp_String)
1155 continue;
1156 if (completion_ignore_case)
1157 thiscar = Fupcase (thiscar);
1158 tem = Fequal (thiscar, key);
56a98455 1159 if (!NILP (tem)) return elt;
52b14ac0
JB
1160 QUIT;
1161 }
1162 return Qnil;
1163}
f927c5ae
JB
1164
1165DEFUN ("minibuffer-complete", Fminibuffer_complete, Sminibuffer_complete, 0, 0, "",
6300d782 1166 "Complete the minibuffer contents as far as possible.\n\
2cb6da5c
RS
1167Return nil if there is no valid completion, else t.\n\
1168If no characters can be completed, display a list of possible completions.\n\
1169If you repeat this command after it displayed such a list,\n\
1170scroll the window of possible completions.")
f927c5ae
JB
1171 ()
1172{
2cb6da5c
RS
1173 register int i;
1174 Lisp_Object window, tem;
1175
1176 /* If the previous command was not this, then mark the completion
1177 buffer obsolete. */
1178 if (! EQ (last_command, this_command))
1179 Vminibuf_scroll_window = Qnil;
1180
1181 window = Vminibuf_scroll_window;
1182 /* If there's a fresh completion window with a live buffer,
1183 and this command is repeated, scroll that window. */
1184 if (! NILP (window) && ! NILP (XWINDOW (window)->buffer)
1185 && !NILP (XBUFFER (XWINDOW (window)->buffer)->name))
1186 {
1187 struct buffer *obuf = current_buffer;
1188
1189 Fset_buffer (XWINDOW (window)->buffer);
1190 tem = Fpos_visible_in_window_p (make_number (ZV), window);
1191 if (! NILP (tem))
1192 /* If end is in view, scroll up to the beginning. */
1193 Fset_window_start (window, BEGV);
1194 else
1195 /* Else scroll down one screen. */
1196 Fscroll_other_window (Qnil);
1197
1198 set_buffer_internal (obuf);
1199 return Qnil;
1200 }
1201
1202 i = do_completion ();
f927c5ae
JB
1203 switch (i)
1204 {
1205 case 0:
1206 return Qnil;
1207
1208 case 1:
1209 temp_echo_area_glyphs (" [Sole completion]");
1210 break;
1211
1212 case 3:
1213 temp_echo_area_glyphs (" [Complete, but not unique]");
1214 break;
1215 }
1216
1217 return Qt;
1218}
1219
1220DEFUN ("minibuffer-complete-and-exit", Fminibuffer_complete_and_exit,
1221 Sminibuffer_complete_and_exit, 0, 0, "",
1222 "Complete the minibuffer contents, and maybe exit.\n\
1223Exit if the name is valid with no completion needed.\n\
1224If name was completed to a valid match,\n\
1225a repetition of this command will exit.")
1226 ()
1227{
1228 register int i;
1229
1230 /* Allow user to specify null string */
1231 if (BEGV == ZV)
1232 goto exit;
1233
1234 i = do_completion ();
1235 switch (i)
1236 {
1237 case 1:
1238 case 3:
1239 goto exit;
1240
1241 case 4:
56a98455 1242 if (!NILP (Vminibuffer_completion_confirm))
f927c5ae
JB
1243 {
1244 temp_echo_area_glyphs (" [Confirm]");
1245 return Qnil;
1246 }
1247 else
1248 goto exit;
1249
1250 default:
1251 return Qnil;
1252 }
1253 exit:
1254 Fthrow (Qexit, Qnil);
1255 /* NOTREACHED */
1256}
1257
1258DEFUN ("minibuffer-complete-word", Fminibuffer_complete_word, Sminibuffer_complete_word,
1259 0, 0, "",
1260 "Complete the minibuffer contents at most a single word.\n\
1261After one word is completed as much as possible, a space or hyphen\n\
6300d782
KH
1262is added, provided that matches some possible completion.\n\
1263Return nil if there is no valid completion, else t.")
f927c5ae
JB
1264 ()
1265{
1266 Lisp_Object completion, tem;
1267 register int i;
1268 register unsigned char *completion_string;
b278606c
BF
1269 struct gcpro gcpro1;
1270
1271 /* We keep calling Fbuffer_string rather than arrange for GC to
1272 hold onto a pointer to one of the strings thus made. */
f927c5ae
JB
1273
1274 completion = Ftry_completion (Fbuffer_string (),
1275 Vminibuffer_completion_table,
1276 Vminibuffer_completion_predicate);
56a98455 1277 if (NILP (completion))
f927c5ae
JB
1278 {
1279 bitch_at_user ();
1280 temp_echo_area_glyphs (" [No match]");
1281 return Qnil;
1282 }
1283 if (EQ (completion, Qt))
1284 return Qnil;
1285
b278606c 1286#if 0 /* How the below code used to look, for reference. */
f927c5ae
JB
1287 tem = Fbuffer_string ();
1288 b = XSTRING (tem)->data;
1289 i = ZV - 1 - XSTRING (completion)->size;
1290 p = XSTRING (completion)->data;
1291 if (i > 0 ||
1292 0 <= scmp (b, p, ZV - 1))
1293 {
1294 i = 1;
1295 /* Set buffer to longest match of buffer tail and completion head. */
1296 while (0 <= scmp (b + i, p, ZV - 1 - i))
1297 i++;
1298 del_range (1, i + 1);
1299 SET_PT (ZV);
1300 }
1301#else /* Rewritten code */
1302 {
1303 register unsigned char *buffer_string;
1304 int buffer_length, completion_length;
1305
1306 tem = Fbuffer_string ();
719b4a40
RS
1307 /* If reading a file name,
1308 expand any $ENVVAR refs in the buffer and in TEM. */
1309 if (EQ (Vminibuffer_completion_table, Qread_file_name_internal))
1310 {
1311 Lisp_Object substituted;
1312 substituted = Fsubstitute_in_file_name (tem);
1313 if (! EQ (substituted, tem))
1314 {
1315 tem = substituted;
1316 Ferase_buffer ();
3cab9ae4 1317 insert_from_string (tem, 0, XSTRING (tem)->size, 0);
719b4a40
RS
1318 }
1319 }
f927c5ae
JB
1320 buffer_string = XSTRING (tem)->data;
1321 completion_string = XSTRING (completion)->data;
1322 buffer_length = XSTRING (tem)->size; /* ie ZV - BEGV */
1323 completion_length = XSTRING (completion)->size;
1324 i = buffer_length - completion_length;
1325 /* Mly: I don't understand what this is supposed to do AT ALL */
1326 if (i > 0 ||
1327 0 <= scmp (buffer_string, completion_string, buffer_length))
1328 {
1329 /* Set buffer to longest match of buffer tail and completion head. */
1330 if (i <= 0) i = 1;
1331 buffer_string += i;
1332 buffer_length -= i;
1333 while (0 <= scmp (buffer_string++, completion_string, buffer_length--))
1334 i++;
1335 del_range (1, i + 1);
1336 SET_PT (ZV);
1337 }
1338 }
1339#endif /* Rewritten code */
1340 i = ZV - BEGV;
1341
1342 /* If completion finds next char not unique,
b278606c 1343 consider adding a space or a hyphen. */
f927c5ae
JB
1344 if (i == XSTRING (completion)->size)
1345 {
b278606c 1346 GCPRO1 (completion);
f927c5ae
JB
1347 tem = Ftry_completion (concat2 (Fbuffer_string (), build_string (" ")),
1348 Vminibuffer_completion_table,
1349 Vminibuffer_completion_predicate);
b278606c
BF
1350 UNGCPRO;
1351
f927c5ae
JB
1352 if (XTYPE (tem) == Lisp_String)
1353 completion = tem;
1354 else
1355 {
b278606c
BF
1356 GCPRO1 (completion);
1357 tem =
1358 Ftry_completion (concat2 (Fbuffer_string (), build_string ("-")),
1359 Vminibuffer_completion_table,
1360 Vminibuffer_completion_predicate);
1361 UNGCPRO;
1362
f927c5ae
JB
1363 if (XTYPE (tem) == Lisp_String)
1364 completion = tem;
1365 }
1366 }
1367
1368 /* Now find first word-break in the stuff found by completion.
1369 i gets index in string of where to stop completing. */
b278606c 1370
f927c5ae
JB
1371 completion_string = XSTRING (completion)->data;
1372
1373 for (; i < XSTRING (completion)->size; i++)
1374 if (SYNTAX (completion_string[i]) != Sword) break;
1375 if (i < XSTRING (completion)->size)
1376 i = i + 1;
1377
1378 /* If got no characters, print help for user. */
1379
1380 if (i == ZV - BEGV)
1381 {
1382 if (auto_help)
1383 Fminibuffer_completion_help ();
1384 return Qnil;
1385 }
1386
1387 /* Otherwise insert in minibuffer the chars we got */
1388
1389 Ferase_buffer ();
3cab9ae4 1390 insert_from_string (completion, 0, i, 1);
f927c5ae
JB
1391 return Qt;
1392}
1393\f
1394DEFUN ("display-completion-list", Fdisplay_completion_list, Sdisplay_completion_list,
1395 1, 1, 0,
2dc2b736 1396 "Display the list of completions, COMPLETIONS, using `standard-output'.\n\
f927c5ae 1397Each element may be just a symbol or string\n\
2d7e41fe
RS
1398or may be a list of two strings to be printed as if concatenated.\n\
1399`standard-output' must be a buffer.\n\
1400At the end, run the normal hook `completion-setup-hook'.\n\
1401It can find the completion buffer in `standard-output'.")
f927c5ae
JB
1402 (completions)
1403 Lisp_Object completions;
1404{
1405 register Lisp_Object tail, elt;
1406 register int i;
2dc2b736 1407 int column = 0;
f927c5ae
JB
1408 /* No GCPRO needed, since (when it matters) every variable
1409 points to a non-string that is pointed to by COMPLETIONS. */
2dc2b736
RS
1410 struct buffer *old = current_buffer;
1411 if (XTYPE (Vstandard_output) == Lisp_Buffer)
1412 set_buffer_internal (XBUFFER (Vstandard_output));
f927c5ae 1413
56a98455 1414 if (NILP (completions))
cfc736bf
RS
1415 write_string ("There are no possible completions of what you have typed.",
1416 -1);
f927c5ae
JB
1417 else
1418 {
2dc2b736 1419 write_string ("Possible completions are:", -1);
56a98455 1420 for (tail = completions, i = 0; !NILP (tail); tail = Fcdr (tail), i++)
f927c5ae
JB
1421 {
1422 /* this needs fixing for the case of long completions
1423 and/or narrow windows */
1424 /* Sadly, the window it will appear in is not known
1425 until after the text has been made. */
1426 if (i & 1)
2dc2b736
RS
1427 {
1428 if (XTYPE (Vstandard_output) == Lisp_Buffer)
1429 Findent_to (make_number (35), make_number (1));
1430 else
1431 {
1432 do
1433 {
1434 write_string (" ", -1);
1435 column++;
1436 }
1437 while (column < 35);
1438 }
1439 }
f927c5ae 1440 else
2dc2b736
RS
1441 {
1442 Fterpri (Qnil);
1443 column = 0;
1444 }
f927c5ae
JB
1445 elt = Fcar (tail);
1446 if (CONSP (elt))
1447 {
2dc2b736
RS
1448 if (XTYPE (Vstandard_output) != Lisp_Buffer)
1449 {
07accdfe 1450 Lisp_Object tem;
2dc2b736
RS
1451 tem = Flength (Fcar (elt));
1452 column += XINT (tem);
1453 tem = Flength (Fcar (Fcdr (elt)));
1454 column += XINT (tem);
1455 }
f927c5ae
JB
1456 Fprinc (Fcar (elt), Qnil);
1457 Fprinc (Fcar (Fcdr (elt)), Qnil);
1458 }
1459 else
2dc2b736
RS
1460 {
1461 if (XTYPE (Vstandard_output) != Lisp_Buffer)
1462 {
1463 Lisp_Object tem;
f1b28218 1464 tem = Flength (elt);
2dc2b736
RS
1465 column += XINT (tem);
1466 }
1467 Fprinc (elt, Qnil);
1468 }
f927c5ae
JB
1469 }
1470 }
2dc2b736 1471
2d7e41fe
RS
1472 if (XTYPE (Vstandard_output) == Lisp_Buffer)
1473 set_buffer_internal (old);
1474
cfc736bf
RS
1475 if (!NILP (Vrun_hooks))
1476 call1 (Vrun_hooks, intern ("completion-setup-hook"));
1477
f927c5ae
JB
1478 return Qnil;
1479}
1480
1481DEFUN ("minibuffer-completion-help", Fminibuffer_completion_help, Sminibuffer_completion_help,
1482 0, 0, "",
1483 "Display a list of possible completions of the current minibuffer contents.")
1484 ()
1485{
1486 Lisp_Object completions;
1487
1488 message ("Making completion list...");
1489 completions = Fall_completions (Fbuffer_string (),
1490 Vminibuffer_completion_table,
1491 Vminibuffer_completion_predicate);
1492 echo_area_glyphs = 0;
1493
56a98455 1494 if (NILP (completions))
f927c5ae
JB
1495 {
1496 bitch_at_user ();
1497 temp_echo_area_glyphs (" [No completions]");
1498 }
1499 else
1500 internal_with_output_to_temp_buffer ("*Completions*",
1501 Fdisplay_completion_list,
1502 Fsort (completions, Qstring_lessp));
1503 return Qnil;
1504}
1505\f
1506DEFUN ("self-insert-and-exit", Fself_insert_and_exit, Sself_insert_and_exit, 0, 0, "",
1507 "Terminate minibuffer input.")
1508 ()
1509{
1510 if (XTYPE (last_command_char) == Lisp_Int)
1511 internal_self_insert (last_command_char, 0);
1512 else
1513 bitch_at_user ();
1514
1515 Fthrow (Qexit, Qnil);
1516}
1517
1518DEFUN ("exit-minibuffer", Fexit_minibuffer, Sexit_minibuffer, 0, 0, "",
1519 "Terminate this minibuffer argument.")
1520 ()
1521{
1522 Fthrow (Qexit, Qnil);
1523}
1524
1525DEFUN ("minibuffer-depth", Fminibuffer_depth, Sminibuffer_depth, 0, 0, 0,
1526 "Return current depth of activations of minibuffer, a nonnegative integer.")
1527 ()
1528{
1529 return make_number (minibuf_level);
1530}
1531
37e9a934
KH
1532DEFUN ("minibuffer-prompt", Fminibuffer_prompt, Sminibuffer_prompt, 0, 0, 0,
1533 "Return the prompt string of the currently-active minibuffer.\n\
1534If no minibuffer is active, return nil.")
1535 ()
1536{
1537 if (!minibuf_prompt)
1538 return Qnil;
1539 return build_string (minibuf_prompt);
1540}
1541
1542DEFUN ("minibuffer-prompt-width", Fminibuffer_prompt_width,
1543 Sminibuffer_prompt_width, 0, 0, 0,
c7eddf3c
KH
1544 "Return the horizontal position after the minibuffer prompt.\n\
1545This may be less than the actual display width of the minibuffer prompt,\n\
1546or even negative, if horizontal scrolling is in effect in the minibuffer.")
37e9a934
KH
1547 ()
1548{
1549 Lisp_Object width;
c7eddf3c 1550 XSET (width, Lisp_Int, minibuf_prompt_width);
37e9a934
KH
1551 return width;
1552}
f927c5ae
JB
1553\f
1554init_minibuf_once ()
1555{
1556 Vminibuffer_list = Qnil;
1557 staticpro (&Vminibuffer_list);
1558}
1559
1560syms_of_minibuf ()
1561{
1562 minibuf_level = 0;
1563 minibuf_prompt = 0;
1564 minibuf_save_vector_size = 5;
1565 minibuf_save_vector = (struct minibuf_save_data *) malloc (5 * sizeof (struct minibuf_save_data));
1566
719b4a40
RS
1567 Qread_file_name_internal = intern ("read-file-name-internal");
1568 staticpro (&Qread_file_name_internal);
1569
f927c5ae
JB
1570 Qminibuffer_completion_table = intern ("minibuffer-completion-table");
1571 staticpro (&Qminibuffer_completion_table);
1572
1573 Qminibuffer_completion_confirm = intern ("minibuffer-completion-confirm");
1574 staticpro (&Qminibuffer_completion_confirm);
1575
1576 Qminibuffer_completion_predicate = intern ("minibuffer-completion-predicate");
1577 staticpro (&Qminibuffer_completion_predicate);
1578
1e00c2ff
KH
1579 staticpro (&last_exact_completion);
1580 last_exact_completion = Qnil;
1581
f927c5ae
JB
1582 staticpro (&last_minibuf_string);
1583 last_minibuf_string = Qnil;
1584
1585 Quser_variable_p = intern ("user-variable-p");
1586 staticpro (&Quser_variable_p);
1587
770970cb
RS
1588 Qminibuffer_history = intern ("minibuffer-history");
1589 staticpro (&Qminibuffer_history);
f927c5ae 1590
5c781212
RS
1591 Qminibuffer_setup_hook = intern ("minibuffer-setup-hook");
1592 staticpro (&Qminibuffer_setup_hook);
1593
1594 DEFVAR_LISP ("minibuffer-setup-hook", &Vminibuffer_setup_hook,
1595 "Normal hook run just after entry to minibuffer.");
1596 Vminibuffer_setup_hook = Qnil;
1597
f927c5ae
JB
1598 DEFVAR_BOOL ("completion-auto-help", &auto_help,
1599 "*Non-nil means automatically provide help for invalid completion input.");
1600 auto_help = 1;
1601
1602 DEFVAR_BOOL ("completion-ignore-case", &completion_ignore_case,
1603 "Non-nil means don't consider case significant in completion.");
1604 completion_ignore_case = 0;
1605
1606 DEFVAR_BOOL ("enable-recursive-minibuffers", &enable_recursive_minibuffers,
1607 "*Non-nil means to allow minibuffer commands while in the minibuffer.\n\
1608More precisely, this variable makes a difference when the minibuffer window\n\
1609is the selected window. If you are in some other window, minibuffer commands\n\
1610are allowed even if a minibuffer is active.");
1611 enable_recursive_minibuffers = 0;
1612
1613 DEFVAR_LISP ("minibuffer-completion-table", &Vminibuffer_completion_table,
1614 "Alist or obarray used for completion in the minibuffer.\n\
1615This becomes the ALIST argument to `try-completion' and `all-completion'.\n\
1616\n\
1617The value may alternatively be a function, which is given three arguments:\n\
1618 STRING, the current buffer contents;\n\
1619 PREDICATE, the predicate for filtering possible matches;\n\
1620 CODE, which says what kind of things to do.\n\
1621CODE can be nil, t or `lambda'.\n\
1622nil means to return the best completion of STRING, or nil if there is none.\n\
1623t means to return a list of all possible completions of STRING.\n\
1624`lambda' means to return t if STRING is a valid completion as it stands.");
1625 Vminibuffer_completion_table = Qnil;
1626
1627 DEFVAR_LISP ("minibuffer-completion-predicate", &Vminibuffer_completion_predicate,
1628 "Within call to `completing-read', this holds the PREDICATE argument.");
1629 Vminibuffer_completion_predicate = Qnil;
1630
1631 DEFVAR_LISP ("minibuffer-completion-confirm", &Vminibuffer_completion_confirm,
1632 "Non-nil => demand confirmation of completion before exiting minibuffer.");
1633 Vminibuffer_completion_confirm = Qnil;
1634
1635 DEFVAR_LISP ("minibuffer-help-form", &Vminibuffer_help_form,
1636 "Value that `help-form' takes on inside the minibuffer.");
1637 Vminibuffer_help_form = Qnil;
1638
770970cb
RS
1639 DEFVAR_LISP ("minibuffer-history-variable", &Vminibuffer_history_variable,
1640 "History list symbol to add minibuffer values to.\n\
1641Each minibuffer output is added with\n\
1642 (set minibuffer-history-variable\n\
1643 (cons STRING (symbol-value minibuffer-history-variable)))");
1644 XFASTINT (Vminibuffer_history_variable) = 0;
1645
1646 DEFVAR_LISP ("minibuffer-history-position", &Vminibuffer_history_position,
1647 "Current position of redoing in the history list.");
1648 Vminibuffer_history_position = Qnil;
1649
6a9ee000
RS
1650 DEFVAR_BOOL ("minibuffer-auto-raise", &minibuffer_auto_raise,
1651 "*Non-nil means entering the minibuffer raises the minibuffer's frame.");
1652 minibuffer_auto_raise = 0;
1653
42006772
RS
1654 DEFVAR_LISP ("completion-regexp-list", &Vcompletion_regexp_list,
1655 "List of regexps that should restrict possible completions.");
1656 Vcompletion_regexp_list = Qnil;
1657
f927c5ae
JB
1658 defsubr (&Sread_from_minibuffer);
1659 defsubr (&Seval_minibuffer);
1660 defsubr (&Sread_minibuffer);
1661 defsubr (&Sread_string);
1662 defsubr (&Sread_command);
1663 defsubr (&Sread_variable);
1664 defsubr (&Sread_buffer);
1665 defsubr (&Sread_no_blanks_input);
1666 defsubr (&Sminibuffer_depth);
37e9a934
KH
1667 defsubr (&Sminibuffer_prompt);
1668 defsubr (&Sminibuffer_prompt_width);
f927c5ae
JB
1669
1670 defsubr (&Stry_completion);
1671 defsubr (&Sall_completions);
1672 defsubr (&Scompleting_read);
1673 defsubr (&Sminibuffer_complete);
1674 defsubr (&Sminibuffer_complete_word);
1675 defsubr (&Sminibuffer_complete_and_exit);
1676 defsubr (&Sdisplay_completion_list);
1677 defsubr (&Sminibuffer_completion_help);
1678
1679 defsubr (&Sself_insert_and_exit);
1680 defsubr (&Sexit_minibuffer);
1681
1682}
1683
1684keys_of_minibuf ()
1685{
1686 initial_define_key (Vminibuffer_local_map, Ctl ('g'),
1687 "abort-recursive-edit");
1688 initial_define_key (Vminibuffer_local_map, Ctl ('m'),
1689 "exit-minibuffer");
1690 initial_define_key (Vminibuffer_local_map, Ctl ('j'),
1691 "exit-minibuffer");
1692
1693 initial_define_key (Vminibuffer_local_ns_map, Ctl ('g'),
1694 "abort-recursive-edit");
1695 initial_define_key (Vminibuffer_local_ns_map, Ctl ('m'),
1696 "exit-minibuffer");
1697 initial_define_key (Vminibuffer_local_ns_map, Ctl ('j'),
1698 "exit-minibuffer");
1699
1700 initial_define_key (Vminibuffer_local_ns_map, ' ',
1701 "exit-minibuffer");
1702 initial_define_key (Vminibuffer_local_ns_map, '\t',
1703 "exit-minibuffer");
1704 initial_define_key (Vminibuffer_local_ns_map, '?',
1705 "self-insert-and-exit");
1706
1707 initial_define_key (Vminibuffer_local_completion_map, Ctl ('g'),
1708 "abort-recursive-edit");
1709 initial_define_key (Vminibuffer_local_completion_map, Ctl ('m'),
1710 "exit-minibuffer");
1711 initial_define_key (Vminibuffer_local_completion_map, Ctl ('j'),
1712 "exit-minibuffer");
1713
1714 initial_define_key (Vminibuffer_local_completion_map, '\t',
1715 "minibuffer-complete");
1716 initial_define_key (Vminibuffer_local_completion_map, ' ',
1717 "minibuffer-complete-word");
1718 initial_define_key (Vminibuffer_local_completion_map, '?',
1719 "minibuffer-completion-help");
1720
1721 initial_define_key (Vminibuffer_local_must_match_map, Ctl ('g'),
1722 "abort-recursive-edit");
1723 initial_define_key (Vminibuffer_local_must_match_map, Ctl ('m'),
1724 "minibuffer-complete-and-exit");
1725 initial_define_key (Vminibuffer_local_must_match_map, Ctl ('j'),
1726 "minibuffer-complete-and-exit");
1727 initial_define_key (Vminibuffer_local_must_match_map, '\t',
1728 "minibuffer-complete");
1729 initial_define_key (Vminibuffer_local_must_match_map, ' ',
1730 "minibuffer-complete-word");
1731 initial_define_key (Vminibuffer_local_must_match_map, '?',
1732 "minibuffer-completion-help");
1733}