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