JimB's changes from January 18 to present
[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))
2c6f1a39
JB
558 error ("Key sequence %s uses invalid prefix characters",
559 XSTRING (key)->data);
2c6f1a39
JB
560 }
561}
562
563/* Value is number if KEY is too long; NIL if valid but has no definition. */
564
565DEFUN ("lookup-key", Flookup_key, Slookup_key, 2, 2, 0,
566 "In keymap KEYMAP, look up key sequence KEY. Return the definition.\n\
567nil means undefined. See doc of `define-key' for kinds of definitions.\n\
568A number as value means KEY is \"too long\";\n\
569that is, characters or symbols in it except for the last one\n\
570fail to be a valid sequence of prefix characters in KEYMAP.\n\
571The number is how many characters at the front of KEY\n\
572it takes to reach a non-prefix command.")
573 (keymap, key)
574 register Lisp_Object keymap;
575 Lisp_Object key;
576{
577 register int idx;
578 register Lisp_Object tem;
579 register Lisp_Object cmd;
580 register Lisp_Object c;
581 int metized = 0;
582 int length;
583
584 keymap = get_keymap (keymap);
585
586 if (XTYPE (key) != Lisp_Vector
587 && XTYPE (key) != Lisp_String)
588 key = wrong_type_argument (Qarrayp, key);
589
d09b2024 590 length = XFASTINT (Flength (key));
2c6f1a39
JB
591 if (length == 0)
592 return keymap;
593
594 idx = 0;
595 while (1)
596 {
597 c = Faref (key, make_number (idx));
598
599 if (XTYPE (c) == Lisp_Int
600 && XINT (c) >= 0200
601 && !metized)
602 {
603 c = meta_prefix_char;
604 metized = 1;
605 }
606 else
607 {
608 if (XTYPE (c) == Lisp_Int)
609 XSETINT (c, XINT (c) & 0177);
610
611 metized = 0;
612 idx++;
613 }
614
e25c4e44 615 cmd = get_keyelt (access_keymap (keymap, c, 0));
2c6f1a39
JB
616 if (idx == length)
617 return cmd;
618
d09b2024
JB
619 keymap = get_keymap_1 (cmd, 0, 0);
620 if (NILP (keymap))
2c6f1a39
JB
621 return make_number (idx);
622
2c6f1a39
JB
623 QUIT;
624 }
625}
626
627/* Append a key to the end of a key sequence. If key_sequence is a
628 string and key is a character, the result will be another string;
629 otherwise, it will be a vector. */
630Lisp_Object
631append_key (key_sequence, key)
632 Lisp_Object key_sequence, key;
633{
634 Lisp_Object args[2];
635
636 args[0] = key_sequence;
637
638 if (XTYPE (key_sequence) == Lisp_String
639 && XTYPE (key) == Lisp_Int)
640 {
641 args[1] = Fchar_to_string (key);
642 return Fconcat (2, args);
643 }
644 else
645 {
646 args[1] = Fcons (key, Qnil);
647 return Fvconcat (2, args);
648 }
649}
650
651\f
cc0a8174
JB
652/* Global, local, and minor mode keymap stuff. */
653
265a9e55 654/* We can't put these variables inside current_minor_maps, since under
6bbbd9b0
JB
655 some systems, static gets macro-defined to be the empty string.
656 Ickypoo. */
265a9e55
JB
657static Lisp_Object *cmm_modes, *cmm_maps;
658static int cmm_size;
659
cc0a8174
JB
660/* Store a pointer to an array of the keymaps of the currently active
661 minor modes in *buf, and return the number of maps it contains.
662
663 This function always returns a pointer to the same buffer, and may
664 free or reallocate it, so if you want to keep it for a long time or
665 hand it out to lisp code, copy it. This procedure will be called
666 for every key sequence read, so the nice lispy approach (return a
667 new assoclist, list, what have you) for each invocation would
668 result in a lot of consing over time.
669
670 If we used xrealloc/xmalloc and ran out of memory, they would throw
671 back to the command loop, which would try to read a key sequence,
672 which would call this function again, resulting in an infinite
673 loop. Instead, we'll use realloc/malloc and silently truncate the
674 list, let the key sequence be read, and hope some other piece of
675 code signals the error. */
676int
677current_minor_maps (modeptr, mapptr)
678 Lisp_Object **modeptr, **mapptr;
679{
cc0a8174 680 int i = 0;
6bbbd9b0 681 Lisp_Object alist, assoc, var, val;
cc0a8174
JB
682
683 for (alist = Vminor_mode_map_alist;
684 CONSP (alist);
685 alist = XCONS (alist)->cdr)
686 if (CONSP (assoc = XCONS (alist)->car)
687 && XTYPE (var = XCONS (assoc)->car) == Lisp_Symbol
6bbbd9b0
JB
688 && ! EQ ((val = find_symbol_value (var)), Qunbound)
689 && ! NILP (val))
cc0a8174 690 {
265a9e55 691 if (i >= cmm_size)
cc0a8174
JB
692 {
693 Lisp_Object *newmodes, *newmaps;
694
265a9e55 695 if (cmm_maps)
cc0a8174 696 {
265a9e55
JB
697 newmodes = (Lisp_Object *) realloc (cmm_modes, cmm_size *= 2);
698 newmaps = (Lisp_Object *) realloc (cmm_maps, cmm_size);
cc0a8174
JB
699 }
700 else
701 {
265a9e55
JB
702 newmodes = (Lisp_Object *) malloc (cmm_size = 30);
703 newmaps = (Lisp_Object *) malloc (cmm_size);
cc0a8174
JB
704 }
705
706 if (newmaps && newmodes)
707 {
265a9e55
JB
708 cmm_modes = newmodes;
709 cmm_maps = newmaps;
cc0a8174
JB
710 }
711 else
712 break;
713 }
265a9e55
JB
714 cmm_modes[i] = var;
715 cmm_maps [i] = XCONS (assoc)->cdr;
cc0a8174
JB
716 i++;
717 }
718
265a9e55
JB
719 if (modeptr) *modeptr = cmm_modes;
720 if (mapptr) *mapptr = cmm_maps;
cc0a8174
JB
721 return i;
722}
723
2c6f1a39
JB
724DEFUN ("key-binding", Fkey_binding, Skey_binding, 1, 1, 0,
725 "Return the binding for command KEY in current keymaps.\n\
726KEY is a string, a sequence of keystrokes.\n\
727The binding is probably a symbol with a function definition.")
728 (key)
729 Lisp_Object key;
730{
cc0a8174
JB
731 Lisp_Object *maps, value;
732 int nmaps, i;
733
734 nmaps = current_minor_maps (0, &maps);
735 for (i = 0; i < nmaps; i++)
265a9e55 736 if (! NILP (maps[i]))
cc0a8174
JB
737 {
738 value = Flookup_key (maps[i], key);
265a9e55 739 if (! NILP (value) && XTYPE (value) != Lisp_Int)
cc0a8174
JB
740 return value;
741 }
742
265a9e55 743 if (! NILP (current_buffer->keymap))
2c6f1a39 744 {
cc0a8174 745 value = Flookup_key (current_buffer->keymap, key);
265a9e55 746 if (! NILP (value) && XTYPE (value) != Lisp_Int)
2c6f1a39
JB
747 return value;
748 }
cc0a8174
JB
749
750 value = Flookup_key (current_global_map, key);
265a9e55 751 if (! NILP (value) && XTYPE (value) != Lisp_Int)
cc0a8174
JB
752 return value;
753
754 return Qnil;
2c6f1a39
JB
755}
756
757DEFUN ("local-key-binding", Flocal_key_binding, Slocal_key_binding, 1, 1, 0,
758 "Return the binding for command KEYS in current local keymap only.\n\
759KEYS is a string, a sequence of keystrokes.\n\
760The binding is probably a symbol with a function definition.")
761 (keys)
762 Lisp_Object keys;
763{
764 register Lisp_Object map;
765 map = current_buffer->keymap;
265a9e55 766 if (NILP (map))
2c6f1a39
JB
767 return Qnil;
768 return Flookup_key (map, keys);
769}
770
771DEFUN ("global-key-binding", Fglobal_key_binding, Sglobal_key_binding, 1, 1, 0,
772 "Return the binding for command KEYS in current global keymap only.\n\
773KEYS is a string, a sequence of keystrokes.\n\
6bbbd9b0
JB
774The binding is probably a symbol with a function definition.\n\
775This function's return values are the same as those of lookup-key\n\
776(which see).")
2c6f1a39
JB
777 (keys)
778 Lisp_Object keys;
779{
780 return Flookup_key (current_global_map, keys);
781}
782
cc0a8174
JB
783DEFUN ("minor-mode-key-binding", Fminor_mode_key_binding, Sminor_mode_key_binding, 1, 1, 0,
784 "Find the visible minor mode bindings of KEY.\n\
785Return an alist of pairs (MODENAME . BINDING), where MODENAME is the\n\
786the symbol which names the minor mode binding KEY, and BINDING is\n\
787KEY's definition in that mode. In particular, if KEY has no\n\
788minor-mode bindings, return nil. If the first binding is a\n\
789non-prefix, all subsequent bindings will be omitted, since they would\n\
790be ignored. Similarly, the list doesn't include non-prefix bindings\n\
791that come after prefix bindings.")
792 (key)
793{
794 Lisp_Object *modes, *maps;
795 int nmaps;
796 Lisp_Object binding;
797 int i, j;
798
799 nmaps = current_minor_maps (&modes, &maps);
800
801 for (i = j = 0; i < nmaps; i++)
265a9e55
JB
802 if (! NILP (maps[i])
803 && ! NILP (binding = Flookup_key (maps[i], key))
cc0a8174
JB
804 && XTYPE (binding) != Lisp_Int)
805 {
d09b2024 806 if (! NILP (get_keymap (binding)))
cc0a8174
JB
807 maps[j++] = Fcons (modes[i], binding);
808 else if (j == 0)
809 return Fcons (Fcons (modes[i], binding), Qnil);
810 }
811
812 return Flist (j, maps);
813}
814
2c6f1a39
JB
815DEFUN ("global-set-key", Fglobal_set_key, Sglobal_set_key, 2, 2,
816 "kSet key globally: \nCSet key %s to command: ",
817 "Give KEY a global binding as COMMAND.\n\
818COMMAND is a symbol naming an interactively-callable function.\n\
819KEY is a string representing a sequence of keystrokes.\n\
820Note that if KEY has a local binding in the current buffer\n\
821that local binding will continue to shadow any global binding.")
822 (keys, function)
823 Lisp_Object keys, function;
824{
825 if (XTYPE (keys) != Lisp_Vector
826 && XTYPE (keys) != Lisp_String)
827 keys = wrong_type_argument (Qarrayp, keys);
828
829 Fdefine_key (current_global_map, keys, function);
830 return Qnil;
831}
832
833DEFUN ("local-set-key", Flocal_set_key, Slocal_set_key, 2, 2,
834 "kSet key locally: \nCSet key %s locally to command: ",
835 "Give KEY a local binding as COMMAND.\n\
836COMMAND is a symbol naming an interactively-callable function.\n\
837KEY is a string representing a sequence of keystrokes.\n\
838The binding goes in the current buffer's local map,\n\
839which is shared with other buffers in the same major mode.")
840 (keys, function)
841 Lisp_Object keys, function;
842{
843 register Lisp_Object map;
844 map = current_buffer->keymap;
265a9e55 845 if (NILP (map))
2c6f1a39 846 {
ce6e5d0b 847 map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
848 current_buffer->keymap = map;
849 }
850
851 if (XTYPE (keys) != Lisp_Vector
852 && XTYPE (keys) != Lisp_String)
853 keys = wrong_type_argument (Qarrayp, keys);
854
855 Fdefine_key (map, keys, function);
856 return Qnil;
857}
858
859DEFUN ("global-unset-key", Fglobal_unset_key, Sglobal_unset_key,
860 1, 1, "kUnset key globally: ",
861 "Remove global binding of KEY.\n\
862KEY is a string representing a sequence of keystrokes.")
863 (keys)
864 Lisp_Object keys;
865{
866 return Fglobal_set_key (keys, Qnil);
867}
868
869DEFUN ("local-unset-key", Flocal_unset_key, Slocal_unset_key, 1, 1,
870 "kUnset key locally: ",
871 "Remove local binding of KEY.\n\
872KEY is a string representing a sequence of keystrokes.")
873 (keys)
874 Lisp_Object keys;
875{
265a9e55 876 if (!NILP (current_buffer->keymap))
2c6f1a39
JB
877 Flocal_set_key (keys, Qnil);
878 return Qnil;
879}
880
881DEFUN ("define-prefix-command", Fdefine_prefix_command, Sdefine_prefix_command, 1, 2, 0,
882 "Define COMMAND as a prefix command.\n\
883A new sparse keymap is stored as COMMAND's function definition and its value.\n\
1d8d96fa
JB
884If a second optional argument MAPVAR is given, the map is stored as\n\
885its value instead of as COMMAND's value; but COMMAND is still defined\n\
886as a function.")
2c6f1a39
JB
887 (name, mapvar)
888 Lisp_Object name, mapvar;
889{
890 Lisp_Object map;
ce6e5d0b 891 map = Fmake_sparse_keymap (Qnil);
2c6f1a39 892 Ffset (name, map);
265a9e55 893 if (!NILP (mapvar))
2c6f1a39
JB
894 Fset (mapvar, map);
895 else
896 Fset (name, map);
897 return name;
898}
899
900DEFUN ("use-global-map", Fuse_global_map, Suse_global_map, 1, 1, 0,
901 "Select KEYMAP as the global keymap.")
902 (keymap)
903 Lisp_Object keymap;
904{
905 keymap = get_keymap (keymap);
906 current_global_map = keymap;
907 return Qnil;
908}
909
910DEFUN ("use-local-map", Fuse_local_map, Suse_local_map, 1, 1, 0,
911 "Select KEYMAP as the local keymap.\n\
912If KEYMAP is nil, that means no local keymap.")
913 (keymap)
914 Lisp_Object keymap;
915{
265a9e55 916 if (!NILP (keymap))
2c6f1a39
JB
917 keymap = get_keymap (keymap);
918
919 current_buffer->keymap = keymap;
920
921 return Qnil;
922}
923
924DEFUN ("current-local-map", Fcurrent_local_map, Scurrent_local_map, 0, 0, 0,
925 "Return current buffer's local keymap, or nil if it has none.")
926 ()
927{
928 return current_buffer->keymap;
929}
930
931DEFUN ("current-global-map", Fcurrent_global_map, Scurrent_global_map, 0, 0, 0,
932 "Return the current global keymap.")
933 ()
934{
935 return current_global_map;
936}
cc0a8174
JB
937
938DEFUN ("current-minor-mode-maps", Fcurrent_minor_mode_maps, Scurrent_minor_mode_maps, 0, 0, 0,
939 "Return a list of keymaps for the minor modes of the current buffer.")
940 ()
941{
942 Lisp_Object *maps;
943 int nmaps = current_minor_maps (0, &maps);
944
945 return Flist (nmaps, maps);
946}
2c6f1a39 947\f
cc0a8174
JB
948/* Help functions for describing and documenting keymaps. */
949
2c6f1a39
JB
950DEFUN ("accessible-keymaps", Faccessible_keymaps, Saccessible_keymaps,
951 1, 1, 0,
952 "Find all keymaps accessible via prefix characters from KEYMAP.\n\
953Returns a list of elements of the form (KEYS . MAP), where the sequence\n\
954KEYS starting from KEYMAP gets you to MAP. These elements are ordered\n\
955so that the KEYS increase in length. The first element is (\"\" . KEYMAP).")
956 (startmap)
957 Lisp_Object startmap;
958{
959 Lisp_Object maps, tail;
960
961 maps = Fcons (Fcons (build_string (""), get_keymap (startmap)), Qnil);
2c6f1a39
JB
962
963 /* For each map in the list maps,
964 look at any other maps it points to,
965 and stick them at the end if they are not already in the list.
966
967 This is a breadth-first traversal, where tail is the queue of
968 nodes, and maps accumulates a list of all nodes visited. */
969
f5b79c1c 970 for (tail = maps; CONSP (tail); tail = XCONS (tail)->cdr)
2c6f1a39
JB
971 {
972 register Lisp_Object thisseq = Fcar (Fcar (tail));
973 register Lisp_Object thismap = Fcdr (Fcar (tail));
974 Lisp_Object last = make_number (XINT (Flength (thisseq)) - 1);
975
976 /* Does the current sequence end in the meta-prefix-char? */
977 int is_metized = (XINT (last) >= 0
978 && EQ (Faref (thisseq, last), meta_prefix_char));
979
f5b79c1c 980 for (; CONSP (thismap); thismap = XCONS (thismap)->cdr)
2c6f1a39 981 {
f5b79c1c 982 Lisp_Object elt = XCONS (thismap)->car;
2c6f1a39 983
f5b79c1c
JB
984 QUIT;
985
986 if (XTYPE (elt) == Lisp_Vector)
2c6f1a39
JB
987 {
988 register int i;
989
990 /* Vector keymap. Scan all the elements. */
991 for (i = 0; i < DENSE_TABLE_SIZE; i++)
992 {
993 register Lisp_Object tem;
994 register Lisp_Object cmd;
995
f5b79c1c 996 cmd = get_keyelt (XVECTOR (elt)->contents[i]);
265a9e55 997 if (NILP (cmd)) continue;
2c6f1a39 998 tem = Fkeymapp (cmd);
265a9e55 999 if (!NILP (tem))
2c6f1a39
JB
1000 {
1001 cmd = get_keymap (cmd);
1002 /* Ignore keymaps that are already added to maps. */
1003 tem = Frassq (cmd, maps);
265a9e55 1004 if (NILP (tem))
2c6f1a39
JB
1005 {
1006 /* If the last key in thisseq is meta-prefix-char,
1007 turn it into a meta-ized keystroke. We know
1008 that the event we're about to append is an
f5b79c1c
JB
1009 ascii keystroke since we're processing a
1010 keymap table. */
2c6f1a39
JB
1011 if (is_metized)
1012 {
1013 tem = Fcopy_sequence (thisseq);
1014 Faset (tem, last, make_number (i | 0200));
1015
1016 /* This new sequence is the same length as
1017 thisseq, so stick it in the list right
1018 after this one. */
1019 XCONS (tail)->cdr =
1020 Fcons (Fcons (tem, cmd), XCONS (tail)->cdr);
1021 }
1022 else
1023 {
1024 tem = append_key (thisseq, make_number (i));
1025 nconc2 (tail, Fcons (Fcons (tem, cmd), Qnil));
1026 }
1027 }
1028 }
1029 }
f5b79c1c
JB
1030 }
1031 else if (CONSP (elt))
2c6f1a39
JB
1032 {
1033 register Lisp_Object cmd = get_keyelt (XCONS (elt)->cdr);
1034 register Lisp_Object tem;
1035
1036 /* Ignore definitions that aren't keymaps themselves. */
1037 tem = Fkeymapp (cmd);
265a9e55 1038 if (!NILP (tem))
2c6f1a39
JB
1039 {
1040 /* Ignore keymaps that have been seen already. */
1041 cmd = get_keymap (cmd);
1042 tem = Frassq (cmd, maps);
265a9e55 1043 if (NILP (tem))
2c6f1a39
JB
1044 {
1045 /* let elt be the event defined by this map entry. */
1046 elt = XCONS (elt)->car;
1047
1048 /* If the last key in thisseq is meta-prefix-char, and
1049 this entry is a binding for an ascii keystroke,
1050 turn it into a meta-ized keystroke. */
1051 if (is_metized && XTYPE (elt) == Lisp_Int)
1052 {
1053 tem = Fcopy_sequence (thisseq);
1054 Faset (tem, last, make_number (XINT (elt) | 0200));
1055
1056 /* This new sequence is the same length as
1057 thisseq, so stick it in the list right
1058 after this one. */
1059 XCONS (tail)->cdr =
1060 Fcons (Fcons (tem, cmd), XCONS (tail)->cdr);
1061 }
1062 else
1063 nconc2 (tail,
1064 Fcons (Fcons (append_key (thisseq, elt), cmd),
1065 Qnil));
1066 }
1067 }
1068 }
2c6f1a39 1069 }
2c6f1a39
JB
1070 }
1071
1072 return maps;
1073}
1074
1075Lisp_Object Qsingle_key_description, Qkey_description;
1076
1077DEFUN ("key-description", Fkey_description, Skey_description, 1, 1, 0,
1078 "Return a pretty description of key-sequence KEYS.\n\
1079Control characters turn into \"C-foo\" sequences, meta into \"M-foo\"\n\
1080spaces are put between sequence elements, etc.")
1081 (keys)
1082 Lisp_Object keys;
1083{
1084 return Fmapconcat (Qsingle_key_description, keys, build_string (" "));
1085}
1086
1087char *
1088push_key_description (c, p)
1089 register unsigned int c;
1090 register char *p;
1091{
1092 if (c >= 0200)
1093 {
1094 *p++ = 'M';
1095 *p++ = '-';
1096 c -= 0200;
1097 }
1098 if (c < 040)
1099 {
1100 if (c == 033)
1101 {
1102 *p++ = 'E';
1103 *p++ = 'S';
1104 *p++ = 'C';
1105 }
1106 else if (c == Ctl('I'))
1107 {
1108 *p++ = 'T';
1109 *p++ = 'A';
1110 *p++ = 'B';
1111 }
1112 else if (c == Ctl('J'))
1113 {
1114 *p++ = 'L';
1115 *p++ = 'F';
1116 *p++ = 'D';
1117 }
1118 else if (c == Ctl('M'))
1119 {
1120 *p++ = 'R';
1121 *p++ = 'E';
1122 *p++ = 'T';
1123 }
1124 else
1125 {
1126 *p++ = 'C';
1127 *p++ = '-';
1128 if (c > 0 && c <= Ctl ('Z'))
1129 *p++ = c + 0140;
1130 else
1131 *p++ = c + 0100;
1132 }
1133 }
1134 else if (c == 0177)
1135 {
1136 *p++ = 'D';
1137 *p++ = 'E';
1138 *p++ = 'L';
1139 }
1140 else if (c == ' ')
1141 {
1142 *p++ = 'S';
1143 *p++ = 'P';
1144 *p++ = 'C';
1145 }
1146 else
1147 *p++ = c;
1148
1149 return p;
1150}
1151
1152DEFUN ("single-key-description", Fsingle_key_description, Ssingle_key_description, 1, 1, 0,
1153 "Return a pretty description of command character KEY.\n\
1154Control characters turn into C-whatever, etc.")
1155 (key)
1156 Lisp_Object key;
1157{
1158 register unsigned char c;
1159 char tem[6];
1160
cebd887d 1161 key = EVENT_HEAD (key);
6bbbd9b0 1162
2c6f1a39
JB
1163 switch (XTYPE (key))
1164 {
1165 case Lisp_Int: /* Normal character */
1166 c = XINT (key) & 0377;
1167 *push_key_description (c, tem) = 0;
1168 return build_string (tem);
1169
1170 case Lisp_Symbol: /* Function key or event-symbol */
1171 return Fsymbol_name (key);
1172
2c6f1a39
JB
1173 default:
1174 error ("KEY must be an integer, cons, or symbol.");
1175 }
1176}
1177
1178char *
1179push_text_char_description (c, p)
1180 register unsigned int c;
1181 register char *p;
1182{
1183 if (c >= 0200)
1184 {
1185 *p++ = 'M';
1186 *p++ = '-';
1187 c -= 0200;
1188 }
1189 if (c < 040)
1190 {
1191 *p++ = '^';
1192 *p++ = c + 64; /* 'A' - 1 */
1193 }
1194 else if (c == 0177)
1195 {
1196 *p++ = '^';
1197 *p++ = '?';
1198 }
1199 else
1200 *p++ = c;
1201 return p;
1202}
1203
1204DEFUN ("text-char-description", Ftext_char_description, Stext_char_description, 1, 1, 0,
1205 "Return a pretty description of file-character CHAR.\n\
1206Control characters turn into \"^char\", etc.")
1207 (chr)
1208 Lisp_Object chr;
1209{
1210 char tem[6];
1211
1212 CHECK_NUMBER (chr, 0);
1213
1214 *push_text_char_description (XINT (chr) & 0377, tem) = 0;
1215
1216 return build_string (tem);
1217}
1218\f
cc0a8174
JB
1219/* where-is - finding a command in a set of keymaps. */
1220
2c6f1a39
JB
1221DEFUN ("where-is-internal", Fwhere_is_internal, Swhere_is_internal, 1, 5, 0,
1222 "Return list of keys that invoke DEFINITION in KEYMAP or KEYMAP1.\n\
1223If KEYMAP is nil, search only KEYMAP1.\n\
1224If KEYMAP1 is nil, use the current global map.\n\
1225\n\
1226If optional 4th arg FIRSTONLY is non-nil,\n\
1227return a string representing the first key sequence found,\n\
1228rather than a list of all possible key sequences.\n\
1229\n\
1230If optional 5th arg NOINDIRECT is non-nil, don't follow indirections\n\
1231to other keymaps or slots. This makes it possible to search for an\n\
1232indirect definition itself.")
1233 (definition, local_keymap, global_keymap, firstonly, noindirect)
1234 Lisp_Object definition, local_keymap, global_keymap;
1235 Lisp_Object firstonly, noindirect;
1236{
1237 register Lisp_Object maps;
1238 Lisp_Object found;
1239
265a9e55 1240 if (NILP (global_keymap))
2c6f1a39
JB
1241 global_keymap = current_global_map;
1242
265a9e55 1243 if (!NILP (local_keymap))
2c6f1a39
JB
1244 maps = nconc2 (Faccessible_keymaps (get_keymap (local_keymap)),
1245 Faccessible_keymaps (get_keymap (global_keymap)));
1246 else
1247 maps = Faccessible_keymaps (get_keymap (global_keymap));
1248
1249 found = Qnil;
1250
265a9e55 1251 for (; !NILP (maps); maps = Fcdr (maps))
2c6f1a39 1252 {
f5b79c1c
JB
1253 /* Key sequence to reach map */
1254 register Lisp_Object this = Fcar (Fcar (maps));
1255
1256 /* The map that it reaches */
1257 register Lisp_Object map = Fcdr (Fcar (maps));
1258
1259 /* If Fcar (map) is a VECTOR, the current element within that vector. */
1260 int i = 0;
2c6f1a39
JB
1261
1262 /* In order to fold [META-PREFIX-CHAR CHAR] sequences into
1263 [M-CHAR] sequences, check if last character of the sequence
1264 is the meta-prefix char. */
1265 Lisp_Object last = make_number (XINT (Flength (this)) - 1);
1266 int last_is_meta = (XINT (last) >= 0
1267 && EQ (Faref (this, last), meta_prefix_char));
2c6f1a39 1268
fde3a52f
JB
1269 QUIT;
1270
f5b79c1c 1271 while (CONSP (map))
2c6f1a39 1272 {
f5b79c1c
JB
1273 /* Because the code we want to run on each binding is rather
1274 large, we don't want to have two separate loop bodies for
1275 sparse keymap bindings and tables; we want to iterate one
1276 loop body over both keymap and vector bindings.
1277
1278 For this reason, if Fcar (map) is a vector, we don't
1279 advance map to the next element until i indicates that we
1280 have finished off the vector. */
2c6f1a39 1281
f5b79c1c
JB
1282 Lisp_Object elt = XCONS (map)->car;
1283 Lisp_Object key, binding, sequence;
1284
fde3a52f
JB
1285 QUIT;
1286
f5b79c1c
JB
1287 /* Set key and binding to the current key and binding, and
1288 advance map and i to the next binding. */
1289 if (XTYPE (elt) == Lisp_Vector)
2c6f1a39
JB
1290 {
1291 /* In a vector, look at each element. */
f5b79c1c 1292 binding = XVECTOR (elt)->contents[i];
2c6f1a39
JB
1293 XFASTINT (key) = i;
1294 i++;
1295
f5b79c1c
JB
1296 /* If we've just finished scanning a vector, advance map
1297 to the next element, and reset i in anticipation of the
1298 next vector we may find. */
2c6f1a39 1299 if (i >= DENSE_TABLE_SIZE)
2c6f1a39 1300 {
f5b79c1c
JB
1301 map = XCONS (map)->cdr;
1302 i = 0;
2c6f1a39 1303 }
f5b79c1c
JB
1304 }
1305 else if (CONSP (elt))
1306 {
2c6f1a39 1307 key = Fcar (Fcar (map));
f5b79c1c
JB
1308 binding = Fcdr (Fcar (map));
1309
1310 map = XCONS (map)->cdr;
2c6f1a39
JB
1311 }
1312 else
f5b79c1c
JB
1313 /* We want to ignore keymap elements that are neither
1314 vectors nor conses. */
fde3a52f
JB
1315 {
1316 map = XCONS (map)->cdr;
1317 continue;
1318 }
2c6f1a39
JB
1319
1320 /* Search through indirections unless that's not wanted. */
265a9e55 1321 if (NILP (noindirect))
2c6f1a39
JB
1322 binding = get_keyelt (binding);
1323
1324 /* End this iteration if this element does not match
1325 the target. */
1326
1327 if (XTYPE (definition) == Lisp_Cons)
1328 {
1329 Lisp_Object tem;
1330 tem = Fequal (binding, definition);
265a9e55 1331 if (NILP (tem))
2c6f1a39
JB
1332 continue;
1333 }
1334 else
1335 if (!EQ (binding, definition))
1336 continue;
1337
1338 /* We have found a match.
1339 Construct the key sequence where we found it. */
1340 if (XTYPE (key) == Lisp_Int && last_is_meta)
1341 {
1342 sequence = Fcopy_sequence (this);
1343 Faset (sequence, last, make_number (XINT (key) | 0200));
1344 }
1345 else
1346 sequence = append_key (this, key);
1347
1348 /* Verify that this key binding is not shadowed by another
1349 binding for the same key, before we say it exists.
1350
1351 Mechanism: look for local definition of this key and if
1352 it is defined and does not match what we found then
1353 ignore this key.
1354
1355 Either nil or number as value from Flookup_key
1356 means undefined. */
265a9e55 1357 if (!NILP (local_keymap))
2c6f1a39
JB
1358 {
1359 binding = Flookup_key (local_keymap, sequence);
265a9e55 1360 if (!NILP (binding) && XTYPE (binding) != Lisp_Int)
2c6f1a39
JB
1361 {
1362 if (XTYPE (definition) == Lisp_Cons)
1363 {
1364 Lisp_Object tem;
1365 tem = Fequal (binding, definition);
265a9e55 1366 if (NILP (tem))
2c6f1a39
JB
1367 continue;
1368 }
1369 else
1370 if (!EQ (binding, definition))
1371 continue;
1372 }
1373 }
1374
1375 /* It is a true unshadowed match. Record it. */
1376
265a9e55 1377 if (!NILP (firstonly))
2c6f1a39
JB
1378 return sequence;
1379 found = Fcons (sequence, found);
1380 }
1381 }
1382 return Fnreverse (found);
1383}
1384
1385/* Return a string listing the keys and buttons that run DEFINITION. */
1386
1387static Lisp_Object
1388where_is_string (definition)
1389 Lisp_Object definition;
1390{
1391 register Lisp_Object keys, keys1;
1392
1393 keys = Fwhere_is_internal (definition,
1394 current_buffer->keymap, Qnil, Qnil, Qnil);
1395 keys1 = Fmapconcat (Qkey_description, keys, build_string (", "));
1396
1397 return keys1;
1398}
1399
1400DEFUN ("where-is", Fwhere_is, Swhere_is, 1, 1, "CWhere is command: ",
1401 "Print message listing key sequences that invoke specified command.\n\
1402Argument is a command definition, usually a symbol with a function definition.")
1403 (definition)
1404 Lisp_Object definition;
1405{
1406 register Lisp_Object string;
1407
1408 CHECK_SYMBOL (definition, 0);
1409 string = where_is_string (definition);
1410
1411 if (XSTRING (string)->size)
1412 message ("%s is on %s", XSYMBOL (definition)->name->data,
1413 XSTRING (string)->data);
1414 else
1415 message ("%s is not on any key", XSYMBOL (definition)->name->data);
1416 return Qnil;
1417}
1418\f
cc0a8174
JB
1419/* describe-bindings - summarizing all the bindings in a set of keymaps. */
1420
2c6f1a39
JB
1421DEFUN ("describe-bindings", Fdescribe_bindings, Sdescribe_bindings, 0, 0, "",
1422 "Show a list of all defined keys, and their definitions.\n\
1423The list is put in a buffer, which is displayed.")
1424 ()
1425{
1426 register Lisp_Object thisbuf;
1427 XSET (thisbuf, Lisp_Buffer, current_buffer);
1428 internal_with_output_to_temp_buffer ("*Help*",
1429 describe_buffer_bindings,
1430 thisbuf);
1431 return Qnil;
1432}
1433
1434static Lisp_Object
1435describe_buffer_bindings (descbuf)
1436 Lisp_Object descbuf;
1437{
1438 register Lisp_Object start1, start2;
1439
4726a9f1
JB
1440 char *key_heading
1441 = "\
1442key binding\n\
1443--- -------\n";
1444 char *alternate_heading
1445 = "\
1446Alternate Characters (use anywhere the nominal character is listed):\n\
1447nominal alternate\n\
1448------- ---------\n";
2c6f1a39
JB
1449
1450 Fset_buffer (Vstandard_output);
1451
4726a9f1
JB
1452 /* Report on alternates for keys. */
1453 if (XTYPE (Vkeyboard_translate_table) == Lisp_String)
1454 {
1455 int c;
1456 unsigned char *translate = XSTRING (Vkeyboard_translate_table)->data;
1457 int translate_len = XSTRING (Vkeyboard_translate_table)->size;
1458
1459 for (c = 0; c < translate_len; c++)
1460 if (translate[c] != c)
1461 {
1462 char buf[20];
1463 char *bufend;
1464
1465 if (alternate_heading)
1466 {
1467 insert_string (alternate_heading);
1468 alternate_heading = 0;
1469 }
1470
1471 bufend = push_key_description (translate[c], buf);
1472 insert (buf, bufend - buf);
1473 Findent_to (make_number (16), make_number (1));
1474 bufend = push_key_description (c, buf);
1475 insert (buf, bufend - buf);
1476
1477 insert ("\n", 1);
1478 }
1479
1480 insert ("\n", 1);
1481 }
1482
cc0a8174
JB
1483 {
1484 int i, nmaps;
1485 Lisp_Object *modes, *maps;
1486
4726a9f1
JB
1487 /* Temporarily switch to descbuf, so that we can get that buffer's
1488 minor modes correctly. */
1489 Fset_buffer (descbuf);
cc0a8174 1490 nmaps = current_minor_maps (&modes, &maps);
4726a9f1
JB
1491 Fset_buffer (Vstandard_output);
1492
cc0a8174
JB
1493 for (i = 0; i < nmaps; i++)
1494 {
1495 if (XTYPE (modes[i]) == Lisp_Symbol)
1496 {
1497 insert_char ('`');
1498 insert_string (XSYMBOL (modes[i])->name->data);
1499 insert_char ('\'');
1500 }
1501 else
1502 insert_string ("Strangely Named");
1503 insert_string (" Minor Mode Bindings:\n");
4726a9f1 1504 insert_string (key_heading);
cc0a8174
JB
1505 describe_map_tree (maps[i], 0, Qnil);
1506 insert_char ('\n');
1507 }
1508 }
1509
2c6f1a39 1510 start1 = XBUFFER (descbuf)->keymap;
265a9e55 1511 if (!NILP (start1))
2c6f1a39
JB
1512 {
1513 insert_string ("Local Bindings:\n");
4726a9f1 1514 insert_string (key_heading);
cc0a8174 1515 describe_map_tree (start1, 0, Qnil);
2c6f1a39
JB
1516 insert_string ("\n");
1517 }
1518
1519 insert_string ("Global Bindings:\n");
4726a9f1
JB
1520 if (NILP (start1))
1521 insert_string (key_heading);
2c6f1a39 1522
cc0a8174 1523 describe_map_tree (current_global_map, 0, XBUFFER (descbuf)->keymap);
2c6f1a39
JB
1524
1525 Fset_buffer (descbuf);
1526 return Qnil;
1527}
1528
1529/* Insert a desription of the key bindings in STARTMAP,
1530 followed by those of all maps reachable through STARTMAP.
1531 If PARTIAL is nonzero, omit certain "uninteresting" commands
1532 (such as `undefined').
1533 If SHADOW is non-nil, it is another map;
1534 don't mention keys which would be shadowed by it. */
1535
1536void
1537describe_map_tree (startmap, partial, shadow)
1538 Lisp_Object startmap, shadow;
1539 int partial;
1540{
1541 register Lisp_Object elt, sh;
1542 Lisp_Object maps;
1543 struct gcpro gcpro1;
1544
1545 maps = Faccessible_keymaps (startmap);
1546 GCPRO1 (maps);
1547
265a9e55 1548 for (; !NILP (maps); maps = Fcdr (maps))
2c6f1a39
JB
1549 {
1550 elt = Fcar (maps);
1551 sh = Fcar (elt);
1552
1553 /* If there is no shadow keymap given, don't shadow. */
265a9e55 1554 if (NILP (shadow))
2c6f1a39
JB
1555 sh = Qnil;
1556
1557 /* If the sequence by which we reach this keymap is zero-length,
1558 then the shadow map for this keymap is just SHADOW. */
1559 else if ((XTYPE (sh) == Lisp_String
1560 && XSTRING (sh)->size == 0)
1561 || (XTYPE (sh) == Lisp_Vector
1562 && XVECTOR (sh)->size == 0))
1563 sh = shadow;
1564
1565 /* If the sequence by which we reach this keymap actually has
1566 some elements, then the sequence's definition in SHADOW is
1567 what we should use. */
1568 else
1569 {
1570 sh = Flookup_key (shadow, Fcar (elt));
1571 if (XTYPE (sh) == Lisp_Int)
1572 sh = Qnil;
1573 }
1574
1575 /* If sh is null (meaning that the current map is not shadowed),
1576 or a keymap (meaning that bindings from the current map might
1577 show through), describe the map. Otherwise, sh is a command
1578 that completely shadows the current map, and we shouldn't
1579 bother. */
265a9e55 1580 if (NILP (sh) || !NILP (Fkeymapp (sh)))
2c6f1a39
JB
1581 describe_map (Fcdr (elt), Fcar (elt), partial, sh);
1582 }
1583
1584 UNGCPRO;
1585}
1586
1587static void
1588describe_command (definition)
1589 Lisp_Object definition;
1590{
1591 register Lisp_Object tem1;
1592
1593 Findent_to (make_number (16), make_number (1));
1594
1595 if (XTYPE (definition) == Lisp_Symbol)
1596 {
1597 XSET (tem1, Lisp_String, XSYMBOL (definition)->name);
1598 insert1 (tem1);
1599 insert_string ("\n");
1600 }
1601 else
1602 {
1603 tem1 = Fkeymapp (definition);
265a9e55 1604 if (!NILP (tem1))
2c6f1a39
JB
1605 insert_string ("Prefix Command\n");
1606 else
1607 insert_string ("??\n");
1608 }
1609}
1610
1611/* Describe the contents of map MAP, assuming that this map itself is
1612 reached by the sequence of prefix keys KEYS (a string or vector).
1613 PARTIAL, SHADOW is as in `describe_map_tree' above. */
1614
1615static void
1616describe_map (map, keys, partial, shadow)
1617 Lisp_Object map, keys;
1618 int partial;
1619 Lisp_Object shadow;
1620{
1621 register Lisp_Object keysdesc;
1622
d09b2024 1623 if (!NILP (keys) && XFASTINT (Flength (keys)) > 0)
2c6f1a39
JB
1624 keysdesc = concat2 (Fkey_description (keys),
1625 build_string (" "));
1626 else
1627 keysdesc = Qnil;
1628
f5b79c1c 1629 describe_map_2 (map, keysdesc, describe_command, partial, shadow);
2c6f1a39
JB
1630}
1631
f5b79c1c 1632/* Insert a description of KEYMAP into the current buffer. */
2c6f1a39
JB
1633
1634static void
f5b79c1c
JB
1635describe_map_2 (keymap, elt_prefix, elt_describer, partial, shadow)
1636 register Lisp_Object keymap;
2c6f1a39
JB
1637 Lisp_Object elt_prefix;
1638 int (*elt_describer) ();
1639 int partial;
1640 Lisp_Object shadow;
1641{
1642 Lisp_Object this;
1643 Lisp_Object tem1, tem2 = Qnil;
1644 Lisp_Object suppress;
1645 Lisp_Object kludge;
1646 int first = 1;
1647 struct gcpro gcpro1, gcpro2, gcpro3;
1648
1649 if (partial)
1650 suppress = intern ("suppress-keymap");
1651
1652 /* This vector gets used to present single keys to Flookup_key. Since
f5b79c1c 1653 that is done once per keymap element, we don't want to cons up a
2c6f1a39
JB
1654 fresh vector every time. */
1655 kludge = Fmake_vector (make_number (1), Qnil);
1656
1657 GCPRO3 (elt_prefix, tem2, kludge);
1658
f5b79c1c 1659 for (; CONSP (keymap); keymap = Fcdr (keymap))
2c6f1a39
JB
1660 {
1661 QUIT;
2c6f1a39 1662
f5b79c1c
JB
1663 if (XTYPE (XCONS (keymap)->car) == Lisp_Vector)
1664 describe_vector (XCONS (keymap)->car,
1665 elt_prefix, elt_describer, partial, shadow);
1666 else
2c6f1a39 1667 {
f5b79c1c
JB
1668 tem1 = Fcar_safe (Fcar (keymap));
1669 tem2 = get_keyelt (Fcdr_safe (Fcar (keymap)));
2c6f1a39 1670
f5b79c1c
JB
1671 /* Don't show undefined commands or suppressed commands. */
1672 if (NILP (tem2)) continue;
1673 if (XTYPE (tem2) == Lisp_Symbol && partial)
1674 {
1675 this = Fget (tem2, suppress);
1676 if (!NILP (this))
1677 continue;
1678 }
2c6f1a39 1679
f5b79c1c
JB
1680 /* Don't show a command that isn't really visible
1681 because a local definition of the same key shadows it. */
2c6f1a39 1682
f5b79c1c
JB
1683 if (!NILP (shadow))
1684 {
1685 Lisp_Object tem;
2c6f1a39 1686
f5b79c1c
JB
1687 XVECTOR (kludge)->contents[0] = tem1;
1688 tem = Flookup_key (shadow, kludge);
1689 if (!NILP (tem)) continue;
1690 }
1691
1692 if (first)
1693 {
1694 insert ("\n", 1);
1695 first = 0;
1696 }
2c6f1a39 1697
f5b79c1c
JB
1698 if (!NILP (elt_prefix))
1699 insert1 (elt_prefix);
2c6f1a39 1700
f5b79c1c
JB
1701 /* THIS gets the string to describe the character TEM1. */
1702 this = Fsingle_key_description (tem1);
1703 insert1 (this);
2c6f1a39 1704
f5b79c1c
JB
1705 /* Print a description of the definition of this character.
1706 elt_describer will take care of spacing out far enough
1707 for alignment purposes. */
1708 (*elt_describer) (tem2);
1709 }
2c6f1a39
JB
1710 }
1711
1712 UNGCPRO;
1713}
1714
1715static int
1716describe_vector_princ (elt)
1717 Lisp_Object elt;
1718{
1719 Fprinc (elt, Qnil);
1720}
1721
1722DEFUN ("describe-vector", Fdescribe_vector, Sdescribe_vector, 1, 1, 0,
1723 "Print on `standard-output' a description of contents of VECTOR.\n\
1724This is text showing the elements of vector matched against indices.")
1725 (vector)
1726 Lisp_Object vector;
1727{
1728 CHECK_VECTOR (vector, 0);
1729 describe_vector (vector, Qnil, describe_vector_princ, 0, Qnil, Qnil);
1730}
1731
1732describe_vector (vector, elt_prefix, elt_describer, partial, shadow)
1733 register Lisp_Object vector;
1734 Lisp_Object elt_prefix;
1735 int (*elt_describer) ();
1736 int partial;
1737 Lisp_Object shadow;
1738{
1739 Lisp_Object this;
1740 Lisp_Object dummy;
1741 Lisp_Object tem1, tem2;
1742 register int i;
1743 Lisp_Object suppress;
1744 Lisp_Object kludge;
1745 int first = 1;
1746 struct gcpro gcpro1, gcpro2, gcpro3;
1747
1748 tem1 = Qnil;
1749
1750 /* This vector gets used to present single keys to Flookup_key. Since
1751 that is done once per vector element, we don't want to cons up a
1752 fresh vector every time. */
1753 kludge = Fmake_vector (make_number (1), Qnil);
1754 GCPRO3 (elt_prefix, tem1, kludge);
1755
1756 if (partial)
1757 suppress = intern ("suppress-keymap");
1758
1759 for (i = 0; i < DENSE_TABLE_SIZE; i++)
1760 {
1761 QUIT;
1762 tem1 = get_keyelt (XVECTOR (vector)->contents[i]);
1763
265a9e55 1764 if (NILP (tem1)) continue;
2c6f1a39
JB
1765
1766 /* Don't mention suppressed commands. */
1767 if (XTYPE (tem1) == Lisp_Symbol && partial)
1768 {
1769 this = Fget (tem1, suppress);
265a9e55 1770 if (!NILP (this))
2c6f1a39
JB
1771 continue;
1772 }
1773
1774 /* If this command in this map is shadowed by some other map,
1775 ignore it. */
265a9e55 1776 if (!NILP (shadow))
2c6f1a39
JB
1777 {
1778 Lisp_Object tem;
1779
1780 XVECTOR (kludge)->contents[0] = make_number (i);
1781 tem = Flookup_key (shadow, kludge);
1782
265a9e55 1783 if (!NILP (tem)) continue;
2c6f1a39
JB
1784 }
1785
1786 if (first)
1787 {
1788 insert ("\n", 1);
1789 first = 0;
1790 }
1791
1792 /* Output the prefix that applies to every entry in this map. */
265a9e55 1793 if (!NILP (elt_prefix))
2c6f1a39
JB
1794 insert1 (elt_prefix);
1795
1796 /* Get the string to describe the character I, and print it. */
1797 XFASTINT (dummy) = i;
1798
1799 /* THIS gets the string to describe the character DUMMY. */
1800 this = Fsingle_key_description (dummy);
1801 insert1 (this);
1802
1803 /* Find all consecutive characters that have the same definition. */
1804 while (i + 1 < DENSE_TABLE_SIZE
1805 && (tem2 = get_keyelt (XVECTOR (vector)->contents[i+1]),
1806 EQ (tem2, tem1)))
1807 i++;
1808
1809 /* If we have a range of more than one character,
1810 print where the range reaches to. */
1811
1812 if (i != XINT (dummy))
1813 {
1814 insert (" .. ", 4);
265a9e55 1815 if (!NILP (elt_prefix))
2c6f1a39
JB
1816 insert1 (elt_prefix);
1817
1818 XFASTINT (dummy) = i;
1819 insert1 (Fsingle_key_description (dummy));
1820 }
1821
1822 /* Print a description of the definition of this character.
1823 elt_describer will take care of spacing out far enough
1824 for alignment purposes. */
1825 (*elt_describer) (tem1);
1826 }
1827
1828 UNGCPRO;
1829}
1830\f
cc0a8174 1831/* Apropos - finding all symbols whose names match a regexp. */
2c6f1a39
JB
1832Lisp_Object apropos_predicate;
1833Lisp_Object apropos_accumulate;
1834
1835static void
1836apropos_accum (symbol, string)
1837 Lisp_Object symbol, string;
1838{
1839 register Lisp_Object tem;
1840
1841 tem = Fstring_match (string, Fsymbol_name (symbol), Qnil);
265a9e55 1842 if (!NILP (tem) && !NILP (apropos_predicate))
2c6f1a39 1843 tem = call1 (apropos_predicate, symbol);
265a9e55 1844 if (!NILP (tem))
2c6f1a39
JB
1845 apropos_accumulate = Fcons (symbol, apropos_accumulate);
1846}
1847
1848DEFUN ("apropos-internal", Fapropos_internal, Sapropos_internal, 1, 2, 0,
1849 "Show all symbols whose names contain match for REGEXP.\n\
1850If optional 2nd arg PRED is non-nil, (funcall PRED SYM) is done\n\
1851for each symbol and a symbol is mentioned only if that returns non-nil.\n\
1852Return list of symbols found.")
1853 (string, pred)
1854 Lisp_Object string, pred;
1855{
1856 struct gcpro gcpro1, gcpro2;
1857 CHECK_STRING (string, 0);
1858 apropos_predicate = pred;
1859 GCPRO2 (apropos_predicate, apropos_accumulate);
1860 apropos_accumulate = Qnil;
1861 map_obarray (Vobarray, apropos_accum, string);
1862 apropos_accumulate = Fsort (apropos_accumulate, Qstring_lessp);
1863 UNGCPRO;
1864 return apropos_accumulate;
1865}
1866\f
1867syms_of_keymap ()
1868{
1869 Lisp_Object tem;
1870
1871 Qkeymap = intern ("keymap");
1872 staticpro (&Qkeymap);
1873
1874/* Initialize the keymaps standardly used.
1875 Each one is the value of a Lisp variable, and is also
1876 pointed to by a C variable */
1877
ce6e5d0b 1878 global_map = Fmake_keymap (Qnil);
2c6f1a39
JB
1879 Fset (intern ("global-map"), global_map);
1880
ce6e5d0b 1881 meta_map = Fmake_keymap (Qnil);
2c6f1a39
JB
1882 Fset (intern ("esc-map"), meta_map);
1883 Ffset (intern ("ESC-prefix"), meta_map);
1884
ce6e5d0b 1885 control_x_map = Fmake_keymap (Qnil);
2c6f1a39
JB
1886 Fset (intern ("ctl-x-map"), control_x_map);
1887 Ffset (intern ("Control-X-prefix"), control_x_map);
1888
1889 DEFVAR_LISP ("minibuffer-local-map", &Vminibuffer_local_map,
1890 "Default keymap to use when reading from the minibuffer.");
ce6e5d0b 1891 Vminibuffer_local_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
1892
1893 DEFVAR_LISP ("minibuffer-local-ns-map", &Vminibuffer_local_ns_map,
1894 "Local keymap for the minibuffer when spaces are not allowed.");
ce6e5d0b 1895 Vminibuffer_local_ns_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
1896
1897 DEFVAR_LISP ("minibuffer-local-completion-map", &Vminibuffer_local_completion_map,
1898 "Local keymap for minibuffer input with completion.");
ce6e5d0b 1899 Vminibuffer_local_completion_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
1900
1901 DEFVAR_LISP ("minibuffer-local-must-match-map", &Vminibuffer_local_must_match_map,
1902 "Local keymap for minibuffer input with completion, for exact match.");
ce6e5d0b 1903 Vminibuffer_local_must_match_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
1904
1905 current_global_map = global_map;
1906
cc0a8174
JB
1907 DEFVAR_LISP ("minor-mode-map-alist", &Vminor_mode_map_alist,
1908 "Alist of keymaps to use for minor modes.\n\
1909Each element looks like (VARIABLE . KEYMAP); KEYMAP is used to read\n\
1910key sequences and look up bindings iff VARIABLE's value is non-nil.\n\
1911If two active keymaps bind the same key, the keymap appearing earlier\n\
1912in the list takes precedence.");
1913 Vminor_mode_map_alist = Qnil;
1914
6bbbd9b0
JB
1915 DEFVAR_LISP ("function-key-map", &Vfunction_key_map,
1916 "Keymap mapping ASCII function key sequences onto their preferred forms.\n\
1917This allows Emacs to recognize function keys sent from ASCII\n\
1918terminals at any point in a key sequence.\n\
1919\n\
1920The read-key-sequence function replaces subsequences bound by\n\
1921function-key-map with their bindings. When the current local and global\n\
1922keymaps have no binding for the current key sequence but\n\
1923function-key-map binds a suffix of the sequence to a vector,\n\
1924read-key-sequence replaces the matching suffix with its binding, and\n\
1925continues with the new sequence.\n\
1926\n\
1927For example, suppose function-key-map binds `ESC O P' to [pf1].\n\
1928Typing `ESC O P' to read-key-sequence would return [pf1]. Typing\n\
1929`C-x ESC O P' would return [?\C-x pf1]. If [pf1] were a prefix\n\
1930key, typing `ESC O P x' would return [pf1 x].");
ce6e5d0b 1931 Vfunction_key_map = Fmake_sparse_keymap (Qnil);
6bbbd9b0 1932
2c6f1a39
JB
1933 Qsingle_key_description = intern ("single-key-description");
1934 staticpro (&Qsingle_key_description);
1935
1936 Qkey_description = intern ("key-description");
1937 staticpro (&Qkey_description);
1938
1939 Qkeymapp = intern ("keymapp");
1940 staticpro (&Qkeymapp);
1941
1942 defsubr (&Skeymapp);
1943 defsubr (&Smake_keymap);
1944 defsubr (&Smake_sparse_keymap);
1945 defsubr (&Scopy_keymap);
1946 defsubr (&Skey_binding);
1947 defsubr (&Slocal_key_binding);
1948 defsubr (&Sglobal_key_binding);
cc0a8174 1949 defsubr (&Sminor_mode_key_binding);
2c6f1a39
JB
1950 defsubr (&Sglobal_set_key);
1951 defsubr (&Slocal_set_key);
1952 defsubr (&Sdefine_key);
1953 defsubr (&Slookup_key);
1954 defsubr (&Sglobal_unset_key);
1955 defsubr (&Slocal_unset_key);
1956 defsubr (&Sdefine_prefix_command);
1957 defsubr (&Suse_global_map);
1958 defsubr (&Suse_local_map);
1959 defsubr (&Scurrent_local_map);
1960 defsubr (&Scurrent_global_map);
cc0a8174 1961 defsubr (&Scurrent_minor_mode_maps);
2c6f1a39
JB
1962 defsubr (&Saccessible_keymaps);
1963 defsubr (&Skey_description);
1964 defsubr (&Sdescribe_vector);
1965 defsubr (&Ssingle_key_description);
1966 defsubr (&Stext_char_description);
1967 defsubr (&Swhere_is_internal);
1968 defsubr (&Swhere_is);
1969 defsubr (&Sdescribe_bindings);
1970 defsubr (&Sapropos_internal);
1971}
1972
1973keys_of_keymap ()
1974{
1975 Lisp_Object tem;
1976
1977 initial_define_key (global_map, 033, "ESC-prefix");
1978 initial_define_key (global_map, Ctl('X'), "Control-X-prefix");
1979}