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