(Fget_text_property): Use textget.
[bpt/emacs.git] / src / keymap.c
CommitLineData
2c6f1a39 1/* Manipulation of keymaps
502ddf23 2 Copyright (C) 1985, 1986, 1987, 1988, 1992 Free Software Foundation, Inc.
2c6f1a39
JB
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
502ddf23 8the Free Software Foundation; either version 2, or (at your option)
2c6f1a39
JB
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21#include "config.h"
22#include <stdio.h>
23#undef NULL
24#include "lisp.h"
25#include "commands.h"
26#include "buffer.h"
6bbbd9b0 27#include "keyboard.h"
2c6f1a39
JB
28
29#define min(a, b) ((a) < (b) ? (a) : (b))
30
f5b79c1c 31/* The number of elements in keymap vectors. */
2c6f1a39
JB
32#define DENSE_TABLE_SIZE (0200)
33
34/* Actually allocate storage for these variables */
35
36Lisp_Object current_global_map; /* Current global keymap */
37
38Lisp_Object global_map; /* default global key bindings */
39
40Lisp_Object meta_map; /* The keymap used for globally bound
41 ESC-prefixed default commands */
42
43Lisp_Object control_x_map; /* The keymap used for globally bound
44 C-x-prefixed default commands */
45
46/* was MinibufLocalMap */
47Lisp_Object Vminibuffer_local_map;
48 /* The keymap used by the minibuf for local
49 bindings when spaces are allowed in the
50 minibuf */
51
52/* was MinibufLocalNSMap */
53Lisp_Object Vminibuffer_local_ns_map;
54 /* The keymap used by the minibuf for local
55 bindings when spaces are not encouraged
56 in the minibuf */
57
58/* keymap used for minibuffers when doing completion */
59/* was MinibufLocalCompletionMap */
60Lisp_Object Vminibuffer_local_completion_map;
61
62/* keymap used for minibuffers when doing completion and require a match */
63/* was MinibufLocalMustMatchMap */
64Lisp_Object Vminibuffer_local_must_match_map;
65
cc0a8174
JB
66/* Alist of minor mode variables and keymaps. */
67Lisp_Object Vminor_mode_map_alist;
68
6bbbd9b0
JB
69/* Keymap mapping ASCII function key sequences onto their preferred forms.
70 Initialized by the terminal-specific lisp files. See DEFVAR for more
71 documentation. */
72Lisp_Object Vfunction_key_map;
73
2c6f1a39
JB
74Lisp_Object Qkeymapp, Qkeymap;
75
76/* A char over 0200 in a key sequence
77 is equivalent to prefixing with this character. */
78
79extern Lisp_Object meta_prefix_char;
80
81void describe_map_tree ();
82static Lisp_Object describe_buffer_bindings ();
83static void describe_command ();
84static void describe_map ();
f5b79c1c 85static void describe_map_2 ();
2c6f1a39 86\f
cc0a8174
JB
87/* Keymap object support - constructors and predicates. */
88
ce6e5d0b 89DEFUN ("make-keymap", Fmake_keymap, Smake_keymap, 0, 1, 0,
2c6f1a39
JB
90 "Construct and return a new keymap, of the form (keymap VECTOR . ALIST).\n\
91VECTOR is a 128-element vector which holds the bindings for the ASCII\n\
92characters. ALIST is an assoc-list which holds bindings for function keys,\n\
93mouse events, and any other things that appear in the input stream.\n\
ce6e5d0b
RS
94All entries in it are initially nil, meaning \"command undefined\".\n\n\
95The optional arg STRING supplies a menu name for the keymap\n\
96in case you use it as a menu with `x-popup-menu'.")
97 (string)
98 Lisp_Object string;
2c6f1a39 99{
ce6e5d0b
RS
100 Lisp_Object tail;
101 if (!NILP (string))
102 tail = Fcons (string, Qnil);
103 else
104 tail = Qnil;
2c6f1a39
JB
105 return Fcons (Qkeymap,
106 Fcons (Fmake_vector (make_number (DENSE_TABLE_SIZE), Qnil),
ce6e5d0b 107 tail));
2c6f1a39
JB
108}
109
ce6e5d0b 110DEFUN ("make-sparse-keymap", Fmake_sparse_keymap, Smake_sparse_keymap, 0, 1, 0,
2c6f1a39
JB
111 "Construct and return a new sparse-keymap list.\n\
112Its car is `keymap' and its cdr is an alist of (CHAR . DEFINITION),\n\
113which binds the character CHAR to DEFINITION, or (SYMBOL . DEFINITION),\n\
114which binds the function key or mouse event SYMBOL to DEFINITION.\n\
ce6e5d0b
RS
115Initially the alist is nil.\n\n\
116The optional arg STRING supplies a menu name for the keymap\n\
117in case you use it as a menu with `x-popup-menu'.")
118 (string)
119 Lisp_Object string;
2c6f1a39 120{
ce6e5d0b
RS
121 if (!NILP (string))
122 return Fcons (Qkeymap, Fcons (string, Qnil));
2c6f1a39
JB
123 return Fcons (Qkeymap, Qnil);
124}
125
126/* This function is used for installing the standard key bindings
127 at initialization time.
128
129 For example:
130
e25c4e44 131 initial_define_key (control_x_map, Ctl('X'), "exchange-point-and-mark"); */
2c6f1a39
JB
132
133void
134initial_define_key (keymap, key, defname)
135 Lisp_Object keymap;
136 int key;
137 char *defname;
138{
139 store_in_keymap (keymap, make_number (key), intern (defname));
140}
141
e25c4e44
JB
142void
143initial_define_lispy_key (keymap, keyname, defname)
144 Lisp_Object keymap;
145 char *keyname;
146 char *defname;
147{
148 store_in_keymap (keymap, intern (keyname), intern (defname));
149}
150
2c6f1a39
JB
151/* Define character fromchar in map frommap as an alias for character
152 tochar in map tomap. Subsequent redefinitions of the latter WILL
153 affect the former. */
154
155#if 0
156void
157synkey (frommap, fromchar, tomap, tochar)
158 struct Lisp_Vector *frommap, *tomap;
159 int fromchar, tochar;
160{
161 Lisp_Object v, c;
162 XSET (v, Lisp_Vector, tomap);
163 XFASTINT (c) = tochar;
164 frommap->contents[fromchar] = Fcons (v, c);
165}
166#endif /* 0 */
167
168DEFUN ("keymapp", Fkeymapp, Skeymapp, 1, 1, 0,
169 "Return t if ARG is a keymap.\n\
1d8d96fa
JB
170\n\
171A keymap is list (keymap . ALIST), a list (keymap VECTOR . ALIST),\n\
172or a symbol whose function definition is a keymap is itself a keymap.\n\
173ALIST elements look like (CHAR . DEFN) or (SYMBOL . DEFN);\n\
174VECTOR is a 128-element vector of bindings for ASCII characters.")
2c6f1a39
JB
175 (object)
176 Lisp_Object object;
177{
d09b2024 178 return (NILP (get_keymap_1 (object, 0, 0)) ? Qnil : Qt);
2c6f1a39
JB
179}
180
181/* Check that OBJECT is a keymap (after dereferencing through any
d09b2024
JB
182 symbols). If it is, return it.
183
184 If AUTOLOAD is non-zero and OBJECT is a symbol whose function value
185 is an autoload form, do the autoload and try again.
186
187 ERROR controls how we respond if OBJECT isn't a keymap.
188 If ERROR is non-zero, signal an error; otherwise, just return Qnil.
189
190 Note that most of the time, we don't want to pursue autoloads.
191 Functions like Faccessible_keymaps which scan entire keymap trees
192 shouldn't load every autoloaded keymap. I'm not sure about this,
193 but it seems to me that only read_key_sequence, Flookup_key, and
194 Fdefine_key should cause keymaps to be autoloaded. */
195
2c6f1a39 196Lisp_Object
d09b2024 197get_keymap_1 (object, error, autoload)
2c6f1a39 198 Lisp_Object object;
d09b2024 199 int error, autoload;
2c6f1a39 200{
d09b2024 201 Lisp_Object tem;
2c6f1a39 202
d09b2024 203 autoload_retry:
502ddf23 204 tem = indirect_function (object);
2c6f1a39
JB
205 if (CONSP (tem) && EQ (XCONS (tem)->car, Qkeymap))
206 return tem;
f5b79c1c 207
8e4dfd54
JB
208 /* Should we do an autoload? Autoload forms for keymaps have
209 Qkeymap as their fifth element. */
d09b2024
JB
210 if (autoload
211 && XTYPE (object) == Lisp_Symbol
212 && CONSP (tem)
213 && EQ (XCONS (tem)->car, Qautoload))
214 {
8e4dfd54 215 Lisp_Object tail;
d09b2024 216
8e4dfd54
JB
217 tail = Fnth (make_number (4), tem);
218 if (EQ (tail, Qkeymap))
219 {
220 struct gcpro gcpro1, gcpro2;
d09b2024 221
8e4dfd54
JB
222 GCPRO2 (tem, object)
223 do_autoload (tem, object);
224 UNGCPRO;
225
226 goto autoload_retry;
227 }
d09b2024
JB
228 }
229
2c6f1a39
JB
230 if (error)
231 wrong_type_argument (Qkeymapp, object);
cc0a8174
JB
232 else
233 return Qnil;
2c6f1a39
JB
234}
235
d09b2024
JB
236
237/* Follow any symbol chaining, and return the keymap denoted by OBJECT.
238 If OBJECT doesn't denote a keymap at all, signal an error. */
2c6f1a39
JB
239Lisp_Object
240get_keymap (object)
241 Lisp_Object object;
242{
d09b2024 243 return get_keymap_1 (object, 0, 0);
2c6f1a39
JB
244}
245
246
2c6f1a39 247/* Look up IDX in MAP. IDX may be any sort of event.
f5b79c1c 248 Note that this does only one level of lookup; IDX must be a single
e25c4e44
JB
249 event, not a sequence.
250
251 If T_OK is non-zero, bindings for Qt are treated as default
252 bindings; any key left unmentioned by other tables and bindings is
253 given the binding of Qt.
254
255 If T_OK is zero, bindings for Qt are not treated specially. */
2c6f1a39
JB
256
257Lisp_Object
e25c4e44 258access_keymap (map, idx, t_ok)
2c6f1a39
JB
259 Lisp_Object map;
260 Lisp_Object idx;
e25c4e44 261 int t_ok;
2c6f1a39
JB
262{
263 /* If idx is a list (some sort of mouse click, perhaps?),
264 the index we want to use is the car of the list, which
265 ought to be a symbol. */
cebd887d 266 idx = EVENT_HEAD (idx);
2c6f1a39
JB
267
268 if (XTYPE (idx) == Lisp_Int
269 && (XINT (idx) < 0 || XINT (idx) >= DENSE_TABLE_SIZE))
e25c4e44 270 error ("only ASCII characters may be looked up in keymaps");
2c6f1a39 271
f5b79c1c
JB
272 /* If idx is a symbol, it might have modifiers, which need to
273 be put in the canonical order. */
274 else if (XTYPE (idx) == Lisp_Symbol)
275 idx = reorder_modifiers (idx);
2c6f1a39 276
f5b79c1c
JB
277 {
278 Lisp_Object tail;
e25c4e44 279 Lisp_Object t_binding = Qnil;
2c6f1a39 280
f5b79c1c 281 for (tail = map; CONSP (tail); tail = XCONS (tail)->cdr)
2c6f1a39 282 {
f5b79c1c
JB
283 Lisp_Object binding = XCONS (tail)->car;
284
285 switch (XTYPE (binding))
286 {
287 case Lisp_Cons:
288 if (EQ (XCONS (binding)->car, idx))
289 return XCONS (binding)->cdr;
e25c4e44
JB
290 if (t_ok && EQ (XCONS (binding)->car, Qt))
291 t_binding = XCONS (binding)->cdr;
f5b79c1c
JB
292 break;
293
294 case Lisp_Vector:
295 if (XVECTOR (binding)->size == DENSE_TABLE_SIZE
296 && XTYPE (idx) == Lisp_Int)
297 return XVECTOR (binding)->contents[XINT (idx)];
298 break;
299 }
20218e2f
JB
300
301 QUIT;
2c6f1a39 302 }
fde3a52f 303
e25c4e44
JB
304 return t_binding;
305 }
2c6f1a39
JB
306}
307
308/* Given OBJECT which was found in a slot in a keymap,
309 trace indirect definitions to get the actual definition of that slot.
310 An indirect definition is a list of the form
311 (KEYMAP . INDEX), where KEYMAP is a keymap or a symbol defined as one
312 and INDEX is the object to look up in KEYMAP to yield the definition.
313
314 Also if OBJECT has a menu string as the first element,
1a8c3f10 315 remove that. Also remove a menu help string as second element. */
2c6f1a39
JB
316
317Lisp_Object
318get_keyelt (object)
319 register Lisp_Object object;
320{
321 while (1)
322 {
323 register Lisp_Object map, tem;
324
fde3a52f 325 /* If the contents are (KEYMAP . ELEMENT), go indirect. */
d09b2024 326 map = get_keymap_1 (Fcar_safe (object), 0, 0);
2c6f1a39 327 tem = Fkeymapp (map);
265a9e55 328 if (!NILP (tem))
e25c4e44 329 object = access_keymap (map, Fcdr (object), 0);
2c6f1a39
JB
330
331 /* If the keymap contents looks like (STRING . DEFN),
332 use DEFN.
333 Keymap alist elements like (CHAR MENUSTRING . DEFN)
334 will be used by HierarKey menus. */
335 else if (XTYPE (object) == Lisp_Cons
336 && XTYPE (XCONS (object)->car) == Lisp_String)
1a8c3f10
RS
337 {
338 object = XCONS (object)->cdr;
339 /* Also remove a menu help string, if any,
340 following the menu item name. */
341 if (XTYPE (object) == Lisp_Cons
342 && XTYPE (XCONS (object)->car) == Lisp_String)
343 object = XCONS (object)->cdr;
344 }
2c6f1a39
JB
345
346 else
347 /* Anything else is really the value. */
348 return object;
349 }
350}
351
352Lisp_Object
353store_in_keymap (keymap, idx, def)
354 Lisp_Object keymap;
355 register Lisp_Object idx;
356 register Lisp_Object def;
357{
f5b79c1c
JB
358 if (XTYPE (keymap) != Lisp_Cons
359 || ! EQ (XCONS (keymap)->car, Qkeymap))
360 error ("attempt to define a key in a non-keymap");
361
2c6f1a39
JB
362 /* If idx is a list (some sort of mouse click, perhaps?),
363 the index we want to use is the car of the list, which
364 ought to be a symbol. */
cebd887d 365 idx = EVENT_HEAD (idx);
2c6f1a39
JB
366
367 if (XTYPE (idx) == Lisp_Int
368 && (XINT (idx) < 0 || XINT (idx) >= DENSE_TABLE_SIZE))
f5b79c1c
JB
369 error ("only ASCII characters may be used as keymap indices");
370
371 /* If idx is a symbol, it might have modifiers, which need to
372 be put in the canonical order. */
373 else if (XTYPE (idx) == Lisp_Symbol)
374 idx = reorder_modifiers (idx);
375
376
377 /* Scan the keymap for a binding of idx. */
2c6f1a39 378 {
f5b79c1c 379 Lisp_Object tail;
2c6f1a39 380
f5b79c1c
JB
381 /* The cons after which we should insert new bindings. If the
382 keymap has a table element, we record its position here, so new
383 bindings will go after it; this way, the table will stay
384 towards the front of the alist and character lookups in dense
385 keymaps will remain fast. Otherwise, this just points at the
386 front of the keymap. */
387 Lisp_Object insertion_point = keymap;
2c6f1a39 388
f5b79c1c 389 for (tail = XCONS (keymap)->cdr; CONSP (tail); tail = XCONS (tail)->cdr)
2c6f1a39 390 {
f5b79c1c
JB
391 Lisp_Object elt = XCONS (tail)->car;
392
393 switch (XTYPE (elt))
394 {
395 case Lisp_Vector:
0188441d
JB
396 if (XVECTOR (elt)->size != DENSE_TABLE_SIZE)
397 break;
f5b79c1c
JB
398 if (XTYPE (idx) == Lisp_Int)
399 {
400 XVECTOR (elt)->contents[XFASTINT (idx)] = def;
401 return def;
402 }
403 insertion_point = tail;
404 break;
405
406 case Lisp_Cons:
407 if (EQ (idx, XCONS (elt)->car))
408 {
409 XCONS (elt)->cdr = def;
410 return def;
411 }
412 break;
413
414 case Lisp_Symbol:
415 /* If we find a 'keymap' symbol in the spine of KEYMAP,
416 then we must have found the start of a second keymap
417 being used as the tail of KEYMAP, and a binding for IDX
418 should be inserted before it. */
419 if (EQ (elt, Qkeymap))
420 goto keymap_end;
421 break;
422 }
0188441d
JB
423
424 QUIT;
2c6f1a39 425 }
2c6f1a39 426
f5b79c1c
JB
427 keymap_end:
428 /* We have scanned the entire keymap, and not found a binding for
429 IDX. Let's add one. */
430 XCONS (insertion_point)->cdr =
431 Fcons (Fcons (idx, def), XCONS (insertion_point)->cdr);
432 }
433
2c6f1a39
JB
434 return def;
435}
436
f5b79c1c 437
2c6f1a39
JB
438DEFUN ("copy-keymap", Fcopy_keymap, Scopy_keymap, 1, 1, 0,
439 "Return a copy of the keymap KEYMAP.\n\
440The copy starts out with the same definitions of KEYMAP,\n\
441but changing either the copy or KEYMAP does not affect the other.\n\
1d8d96fa
JB
442Any key definitions that are subkeymaps are recursively copied.\n\
443However, a key definition which is a symbol whose definition is a keymap\n\
444is not copied.")
2c6f1a39
JB
445 (keymap)
446 Lisp_Object keymap;
447{
448 register Lisp_Object copy, tail;
449
450 copy = Fcopy_alist (get_keymap (keymap));
2c6f1a39 451
f5b79c1c 452 for (tail = copy; CONSP (tail); tail = XCONS (tail)->cdr)
2c6f1a39 453 {
f5b79c1c 454 Lisp_Object elt = XCONS (tail)->car;
2c6f1a39 455
f5b79c1c
JB
456 if (XTYPE (elt) == Lisp_Vector
457 && XVECTOR (elt)->size == DENSE_TABLE_SIZE)
2c6f1a39 458 {
f5b79c1c 459 int i;
2c6f1a39 460
f5b79c1c
JB
461 elt = Fcopy_sequence (elt);
462 XCONS (tail)->car = elt;
2c6f1a39
JB
463
464 for (i = 0; i < DENSE_TABLE_SIZE; i++)
f5b79c1c
JB
465 if (XTYPE (XVECTOR (elt)->contents[i]) != Lisp_Symbol
466 && Fkeymapp (XVECTOR (elt)->contents[i]))
467 XVECTOR (elt)->contents[i] =
468 Fcopy_keymap (XVECTOR (elt)->contents[i]);
2c6f1a39 469 }
f5b79c1c
JB
470 else if (CONSP (elt)
471 && XTYPE (XCONS (elt)->cdr) != Lisp_Symbol
472 && ! NILP (Fkeymapp (XCONS (elt)->cdr)))
2c6f1a39 473 XCONS (elt)->cdr = Fcopy_keymap (XCONS (elt)->cdr);
2c6f1a39
JB
474 }
475
476 return copy;
477}
478\f
cc0a8174
JB
479/* Simple Keymap mutators and accessors. */
480
2c6f1a39
JB
481DEFUN ("define-key", Fdefine_key, Sdefine_key, 3, 3, 0,
482 "Args KEYMAP, KEY, DEF. Define key sequence KEY, in KEYMAP, as DEF.\n\
483KEYMAP is a keymap. KEY is a string or a vector of symbols and characters\n\
484meaning a sequence of keystrokes and events.\n\
485DEF is anything that can be a key's definition:\n\
486 nil (means key is undefined in this keymap),\n\
487 a command (a Lisp function suitable for interactive calling)\n\
488 a string (treated as a keyboard macro),\n\
489 a keymap (to define a prefix key),\n\
490 a symbol. When the key is looked up, the symbol will stand for its\n\
491 function definition, which should at that time be one of the above,\n\
492 or another symbol whose function definition is used, etc.\n\
493 a cons (STRING . DEFN), meaning that DEFN is the definition\n\
494 (DEFN should be a valid definition in its own right),\n\
6e8290aa
JB
495 or a cons (KEYMAP . CHAR), meaning use definition of CHAR in map KEYMAP.\n\
496\n\
497If KEYMAP is a sparse keymap, the pair binding KEY to DEF is added at\n\
498the front of KEYMAP.")
2c6f1a39 499 (keymap, key, def)
d09b2024 500 Lisp_Object keymap;
2c6f1a39
JB
501 Lisp_Object key;
502 Lisp_Object def;
503{
504 register int idx;
505 register Lisp_Object c;
506 register Lisp_Object tem;
507 register Lisp_Object cmd;
508 int metized = 0;
509 int length;
d09b2024 510 struct gcpro gcpro1, gcpro2, gcpro3;
2c6f1a39
JB
511
512 keymap = get_keymap (keymap);
513
514 if (XTYPE (key) != Lisp_Vector
515 && XTYPE (key) != Lisp_String)
516 key = wrong_type_argument (Qarrayp, key);
517
d09b2024 518 length = XFASTINT (Flength (key));
2c6f1a39
JB
519 if (length == 0)
520 return Qnil;
521
d09b2024
JB
522 GCPRO3 (keymap, key, def);
523
2c6f1a39
JB
524 idx = 0;
525 while (1)
526 {
527 c = Faref (key, make_number (idx));
528
529 if (XTYPE (c) == Lisp_Int
530 && XINT (c) >= 0200
531 && !metized)
532 {
533 c = meta_prefix_char;
534 metized = 1;
535 }
536 else
537 {
538 if (XTYPE (c) == Lisp_Int)
539 XSETINT (c, XINT (c) & 0177);
540
541 metized = 0;
542 idx++;
543 }
544
545 if (idx == length)
d09b2024 546 RETURN_UNGCPRO (store_in_keymap (keymap, c, def));
2c6f1a39 547
e25c4e44 548 cmd = get_keyelt (access_keymap (keymap, c, 0));
2c6f1a39 549
265a9e55 550 if (NILP (cmd))
2c6f1a39 551 {
ce6e5d0b 552 cmd = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
553 store_in_keymap (keymap, c, cmd);
554 }
555
d09b2024
JB
556 keymap = get_keymap_1 (cmd, 0, 1);
557 if (NILP (keymap))
dbc4e1c1
JB
558 {
559 /* We must use Fkey_description rather than just passing key to
560 error; key might be a vector, not a string. */
561 Lisp_Object description = Fkey_description (key);
562
563 error ("Key sequence %s uses invalid prefix characters",
564 XSTRING (description)->data);
565 }
2c6f1a39
JB
566 }
567}
568
569/* Value is number if KEY is too long; NIL if valid but has no definition. */
570
7c140252 571DEFUN ("lookup-key", Flookup_key, Slookup_key, 2, 3, 0,
2c6f1a39
JB
572 "In keymap KEYMAP, look up key sequence KEY. Return the definition.\n\
573nil means undefined. See doc of `define-key' for kinds of definitions.\n\
7c140252 574\n\
2c6f1a39
JB
575A number as value means KEY is \"too long\";\n\
576that is, characters or symbols in it except for the last one\n\
577fail to be a valid sequence of prefix characters in KEYMAP.\n\
578The number is how many characters at the front of KEY\n\
7c140252
JB
579it takes to reach a non-prefix command.\n\
580\n\
581Normally, `lookup-key' ignores bindings for t, which act as default\n\
582bindings, used when nothing else in the keymap applies; this makes it\n\
583useable as a general function for probing keymaps. However, if the\n\
584third optional argument ACCEPT-DEFAULT is non-nil, `lookup-key' will\n\
585recognize the default bindings, just as `read-key-sequence' does.")
586 (keymap, key, accept_default)
2c6f1a39
JB
587 register Lisp_Object keymap;
588 Lisp_Object key;
7c140252 589 Lisp_Object accept_default;
2c6f1a39
JB
590{
591 register int idx;
592 register Lisp_Object tem;
593 register Lisp_Object cmd;
594 register Lisp_Object c;
595 int metized = 0;
596 int length;
7c140252 597 int t_ok = ! NILP (accept_default);
2c6f1a39
JB
598
599 keymap = get_keymap (keymap);
600
601 if (XTYPE (key) != Lisp_Vector
602 && XTYPE (key) != Lisp_String)
603 key = wrong_type_argument (Qarrayp, key);
604
d09b2024 605 length = XFASTINT (Flength (key));
2c6f1a39
JB
606 if (length == 0)
607 return keymap;
608
609 idx = 0;
610 while (1)
611 {
612 c = Faref (key, make_number (idx));
613
614 if (XTYPE (c) == Lisp_Int
615 && XINT (c) >= 0200
616 && !metized)
617 {
618 c = meta_prefix_char;
619 metized = 1;
620 }
621 else
622 {
623 if (XTYPE (c) == Lisp_Int)
624 XSETINT (c, XINT (c) & 0177);
625
626 metized = 0;
627 idx++;
628 }
629
7c140252 630 cmd = get_keyelt (access_keymap (keymap, c, t_ok));
2c6f1a39
JB
631 if (idx == length)
632 return cmd;
633
d09b2024
JB
634 keymap = get_keymap_1 (cmd, 0, 0);
635 if (NILP (keymap))
2c6f1a39
JB
636 return make_number (idx);
637
2c6f1a39
JB
638 QUIT;
639 }
640}
641
642/* Append a key to the end of a key sequence. If key_sequence is a
643 string and key is a character, the result will be another string;
644 otherwise, it will be a vector. */
645Lisp_Object
646append_key (key_sequence, key)
647 Lisp_Object key_sequence, key;
648{
649 Lisp_Object args[2];
650
651 args[0] = key_sequence;
652
653 if (XTYPE (key_sequence) == Lisp_String
654 && XTYPE (key) == Lisp_Int)
655 {
656 args[1] = Fchar_to_string (key);
657 return Fconcat (2, args);
658 }
659 else
660 {
661 args[1] = Fcons (key, Qnil);
662 return Fvconcat (2, args);
663 }
664}
665
666\f
cc0a8174
JB
667/* Global, local, and minor mode keymap stuff. */
668
265a9e55 669/* We can't put these variables inside current_minor_maps, since under
6bbbd9b0
JB
670 some systems, static gets macro-defined to be the empty string.
671 Ickypoo. */
265a9e55
JB
672static Lisp_Object *cmm_modes, *cmm_maps;
673static int cmm_size;
674
cc0a8174
JB
675/* Store a pointer to an array of the keymaps of the currently active
676 minor modes in *buf, and return the number of maps it contains.
677
678 This function always returns a pointer to the same buffer, and may
679 free or reallocate it, so if you want to keep it for a long time or
680 hand it out to lisp code, copy it. This procedure will be called
681 for every key sequence read, so the nice lispy approach (return a
682 new assoclist, list, what have you) for each invocation would
683 result in a lot of consing over time.
684
685 If we used xrealloc/xmalloc and ran out of memory, they would throw
686 back to the command loop, which would try to read a key sequence,
687 which would call this function again, resulting in an infinite
688 loop. Instead, we'll use realloc/malloc and silently truncate the
689 list, let the key sequence be read, and hope some other piece of
690 code signals the error. */
691int
692current_minor_maps (modeptr, mapptr)
693 Lisp_Object **modeptr, **mapptr;
694{
cc0a8174 695 int i = 0;
6bbbd9b0 696 Lisp_Object alist, assoc, var, val;
cc0a8174
JB
697
698 for (alist = Vminor_mode_map_alist;
699 CONSP (alist);
700 alist = XCONS (alist)->cdr)
701 if (CONSP (assoc = XCONS (alist)->car)
702 && XTYPE (var = XCONS (assoc)->car) == Lisp_Symbol
6bbbd9b0
JB
703 && ! EQ ((val = find_symbol_value (var)), Qunbound)
704 && ! NILP (val))
cc0a8174 705 {
265a9e55 706 if (i >= cmm_size)
cc0a8174
JB
707 {
708 Lisp_Object *newmodes, *newmaps;
709
265a9e55 710 if (cmm_maps)
cc0a8174 711 {
265a9e55
JB
712 newmodes = (Lisp_Object *) realloc (cmm_modes, cmm_size *= 2);
713 newmaps = (Lisp_Object *) realloc (cmm_maps, cmm_size);
cc0a8174
JB
714 }
715 else
716 {
265a9e55
JB
717 newmodes = (Lisp_Object *) malloc (cmm_size = 30);
718 newmaps = (Lisp_Object *) malloc (cmm_size);
cc0a8174
JB
719 }
720
721 if (newmaps && newmodes)
722 {
265a9e55
JB
723 cmm_modes = newmodes;
724 cmm_maps = newmaps;
cc0a8174
JB
725 }
726 else
727 break;
728 }
265a9e55
JB
729 cmm_modes[i] = var;
730 cmm_maps [i] = XCONS (assoc)->cdr;
cc0a8174
JB
731 i++;
732 }
733
265a9e55
JB
734 if (modeptr) *modeptr = cmm_modes;
735 if (mapptr) *mapptr = cmm_maps;
cc0a8174
JB
736 return i;
737}
738
7c140252 739DEFUN ("key-binding", Fkey_binding, Skey_binding, 1, 2, 0,
2c6f1a39 740 "Return the binding for command KEY in current keymaps.\n\
7c140252
JB
741KEY is a string or vector, a sequence of keystrokes.\n\
742The binding is probably a symbol with a function definition.\n\
743\n\
744Normally, `key-binding' ignores bindings for t, which act as default\n\
745bindings, used when nothing else in the keymap applies; this makes it\n\
746useable as a general function for probing keymaps. However, if the\n\
747third optional argument ACCEPT-DEFAULT is non-nil, `key-binding' will\n\
748recognize the default bindings, just as `read-key-sequence' does.")
749 (key, accept_default)
2c6f1a39
JB
750 Lisp_Object key;
751{
cc0a8174
JB
752 Lisp_Object *maps, value;
753 int nmaps, i;
754
755 nmaps = current_minor_maps (0, &maps);
756 for (i = 0; i < nmaps; i++)
265a9e55 757 if (! NILP (maps[i]))
cc0a8174 758 {
7c140252 759 value = Flookup_key (maps[i], key, accept_default);
265a9e55 760 if (! NILP (value) && XTYPE (value) != Lisp_Int)
cc0a8174
JB
761 return value;
762 }
763
265a9e55 764 if (! NILP (current_buffer->keymap))
2c6f1a39 765 {
7c140252 766 value = Flookup_key (current_buffer->keymap, key, accept_default);
265a9e55 767 if (! NILP (value) && XTYPE (value) != Lisp_Int)
2c6f1a39
JB
768 return value;
769 }
cc0a8174 770
7c140252 771 value = Flookup_key (current_global_map, key, accept_default);
265a9e55 772 if (! NILP (value) && XTYPE (value) != Lisp_Int)
cc0a8174
JB
773 return value;
774
775 return Qnil;
2c6f1a39
JB
776}
777
7c140252 778DEFUN ("local-key-binding", Flocal_key_binding, Slocal_key_binding, 1, 2, 0,
2c6f1a39
JB
779 "Return the binding for command KEYS in current local keymap only.\n\
780KEYS is a string, a sequence of keystrokes.\n\
7c140252
JB
781The binding is probably a symbol with a function definition.\n\
782\n\
783If optional argument ACCEPT-DEFAULT is non-nil, recognize default\n\
784bindings; see the description of `lookup-key' for more details about this.")
785 (keys, accept_default)
786 Lisp_Object keys, accept_default;
2c6f1a39
JB
787{
788 register Lisp_Object map;
789 map = current_buffer->keymap;
265a9e55 790 if (NILP (map))
2c6f1a39 791 return Qnil;
7c140252 792 return Flookup_key (map, keys, accept_default);
2c6f1a39
JB
793}
794
7c140252 795DEFUN ("global-key-binding", Fglobal_key_binding, Sglobal_key_binding, 1, 2, 0,
2c6f1a39
JB
796 "Return the binding for command KEYS in current global keymap only.\n\
797KEYS is a string, a sequence of keystrokes.\n\
6bbbd9b0
JB
798The binding is probably a symbol with a function definition.\n\
799This function's return values are the same as those of lookup-key\n\
7c140252
JB
800(which see).\n\
801\n\
802If optional argument ACCEPT-DEFAULT is non-nil, recognize default\n\
803bindings; see the description of `lookup-key' for more details about this.")
804 (keys, accept_default)
805 Lisp_Object keys, accept_default;
2c6f1a39 806{
7c140252 807 return Flookup_key (current_global_map, keys, accept_default);
2c6f1a39
JB
808}
809
7c140252 810DEFUN ("minor-mode-key-binding", Fminor_mode_key_binding, Sminor_mode_key_binding, 1, 2, 0,
cc0a8174
JB
811 "Find the visible minor mode bindings of KEY.\n\
812Return an alist of pairs (MODENAME . BINDING), where MODENAME is the\n\
813the symbol which names the minor mode binding KEY, and BINDING is\n\
814KEY's definition in that mode. In particular, if KEY has no\n\
815minor-mode bindings, return nil. If the first binding is a\n\
816non-prefix, all subsequent bindings will be omitted, since they would\n\
817be ignored. Similarly, the list doesn't include non-prefix bindings\n\
7c140252
JB
818that come after prefix bindings.\n\
819\n\
820If optional argument ACCEPT-DEFAULT is non-nil, recognize default\n\
821bindings; see the description of `lookup-key' for more details about this.")
822 (key, accept_default)
823 Lisp_Object key, accept_default;
cc0a8174
JB
824{
825 Lisp_Object *modes, *maps;
826 int nmaps;
827 Lisp_Object binding;
828 int i, j;
829
830 nmaps = current_minor_maps (&modes, &maps);
831
832 for (i = j = 0; i < nmaps; i++)
265a9e55 833 if (! NILP (maps[i])
7c140252 834 && ! NILP (binding = Flookup_key (maps[i], key, accept_default))
cc0a8174
JB
835 && XTYPE (binding) != Lisp_Int)
836 {
d09b2024 837 if (! NILP (get_keymap (binding)))
cc0a8174
JB
838 maps[j++] = Fcons (modes[i], binding);
839 else if (j == 0)
840 return Fcons (Fcons (modes[i], binding), Qnil);
841 }
842
843 return Flist (j, maps);
844}
845
2c6f1a39
JB
846DEFUN ("global-set-key", Fglobal_set_key, Sglobal_set_key, 2, 2,
847 "kSet key globally: \nCSet key %s to command: ",
848 "Give KEY a global binding as COMMAND.\n\
849COMMAND is a symbol naming an interactively-callable function.\n\
850KEY is a string representing a sequence of keystrokes.\n\
851Note that if KEY has a local binding in the current buffer\n\
852that local binding will continue to shadow any global binding.")
853 (keys, function)
854 Lisp_Object keys, function;
855{
856 if (XTYPE (keys) != Lisp_Vector
857 && XTYPE (keys) != Lisp_String)
858 keys = wrong_type_argument (Qarrayp, keys);
859
860 Fdefine_key (current_global_map, keys, function);
861 return Qnil;
862}
863
864DEFUN ("local-set-key", Flocal_set_key, Slocal_set_key, 2, 2,
865 "kSet key locally: \nCSet key %s locally to command: ",
866 "Give KEY a local binding as COMMAND.\n\
867COMMAND is a symbol naming an interactively-callable function.\n\
868KEY is a string representing a sequence of keystrokes.\n\
869The binding goes in the current buffer's local map,\n\
870which is shared with other buffers in the same major mode.")
871 (keys, function)
872 Lisp_Object keys, function;
873{
874 register Lisp_Object map;
875 map = current_buffer->keymap;
265a9e55 876 if (NILP (map))
2c6f1a39 877 {
ce6e5d0b 878 map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
879 current_buffer->keymap = map;
880 }
881
882 if (XTYPE (keys) != Lisp_Vector
883 && XTYPE (keys) != Lisp_String)
884 keys = wrong_type_argument (Qarrayp, keys);
885
886 Fdefine_key (map, keys, function);
887 return Qnil;
888}
889
890DEFUN ("global-unset-key", Fglobal_unset_key, Sglobal_unset_key,
891 1, 1, "kUnset key globally: ",
892 "Remove global binding of KEY.\n\
893KEY is a string representing a sequence of keystrokes.")
894 (keys)
895 Lisp_Object keys;
896{
897 return Fglobal_set_key (keys, Qnil);
898}
899
900DEFUN ("local-unset-key", Flocal_unset_key, Slocal_unset_key, 1, 1,
901 "kUnset key locally: ",
902 "Remove local binding of KEY.\n\
903KEY is a string representing a sequence of keystrokes.")
904 (keys)
905 Lisp_Object keys;
906{
265a9e55 907 if (!NILP (current_buffer->keymap))
2c6f1a39
JB
908 Flocal_set_key (keys, Qnil);
909 return Qnil;
910}
911
912DEFUN ("define-prefix-command", Fdefine_prefix_command, Sdefine_prefix_command, 1, 2, 0,
913 "Define COMMAND as a prefix command.\n\
914A new sparse keymap is stored as COMMAND's function definition and its value.\n\
1d8d96fa
JB
915If a second optional argument MAPVAR is given, the map is stored as\n\
916its value instead of as COMMAND's value; but COMMAND is still defined\n\
917as a function.")
2c6f1a39
JB
918 (name, mapvar)
919 Lisp_Object name, mapvar;
920{
921 Lisp_Object map;
ce6e5d0b 922 map = Fmake_sparse_keymap (Qnil);
2c6f1a39 923 Ffset (name, map);
265a9e55 924 if (!NILP (mapvar))
2c6f1a39
JB
925 Fset (mapvar, map);
926 else
927 Fset (name, map);
928 return name;
929}
930
931DEFUN ("use-global-map", Fuse_global_map, Suse_global_map, 1, 1, 0,
932 "Select KEYMAP as the global keymap.")
933 (keymap)
934 Lisp_Object keymap;
935{
936 keymap = get_keymap (keymap);
937 current_global_map = keymap;
938 return Qnil;
939}
940
941DEFUN ("use-local-map", Fuse_local_map, Suse_local_map, 1, 1, 0,
942 "Select KEYMAP as the local keymap.\n\
943If KEYMAP is nil, that means no local keymap.")
944 (keymap)
945 Lisp_Object keymap;
946{
265a9e55 947 if (!NILP (keymap))
2c6f1a39
JB
948 keymap = get_keymap (keymap);
949
950 current_buffer->keymap = keymap;
951
952 return Qnil;
953}
954
955DEFUN ("current-local-map", Fcurrent_local_map, Scurrent_local_map, 0, 0, 0,
956 "Return current buffer's local keymap, or nil if it has none.")
957 ()
958{
959 return current_buffer->keymap;
960}
961
962DEFUN ("current-global-map", Fcurrent_global_map, Scurrent_global_map, 0, 0, 0,
963 "Return the current global keymap.")
964 ()
965{
966 return current_global_map;
967}
cc0a8174
JB
968
969DEFUN ("current-minor-mode-maps", Fcurrent_minor_mode_maps, Scurrent_minor_mode_maps, 0, 0, 0,
970 "Return a list of keymaps for the minor modes of the current buffer.")
971 ()
972{
973 Lisp_Object *maps;
974 int nmaps = current_minor_maps (0, &maps);
975
976 return Flist (nmaps, maps);
977}
2c6f1a39 978\f
cc0a8174
JB
979/* Help functions for describing and documenting keymaps. */
980
2c6f1a39
JB
981DEFUN ("accessible-keymaps", Faccessible_keymaps, Saccessible_keymaps,
982 1, 1, 0,
983 "Find all keymaps accessible via prefix characters from KEYMAP.\n\
984Returns a list of elements of the form (KEYS . MAP), where the sequence\n\
985KEYS starting from KEYMAP gets you to MAP. These elements are ordered\n\
986so that the KEYS increase in length. The first element is (\"\" . KEYMAP).")
987 (startmap)
988 Lisp_Object startmap;
989{
990 Lisp_Object maps, tail;
991
992 maps = Fcons (Fcons (build_string (""), get_keymap (startmap)), Qnil);
2c6f1a39
JB
993
994 /* For each map in the list maps,
995 look at any other maps it points to,
996 and stick them at the end if they are not already in the list.
997
998 This is a breadth-first traversal, where tail is the queue of
999 nodes, and maps accumulates a list of all nodes visited. */
1000
f5b79c1c 1001 for (tail = maps; CONSP (tail); tail = XCONS (tail)->cdr)
2c6f1a39
JB
1002 {
1003 register Lisp_Object thisseq = Fcar (Fcar (tail));
1004 register Lisp_Object thismap = Fcdr (Fcar (tail));
1005 Lisp_Object last = make_number (XINT (Flength (thisseq)) - 1);
1006
1007 /* Does the current sequence end in the meta-prefix-char? */
1008 int is_metized = (XINT (last) >= 0
1009 && EQ (Faref (thisseq, last), meta_prefix_char));
1010
f5b79c1c 1011 for (; CONSP (thismap); thismap = XCONS (thismap)->cdr)
2c6f1a39 1012 {
f5b79c1c 1013 Lisp_Object elt = XCONS (thismap)->car;
2c6f1a39 1014
f5b79c1c
JB
1015 QUIT;
1016
1017 if (XTYPE (elt) == Lisp_Vector)
2c6f1a39
JB
1018 {
1019 register int i;
1020
1021 /* Vector keymap. Scan all the elements. */
1022 for (i = 0; i < DENSE_TABLE_SIZE; i++)
1023 {
1024 register Lisp_Object tem;
1025 register Lisp_Object cmd;
1026
f5b79c1c 1027 cmd = get_keyelt (XVECTOR (elt)->contents[i]);
265a9e55 1028 if (NILP (cmd)) continue;
2c6f1a39 1029 tem = Fkeymapp (cmd);
265a9e55 1030 if (!NILP (tem))
2c6f1a39
JB
1031 {
1032 cmd = get_keymap (cmd);
1033 /* Ignore keymaps that are already added to maps. */
1034 tem = Frassq (cmd, maps);
265a9e55 1035 if (NILP (tem))
2c6f1a39
JB
1036 {
1037 /* If the last key in thisseq is meta-prefix-char,
1038 turn it into a meta-ized keystroke. We know
1039 that the event we're about to append is an
f5b79c1c
JB
1040 ascii keystroke since we're processing a
1041 keymap table. */
2c6f1a39
JB
1042 if (is_metized)
1043 {
1044 tem = Fcopy_sequence (thisseq);
1045 Faset (tem, last, make_number (i | 0200));
1046
1047 /* This new sequence is the same length as
1048 thisseq, so stick it in the list right
1049 after this one. */
1050 XCONS (tail)->cdr =
1051 Fcons (Fcons (tem, cmd), XCONS (tail)->cdr);
1052 }
1053 else
1054 {
1055 tem = append_key (thisseq, make_number (i));
1056 nconc2 (tail, Fcons (Fcons (tem, cmd), Qnil));
1057 }
1058 }
1059 }
1060 }
f5b79c1c
JB
1061 }
1062 else if (CONSP (elt))
2c6f1a39
JB
1063 {
1064 register Lisp_Object cmd = get_keyelt (XCONS (elt)->cdr);
1065 register Lisp_Object tem;
1066
1067 /* Ignore definitions that aren't keymaps themselves. */
1068 tem = Fkeymapp (cmd);
265a9e55 1069 if (!NILP (tem))
2c6f1a39
JB
1070 {
1071 /* Ignore keymaps that have been seen already. */
1072 cmd = get_keymap (cmd);
1073 tem = Frassq (cmd, maps);
265a9e55 1074 if (NILP (tem))
2c6f1a39
JB
1075 {
1076 /* let elt be the event defined by this map entry. */
1077 elt = XCONS (elt)->car;
1078
1079 /* If the last key in thisseq is meta-prefix-char, and
1080 this entry is a binding for an ascii keystroke,
1081 turn it into a meta-ized keystroke. */
1082 if (is_metized && XTYPE (elt) == Lisp_Int)
1083 {
1084 tem = Fcopy_sequence (thisseq);
1085 Faset (tem, last, make_number (XINT (elt) | 0200));
1086
1087 /* This new sequence is the same length as
1088 thisseq, so stick it in the list right
1089 after this one. */
1090 XCONS (tail)->cdr =
1091 Fcons (Fcons (tem, cmd), XCONS (tail)->cdr);
1092 }
1093 else
1094 nconc2 (tail,
1095 Fcons (Fcons (append_key (thisseq, elt), cmd),
1096 Qnil));
1097 }
1098 }
1099 }
2c6f1a39 1100 }
2c6f1a39
JB
1101 }
1102
1103 return maps;
1104}
1105
1106Lisp_Object Qsingle_key_description, Qkey_description;
1107
1108DEFUN ("key-description", Fkey_description, Skey_description, 1, 1, 0,
1109 "Return a pretty description of key-sequence KEYS.\n\
1110Control characters turn into \"C-foo\" sequences, meta into \"M-foo\"\n\
1111spaces are put between sequence elements, etc.")
1112 (keys)
1113 Lisp_Object keys;
1114{
1115 return Fmapconcat (Qsingle_key_description, keys, build_string (" "));
1116}
1117
1118char *
1119push_key_description (c, p)
1120 register unsigned int c;
1121 register char *p;
1122{
1123 if (c >= 0200)
1124 {
1125 *p++ = 'M';
1126 *p++ = '-';
1127 c -= 0200;
1128 }
1129 if (c < 040)
1130 {
1131 if (c == 033)
1132 {
1133 *p++ = 'E';
1134 *p++ = 'S';
1135 *p++ = 'C';
1136 }
1137 else if (c == Ctl('I'))
1138 {
1139 *p++ = 'T';
1140 *p++ = 'A';
1141 *p++ = 'B';
1142 }
1143 else if (c == Ctl('J'))
1144 {
1145 *p++ = 'L';
1146 *p++ = 'F';
1147 *p++ = 'D';
1148 }
1149 else if (c == Ctl('M'))
1150 {
1151 *p++ = 'R';
1152 *p++ = 'E';
1153 *p++ = 'T';
1154 }
1155 else
1156 {
1157 *p++ = 'C';
1158 *p++ = '-';
1159 if (c > 0 && c <= Ctl ('Z'))
1160 *p++ = c + 0140;
1161 else
1162 *p++ = c + 0100;
1163 }
1164 }
1165 else if (c == 0177)
1166 {
1167 *p++ = 'D';
1168 *p++ = 'E';
1169 *p++ = 'L';
1170 }
1171 else if (c == ' ')
1172 {
1173 *p++ = 'S';
1174 *p++ = 'P';
1175 *p++ = 'C';
1176 }
1177 else
1178 *p++ = c;
1179
1180 return p;
1181}
1182
1183DEFUN ("single-key-description", Fsingle_key_description, Ssingle_key_description, 1, 1, 0,
1184 "Return a pretty description of command character KEY.\n\
1185Control characters turn into C-whatever, etc.")
1186 (key)
1187 Lisp_Object key;
1188{
1189 register unsigned char c;
1190 char tem[6];
1191
cebd887d 1192 key = EVENT_HEAD (key);
6bbbd9b0 1193
2c6f1a39
JB
1194 switch (XTYPE (key))
1195 {
1196 case Lisp_Int: /* Normal character */
1197 c = XINT (key) & 0377;
1198 *push_key_description (c, tem) = 0;
1199 return build_string (tem);
1200
1201 case Lisp_Symbol: /* Function key or event-symbol */
1202 return Fsymbol_name (key);
1203
2c6f1a39
JB
1204 default:
1205 error ("KEY must be an integer, cons, or symbol.");
1206 }
1207}
1208
1209char *
1210push_text_char_description (c, p)
1211 register unsigned int c;
1212 register char *p;
1213{
1214 if (c >= 0200)
1215 {
1216 *p++ = 'M';
1217 *p++ = '-';
1218 c -= 0200;
1219 }
1220 if (c < 040)
1221 {
1222 *p++ = '^';
1223 *p++ = c + 64; /* 'A' - 1 */
1224 }
1225 else if (c == 0177)
1226 {
1227 *p++ = '^';
1228 *p++ = '?';
1229 }
1230 else
1231 *p++ = c;
1232 return p;
1233}
1234
1235DEFUN ("text-char-description", Ftext_char_description, Stext_char_description, 1, 1, 0,
1236 "Return a pretty description of file-character CHAR.\n\
1237Control characters turn into \"^char\", etc.")
1238 (chr)
1239 Lisp_Object chr;
1240{
1241 char tem[6];
1242
1243 CHECK_NUMBER (chr, 0);
1244
1245 *push_text_char_description (XINT (chr) & 0377, tem) = 0;
1246
1247 return build_string (tem);
1248}
1249\f
cc0a8174
JB
1250/* where-is - finding a command in a set of keymaps. */
1251
2c6f1a39
JB
1252DEFUN ("where-is-internal", Fwhere_is_internal, Swhere_is_internal, 1, 5, 0,
1253 "Return list of keys that invoke DEFINITION in KEYMAP or KEYMAP1.\n\
1254If KEYMAP is nil, search only KEYMAP1.\n\
1255If KEYMAP1 is nil, use the current global map.\n\
1256\n\
1257If optional 4th arg FIRSTONLY is non-nil,\n\
1258return a string representing the first key sequence found,\n\
1259rather than a list of all possible key sequences.\n\
1260\n\
1261If optional 5th arg NOINDIRECT is non-nil, don't follow indirections\n\
1262to other keymaps or slots. This makes it possible to search for an\n\
1263indirect definition itself.")
1264 (definition, local_keymap, global_keymap, firstonly, noindirect)
1265 Lisp_Object definition, local_keymap, global_keymap;
1266 Lisp_Object firstonly, noindirect;
1267{
1268 register Lisp_Object maps;
1269 Lisp_Object found;
1270
265a9e55 1271 if (NILP (global_keymap))
2c6f1a39
JB
1272 global_keymap = current_global_map;
1273
265a9e55 1274 if (!NILP (local_keymap))
2c6f1a39
JB
1275 maps = nconc2 (Faccessible_keymaps (get_keymap (local_keymap)),
1276 Faccessible_keymaps (get_keymap (global_keymap)));
1277 else
1278 maps = Faccessible_keymaps (get_keymap (global_keymap));
1279
1280 found = Qnil;
1281
265a9e55 1282 for (; !NILP (maps); maps = Fcdr (maps))
2c6f1a39 1283 {
f5b79c1c
JB
1284 /* Key sequence to reach map */
1285 register Lisp_Object this = Fcar (Fcar (maps));
1286
1287 /* The map that it reaches */
1288 register Lisp_Object map = Fcdr (Fcar (maps));
1289
1290 /* If Fcar (map) is a VECTOR, the current element within that vector. */
1291 int i = 0;
2c6f1a39
JB
1292
1293 /* In order to fold [META-PREFIX-CHAR CHAR] sequences into
1294 [M-CHAR] sequences, check if last character of the sequence
1295 is the meta-prefix char. */
1296 Lisp_Object last = make_number (XINT (Flength (this)) - 1);
1297 int last_is_meta = (XINT (last) >= 0
1298 && EQ (Faref (this, last), meta_prefix_char));
2c6f1a39 1299
fde3a52f
JB
1300 QUIT;
1301
f5b79c1c 1302 while (CONSP (map))
2c6f1a39 1303 {
f5b79c1c
JB
1304 /* Because the code we want to run on each binding is rather
1305 large, we don't want to have two separate loop bodies for
1306 sparse keymap bindings and tables; we want to iterate one
1307 loop body over both keymap and vector bindings.
1308
1309 For this reason, if Fcar (map) is a vector, we don't
1310 advance map to the next element until i indicates that we
1311 have finished off the vector. */
2c6f1a39 1312
f5b79c1c
JB
1313 Lisp_Object elt = XCONS (map)->car;
1314 Lisp_Object key, binding, sequence;
1315
fde3a52f
JB
1316 QUIT;
1317
f5b79c1c
JB
1318 /* Set key and binding to the current key and binding, and
1319 advance map and i to the next binding. */
1320 if (XTYPE (elt) == Lisp_Vector)
2c6f1a39
JB
1321 {
1322 /* In a vector, look at each element. */
f5b79c1c 1323 binding = XVECTOR (elt)->contents[i];
2c6f1a39
JB
1324 XFASTINT (key) = i;
1325 i++;
1326
f5b79c1c
JB
1327 /* If we've just finished scanning a vector, advance map
1328 to the next element, and reset i in anticipation of the
1329 next vector we may find. */
2c6f1a39 1330 if (i >= DENSE_TABLE_SIZE)
2c6f1a39 1331 {
f5b79c1c
JB
1332 map = XCONS (map)->cdr;
1333 i = 0;
2c6f1a39 1334 }
f5b79c1c
JB
1335 }
1336 else if (CONSP (elt))
1337 {
2c6f1a39 1338 key = Fcar (Fcar (map));
f5b79c1c
JB
1339 binding = Fcdr (Fcar (map));
1340
1341 map = XCONS (map)->cdr;
2c6f1a39
JB
1342 }
1343 else
f5b79c1c
JB
1344 /* We want to ignore keymap elements that are neither
1345 vectors nor conses. */
fde3a52f
JB
1346 {
1347 map = XCONS (map)->cdr;
1348 continue;
1349 }
2c6f1a39
JB
1350
1351 /* Search through indirections unless that's not wanted. */
265a9e55 1352 if (NILP (noindirect))
2c6f1a39
JB
1353 binding = get_keyelt (binding);
1354
1355 /* End this iteration if this element does not match
1356 the target. */
1357
1358 if (XTYPE (definition) == Lisp_Cons)
1359 {
1360 Lisp_Object tem;
1361 tem = Fequal (binding, definition);
265a9e55 1362 if (NILP (tem))
2c6f1a39
JB
1363 continue;
1364 }
1365 else
1366 if (!EQ (binding, definition))
1367 continue;
1368
1369 /* We have found a match.
1370 Construct the key sequence where we found it. */
1371 if (XTYPE (key) == Lisp_Int && last_is_meta)
1372 {
1373 sequence = Fcopy_sequence (this);
1374 Faset (sequence, last, make_number (XINT (key) | 0200));
1375 }
1376 else
1377 sequence = append_key (this, key);
1378
1379 /* Verify that this key binding is not shadowed by another
1380 binding for the same key, before we say it exists.
1381
1382 Mechanism: look for local definition of this key and if
1383 it is defined and does not match what we found then
1384 ignore this key.
1385
1386 Either nil or number as value from Flookup_key
1387 means undefined. */
265a9e55 1388 if (!NILP (local_keymap))
2c6f1a39 1389 {
7c140252 1390 binding = Flookup_key (local_keymap, sequence, Qnil);
265a9e55 1391 if (!NILP (binding) && XTYPE (binding) != Lisp_Int)
2c6f1a39
JB
1392 {
1393 if (XTYPE (definition) == Lisp_Cons)
1394 {
1395 Lisp_Object tem;
1396 tem = Fequal (binding, definition);
265a9e55 1397 if (NILP (tem))
2c6f1a39
JB
1398 continue;
1399 }
1400 else
1401 if (!EQ (binding, definition))
1402 continue;
1403 }
1404 }
1405
1406 /* It is a true unshadowed match. Record it. */
1407
265a9e55 1408 if (!NILP (firstonly))
2c6f1a39
JB
1409 return sequence;
1410 found = Fcons (sequence, found);
1411 }
1412 }
1413 return Fnreverse (found);
1414}
1415
1416/* Return a string listing the keys and buttons that run DEFINITION. */
1417
1418static Lisp_Object
1419where_is_string (definition)
1420 Lisp_Object definition;
1421{
1422 register Lisp_Object keys, keys1;
1423
1424 keys = Fwhere_is_internal (definition,
1425 current_buffer->keymap, Qnil, Qnil, Qnil);
1426 keys1 = Fmapconcat (Qkey_description, keys, build_string (", "));
1427
1428 return keys1;
1429}
1430
1431DEFUN ("where-is", Fwhere_is, Swhere_is, 1, 1, "CWhere is command: ",
1432 "Print message listing key sequences that invoke specified command.\n\
1433Argument is a command definition, usually a symbol with a function definition.")
1434 (definition)
1435 Lisp_Object definition;
1436{
1437 register Lisp_Object string;
1438
1439 CHECK_SYMBOL (definition, 0);
1440 string = where_is_string (definition);
1441
1442 if (XSTRING (string)->size)
1443 message ("%s is on %s", XSYMBOL (definition)->name->data,
1444 XSTRING (string)->data);
1445 else
1446 message ("%s is not on any key", XSYMBOL (definition)->name->data);
1447 return Qnil;
1448}
1449\f
cc0a8174
JB
1450/* describe-bindings - summarizing all the bindings in a set of keymaps. */
1451
2c6f1a39
JB
1452DEFUN ("describe-bindings", Fdescribe_bindings, Sdescribe_bindings, 0, 0, "",
1453 "Show a list of all defined keys, and their definitions.\n\
1454The list is put in a buffer, which is displayed.")
1455 ()
1456{
1457 register Lisp_Object thisbuf;
1458 XSET (thisbuf, Lisp_Buffer, current_buffer);
1459 internal_with_output_to_temp_buffer ("*Help*",
1460 describe_buffer_bindings,
1461 thisbuf);
1462 return Qnil;
1463}
1464
1465static Lisp_Object
1466describe_buffer_bindings (descbuf)
1467 Lisp_Object descbuf;
1468{
1469 register Lisp_Object start1, start2;
1470
4726a9f1
JB
1471 char *key_heading
1472 = "\
1473key binding\n\
1474--- -------\n";
1475 char *alternate_heading
1476 = "\
1477Alternate Characters (use anywhere the nominal character is listed):\n\
1478nominal alternate\n\
1479------- ---------\n";
2c6f1a39
JB
1480
1481 Fset_buffer (Vstandard_output);
1482
4726a9f1
JB
1483 /* Report on alternates for keys. */
1484 if (XTYPE (Vkeyboard_translate_table) == Lisp_String)
1485 {
1486 int c;
1487 unsigned char *translate = XSTRING (Vkeyboard_translate_table)->data;
1488 int translate_len = XSTRING (Vkeyboard_translate_table)->size;
1489
1490 for (c = 0; c < translate_len; c++)
1491 if (translate[c] != c)
1492 {
1493 char buf[20];
1494 char *bufend;
1495
1496 if (alternate_heading)
1497 {
1498 insert_string (alternate_heading);
1499 alternate_heading = 0;
1500 }
1501
1502 bufend = push_key_description (translate[c], buf);
1503 insert (buf, bufend - buf);
1504 Findent_to (make_number (16), make_number (1));
1505 bufend = push_key_description (c, buf);
1506 insert (buf, bufend - buf);
1507
1508 insert ("\n", 1);
1509 }
1510
1511 insert ("\n", 1);
1512 }
1513
cc0a8174
JB
1514 {
1515 int i, nmaps;
1516 Lisp_Object *modes, *maps;
1517
4726a9f1
JB
1518 /* Temporarily switch to descbuf, so that we can get that buffer's
1519 minor modes correctly. */
1520 Fset_buffer (descbuf);
cc0a8174 1521 nmaps = current_minor_maps (&modes, &maps);
4726a9f1
JB
1522 Fset_buffer (Vstandard_output);
1523
cc0a8174
JB
1524 for (i = 0; i < nmaps; i++)
1525 {
1526 if (XTYPE (modes[i]) == Lisp_Symbol)
1527 {
1528 insert_char ('`');
1529 insert_string (XSYMBOL (modes[i])->name->data);
1530 insert_char ('\'');
1531 }
1532 else
1533 insert_string ("Strangely Named");
1534 insert_string (" Minor Mode Bindings:\n");
4726a9f1 1535 insert_string (key_heading);
cc0a8174
JB
1536 describe_map_tree (maps[i], 0, Qnil);
1537 insert_char ('\n');
1538 }
1539 }
1540
2c6f1a39 1541 start1 = XBUFFER (descbuf)->keymap;
265a9e55 1542 if (!NILP (start1))
2c6f1a39
JB
1543 {
1544 insert_string ("Local Bindings:\n");
4726a9f1 1545 insert_string (key_heading);
cc0a8174 1546 describe_map_tree (start1, 0, Qnil);
2c6f1a39
JB
1547 insert_string ("\n");
1548 }
1549
1550 insert_string ("Global Bindings:\n");
4726a9f1
JB
1551 if (NILP (start1))
1552 insert_string (key_heading);
2c6f1a39 1553
cc0a8174 1554 describe_map_tree (current_global_map, 0, XBUFFER (descbuf)->keymap);
2c6f1a39
JB
1555
1556 Fset_buffer (descbuf);
1557 return Qnil;
1558}
1559
1560/* Insert a desription of the key bindings in STARTMAP,
1561 followed by those of all maps reachable through STARTMAP.
1562 If PARTIAL is nonzero, omit certain "uninteresting" commands
1563 (such as `undefined').
1564 If SHADOW is non-nil, it is another map;
1565 don't mention keys which would be shadowed by it. */
1566
1567void
1568describe_map_tree (startmap, partial, shadow)
1569 Lisp_Object startmap, shadow;
1570 int partial;
1571{
1572 register Lisp_Object elt, sh;
1573 Lisp_Object maps;
1574 struct gcpro gcpro1;
1575
1576 maps = Faccessible_keymaps (startmap);
1577 GCPRO1 (maps);
1578
265a9e55 1579 for (; !NILP (maps); maps = Fcdr (maps))
2c6f1a39
JB
1580 {
1581 elt = Fcar (maps);
1582 sh = Fcar (elt);
1583
1584 /* If there is no shadow keymap given, don't shadow. */
265a9e55 1585 if (NILP (shadow))
2c6f1a39
JB
1586 sh = Qnil;
1587
1588 /* If the sequence by which we reach this keymap is zero-length,
1589 then the shadow map for this keymap is just SHADOW. */
1590 else if ((XTYPE (sh) == Lisp_String
1591 && XSTRING (sh)->size == 0)
1592 || (XTYPE (sh) == Lisp_Vector
1593 && XVECTOR (sh)->size == 0))
1594 sh = shadow;
1595
1596 /* If the sequence by which we reach this keymap actually has
1597 some elements, then the sequence's definition in SHADOW is
1598 what we should use. */
1599 else
1600 {
7c140252 1601 sh = Flookup_key (shadow, Fcar (elt), Qt);
2c6f1a39
JB
1602 if (XTYPE (sh) == Lisp_Int)
1603 sh = Qnil;
1604 }
1605
1606 /* If sh is null (meaning that the current map is not shadowed),
1607 or a keymap (meaning that bindings from the current map might
1608 show through), describe the map. Otherwise, sh is a command
1609 that completely shadows the current map, and we shouldn't
1610 bother. */
265a9e55 1611 if (NILP (sh) || !NILP (Fkeymapp (sh)))
2c6f1a39
JB
1612 describe_map (Fcdr (elt), Fcar (elt), partial, sh);
1613 }
1614
1615 UNGCPRO;
1616}
1617
1618static void
1619describe_command (definition)
1620 Lisp_Object definition;
1621{
1622 register Lisp_Object tem1;
1623
1624 Findent_to (make_number (16), make_number (1));
1625
1626 if (XTYPE (definition) == Lisp_Symbol)
1627 {
1628 XSET (tem1, Lisp_String, XSYMBOL (definition)->name);
1629 insert1 (tem1);
1630 insert_string ("\n");
1631 }
1632 else
1633 {
1634 tem1 = Fkeymapp (definition);
265a9e55 1635 if (!NILP (tem1))
2c6f1a39
JB
1636 insert_string ("Prefix Command\n");
1637 else
1638 insert_string ("??\n");
1639 }
1640}
1641
1642/* Describe the contents of map MAP, assuming that this map itself is
1643 reached by the sequence of prefix keys KEYS (a string or vector).
1644 PARTIAL, SHADOW is as in `describe_map_tree' above. */
1645
1646static void
1647describe_map (map, keys, partial, shadow)
1648 Lisp_Object map, keys;
1649 int partial;
1650 Lisp_Object shadow;
1651{
1652 register Lisp_Object keysdesc;
1653
d09b2024 1654 if (!NILP (keys) && XFASTINT (Flength (keys)) > 0)
5cba3869
RS
1655 {
1656 Lisp_Object tem;
1657 /* Call Fkey_description first, to avoid GC bug for the other string. */
1658 tem = Fkey_description (keys);
1659 keysdesc = concat2 (tem, build_string (" "));
1660 }
2c6f1a39
JB
1661 else
1662 keysdesc = Qnil;
1663
f5b79c1c 1664 describe_map_2 (map, keysdesc, describe_command, partial, shadow);
2c6f1a39
JB
1665}
1666
f5b79c1c 1667/* Insert a description of KEYMAP into the current buffer. */
2c6f1a39
JB
1668
1669static void
f5b79c1c
JB
1670describe_map_2 (keymap, elt_prefix, elt_describer, partial, shadow)
1671 register Lisp_Object keymap;
2c6f1a39
JB
1672 Lisp_Object elt_prefix;
1673 int (*elt_describer) ();
1674 int partial;
1675 Lisp_Object shadow;
1676{
1677 Lisp_Object this;
1678 Lisp_Object tem1, tem2 = Qnil;
1679 Lisp_Object suppress;
1680 Lisp_Object kludge;
1681 int first = 1;
1682 struct gcpro gcpro1, gcpro2, gcpro3;
1683
1684 if (partial)
1685 suppress = intern ("suppress-keymap");
1686
1687 /* This vector gets used to present single keys to Flookup_key. Since
f5b79c1c 1688 that is done once per keymap element, we don't want to cons up a
2c6f1a39
JB
1689 fresh vector every time. */
1690 kludge = Fmake_vector (make_number (1), Qnil);
1691
1692 GCPRO3 (elt_prefix, tem2, kludge);
1693
f5b79c1c 1694 for (; CONSP (keymap); keymap = Fcdr (keymap))
2c6f1a39
JB
1695 {
1696 QUIT;
2c6f1a39 1697
f5b79c1c
JB
1698 if (XTYPE (XCONS (keymap)->car) == Lisp_Vector)
1699 describe_vector (XCONS (keymap)->car,
1700 elt_prefix, elt_describer, partial, shadow);
1701 else
2c6f1a39 1702 {
f5b79c1c
JB
1703 tem1 = Fcar_safe (Fcar (keymap));
1704 tem2 = get_keyelt (Fcdr_safe (Fcar (keymap)));
2c6f1a39 1705
f5b79c1c
JB
1706 /* Don't show undefined commands or suppressed commands. */
1707 if (NILP (tem2)) continue;
1708 if (XTYPE (tem2) == Lisp_Symbol && partial)
1709 {
1710 this = Fget (tem2, suppress);
1711 if (!NILP (this))
1712 continue;
1713 }
2c6f1a39 1714
f5b79c1c
JB
1715 /* Don't show a command that isn't really visible
1716 because a local definition of the same key shadows it. */
2c6f1a39 1717
f5b79c1c
JB
1718 if (!NILP (shadow))
1719 {
1720 Lisp_Object tem;
2c6f1a39 1721
f5b79c1c 1722 XVECTOR (kludge)->contents[0] = tem1;
7c140252 1723 tem = Flookup_key (shadow, kludge, Qt);
f5b79c1c
JB
1724 if (!NILP (tem)) continue;
1725 }
1726
1727 if (first)
1728 {
1729 insert ("\n", 1);
1730 first = 0;
1731 }
2c6f1a39 1732
f5b79c1c
JB
1733 if (!NILP (elt_prefix))
1734 insert1 (elt_prefix);
2c6f1a39 1735
f5b79c1c
JB
1736 /* THIS gets the string to describe the character TEM1. */
1737 this = Fsingle_key_description (tem1);
1738 insert1 (this);
2c6f1a39 1739
f5b79c1c
JB
1740 /* Print a description of the definition of this character.
1741 elt_describer will take care of spacing out far enough
1742 for alignment purposes. */
1743 (*elt_describer) (tem2);
1744 }
2c6f1a39
JB
1745 }
1746
1747 UNGCPRO;
1748}
1749
1750static int
1751describe_vector_princ (elt)
1752 Lisp_Object elt;
1753{
1754 Fprinc (elt, Qnil);
1755}
1756
1757DEFUN ("describe-vector", Fdescribe_vector, Sdescribe_vector, 1, 1, 0,
1758 "Print on `standard-output' a description of contents of VECTOR.\n\
1759This is text showing the elements of vector matched against indices.")
1760 (vector)
1761 Lisp_Object vector;
1762{
1763 CHECK_VECTOR (vector, 0);
92cc37e8 1764 describe_vector (vector, Qnil, describe_vector_princ, 0, Qnil);
2c6f1a39
JB
1765}
1766
1767describe_vector (vector, elt_prefix, elt_describer, partial, shadow)
1768 register Lisp_Object vector;
1769 Lisp_Object elt_prefix;
1770 int (*elt_describer) ();
1771 int partial;
1772 Lisp_Object shadow;
1773{
1774 Lisp_Object this;
1775 Lisp_Object dummy;
1776 Lisp_Object tem1, tem2;
1777 register int i;
1778 Lisp_Object suppress;
1779 Lisp_Object kludge;
1780 int first = 1;
1781 struct gcpro gcpro1, gcpro2, gcpro3;
1782
1783 tem1 = Qnil;
1784
1785 /* This vector gets used to present single keys to Flookup_key. Since
1786 that is done once per vector element, we don't want to cons up a
1787 fresh vector every time. */
1788 kludge = Fmake_vector (make_number (1), Qnil);
1789 GCPRO3 (elt_prefix, tem1, kludge);
1790
1791 if (partial)
1792 suppress = intern ("suppress-keymap");
1793
1794 for (i = 0; i < DENSE_TABLE_SIZE; i++)
1795 {
1796 QUIT;
1797 tem1 = get_keyelt (XVECTOR (vector)->contents[i]);
1798
265a9e55 1799 if (NILP (tem1)) continue;
2c6f1a39
JB
1800
1801 /* Don't mention suppressed commands. */
1802 if (XTYPE (tem1) == Lisp_Symbol && partial)
1803 {
1804 this = Fget (tem1, suppress);
265a9e55 1805 if (!NILP (this))
2c6f1a39
JB
1806 continue;
1807 }
1808
1809 /* If this command in this map is shadowed by some other map,
1810 ignore it. */
265a9e55 1811 if (!NILP (shadow))
2c6f1a39
JB
1812 {
1813 Lisp_Object tem;
1814
1815 XVECTOR (kludge)->contents[0] = make_number (i);
7c140252 1816 tem = Flookup_key (shadow, kludge, Qt);
2c6f1a39 1817
265a9e55 1818 if (!NILP (tem)) continue;
2c6f1a39
JB
1819 }
1820
1821 if (first)
1822 {
1823 insert ("\n", 1);
1824 first = 0;
1825 }
1826
1827 /* Output the prefix that applies to every entry in this map. */
265a9e55 1828 if (!NILP (elt_prefix))
2c6f1a39
JB
1829 insert1 (elt_prefix);
1830
1831 /* Get the string to describe the character I, and print it. */
1832 XFASTINT (dummy) = i;
1833
1834 /* THIS gets the string to describe the character DUMMY. */
1835 this = Fsingle_key_description (dummy);
1836 insert1 (this);
1837
1838 /* Find all consecutive characters that have the same definition. */
1839 while (i + 1 < DENSE_TABLE_SIZE
1840 && (tem2 = get_keyelt (XVECTOR (vector)->contents[i+1]),
1841 EQ (tem2, tem1)))
1842 i++;
1843
1844 /* If we have a range of more than one character,
1845 print where the range reaches to. */
1846
1847 if (i != XINT (dummy))
1848 {
1849 insert (" .. ", 4);
265a9e55 1850 if (!NILP (elt_prefix))
2c6f1a39
JB
1851 insert1 (elt_prefix);
1852
1853 XFASTINT (dummy) = i;
1854 insert1 (Fsingle_key_description (dummy));
1855 }
1856
1857 /* Print a description of the definition of this character.
1858 elt_describer will take care of spacing out far enough
1859 for alignment purposes. */
1860 (*elt_describer) (tem1);
1861 }
1862
1863 UNGCPRO;
1864}
1865\f
cc0a8174 1866/* Apropos - finding all symbols whose names match a regexp. */
2c6f1a39
JB
1867Lisp_Object apropos_predicate;
1868Lisp_Object apropos_accumulate;
1869
1870static void
1871apropos_accum (symbol, string)
1872 Lisp_Object symbol, string;
1873{
1874 register Lisp_Object tem;
1875
1876 tem = Fstring_match (string, Fsymbol_name (symbol), Qnil);
265a9e55 1877 if (!NILP (tem) && !NILP (apropos_predicate))
2c6f1a39 1878 tem = call1 (apropos_predicate, symbol);
265a9e55 1879 if (!NILP (tem))
2c6f1a39
JB
1880 apropos_accumulate = Fcons (symbol, apropos_accumulate);
1881}
1882
1883DEFUN ("apropos-internal", Fapropos_internal, Sapropos_internal, 1, 2, 0,
1884 "Show all symbols whose names contain match for REGEXP.\n\
1885If optional 2nd arg PRED is non-nil, (funcall PRED SYM) is done\n\
1886for each symbol and a symbol is mentioned only if that returns non-nil.\n\
1887Return list of symbols found.")
1888 (string, pred)
1889 Lisp_Object string, pred;
1890{
1891 struct gcpro gcpro1, gcpro2;
1892 CHECK_STRING (string, 0);
1893 apropos_predicate = pred;
1894 GCPRO2 (apropos_predicate, apropos_accumulate);
1895 apropos_accumulate = Qnil;
1896 map_obarray (Vobarray, apropos_accum, string);
1897 apropos_accumulate = Fsort (apropos_accumulate, Qstring_lessp);
1898 UNGCPRO;
1899 return apropos_accumulate;
1900}
1901\f
1902syms_of_keymap ()
1903{
1904 Lisp_Object tem;
1905
1906 Qkeymap = intern ("keymap");
1907 staticpro (&Qkeymap);
1908
1909/* Initialize the keymaps standardly used.
1910 Each one is the value of a Lisp variable, and is also
1911 pointed to by a C variable */
1912
ce6e5d0b 1913 global_map = Fmake_keymap (Qnil);
2c6f1a39
JB
1914 Fset (intern ("global-map"), global_map);
1915
ce6e5d0b 1916 meta_map = Fmake_keymap (Qnil);
2c6f1a39
JB
1917 Fset (intern ("esc-map"), meta_map);
1918 Ffset (intern ("ESC-prefix"), meta_map);
1919
ce6e5d0b 1920 control_x_map = Fmake_keymap (Qnil);
2c6f1a39
JB
1921 Fset (intern ("ctl-x-map"), control_x_map);
1922 Ffset (intern ("Control-X-prefix"), control_x_map);
1923
1924 DEFVAR_LISP ("minibuffer-local-map", &Vminibuffer_local_map,
1925 "Default keymap to use when reading from the minibuffer.");
ce6e5d0b 1926 Vminibuffer_local_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
1927
1928 DEFVAR_LISP ("minibuffer-local-ns-map", &Vminibuffer_local_ns_map,
1929 "Local keymap for the minibuffer when spaces are not allowed.");
ce6e5d0b 1930 Vminibuffer_local_ns_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
1931
1932 DEFVAR_LISP ("minibuffer-local-completion-map", &Vminibuffer_local_completion_map,
1933 "Local keymap for minibuffer input with completion.");
ce6e5d0b 1934 Vminibuffer_local_completion_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
1935
1936 DEFVAR_LISP ("minibuffer-local-must-match-map", &Vminibuffer_local_must_match_map,
1937 "Local keymap for minibuffer input with completion, for exact match.");
ce6e5d0b 1938 Vminibuffer_local_must_match_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
1939
1940 current_global_map = global_map;
1941
cc0a8174
JB
1942 DEFVAR_LISP ("minor-mode-map-alist", &Vminor_mode_map_alist,
1943 "Alist of keymaps to use for minor modes.\n\
1944Each element looks like (VARIABLE . KEYMAP); KEYMAP is used to read\n\
1945key sequences and look up bindings iff VARIABLE's value is non-nil.\n\
1946If two active keymaps bind the same key, the keymap appearing earlier\n\
1947in the list takes precedence.");
1948 Vminor_mode_map_alist = Qnil;
1949
6bbbd9b0
JB
1950 DEFVAR_LISP ("function-key-map", &Vfunction_key_map,
1951 "Keymap mapping ASCII function key sequences onto their preferred forms.\n\
1952This allows Emacs to recognize function keys sent from ASCII\n\
1953terminals at any point in a key sequence.\n\
1954\n\
1955The read-key-sequence function replaces subsequences bound by\n\
1956function-key-map with their bindings. When the current local and global\n\
1957keymaps have no binding for the current key sequence but\n\
1958function-key-map binds a suffix of the sequence to a vector,\n\
1959read-key-sequence replaces the matching suffix with its binding, and\n\
1960continues with the new sequence.\n\
1961\n\
1962For example, suppose function-key-map binds `ESC O P' to [pf1].\n\
1963Typing `ESC O P' to read-key-sequence would return [pf1]. Typing\n\
1964`C-x ESC O P' would return [?\C-x pf1]. If [pf1] were a prefix\n\
1965key, typing `ESC O P x' would return [pf1 x].");
ce6e5d0b 1966 Vfunction_key_map = Fmake_sparse_keymap (Qnil);
6bbbd9b0 1967
2c6f1a39
JB
1968 Qsingle_key_description = intern ("single-key-description");
1969 staticpro (&Qsingle_key_description);
1970
1971 Qkey_description = intern ("key-description");
1972 staticpro (&Qkey_description);
1973
1974 Qkeymapp = intern ("keymapp");
1975 staticpro (&Qkeymapp);
1976
1977 defsubr (&Skeymapp);
1978 defsubr (&Smake_keymap);
1979 defsubr (&Smake_sparse_keymap);
1980 defsubr (&Scopy_keymap);
1981 defsubr (&Skey_binding);
1982 defsubr (&Slocal_key_binding);
1983 defsubr (&Sglobal_key_binding);
cc0a8174 1984 defsubr (&Sminor_mode_key_binding);
2c6f1a39
JB
1985 defsubr (&Sglobal_set_key);
1986 defsubr (&Slocal_set_key);
1987 defsubr (&Sdefine_key);
1988 defsubr (&Slookup_key);
1989 defsubr (&Sglobal_unset_key);
1990 defsubr (&Slocal_unset_key);
1991 defsubr (&Sdefine_prefix_command);
1992 defsubr (&Suse_global_map);
1993 defsubr (&Suse_local_map);
1994 defsubr (&Scurrent_local_map);
1995 defsubr (&Scurrent_global_map);
cc0a8174 1996 defsubr (&Scurrent_minor_mode_maps);
2c6f1a39
JB
1997 defsubr (&Saccessible_keymaps);
1998 defsubr (&Skey_description);
1999 defsubr (&Sdescribe_vector);
2000 defsubr (&Ssingle_key_description);
2001 defsubr (&Stext_char_description);
2002 defsubr (&Swhere_is_internal);
2003 defsubr (&Swhere_is);
2004 defsubr (&Sdescribe_bindings);
2005 defsubr (&Sapropos_internal);
2006}
2007
2008keys_of_keymap ()
2009{
2010 Lisp_Object tem;
2011
2012 initial_define_key (global_map, 033, "ESC-prefix");
2013 initial_define_key (global_map, Ctl('X'), "Control-X-prefix");
2014}