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