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