]> code.delx.au - gnu-emacs/blob - src/keymap.c
(Fwin32_has_winsock, Fwin32_unload_winsock) [HAVE_SOCKETS]: New functions.
[gnu-emacs] / src / keymap.c
1 /* Manipulation of keymaps
2 Copyright (C) 1985, 86, 87, 88, 93, 94, 95 Free Software Foundation, Inc.
3
4 This file is part of GNU Emacs.
5
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21
22 #include <config.h>
23 #include <stdio.h>
24 #undef NULL
25 #include "lisp.h"
26 #include "commands.h"
27 #include "buffer.h"
28 #include "keyboard.h"
29 #include "termhooks.h"
30 #include "blockinput.h"
31 #include "puresize.h"
32
33 #define min(a, b) ((a) < (b) ? (a) : (b))
34
35 /* The number of elements in keymap vectors. */
36 #define DENSE_TABLE_SIZE (0200)
37
38 /* Actually allocate storage for these variables */
39
40 Lisp_Object current_global_map; /* Current global keymap */
41
42 Lisp_Object global_map; /* default global key bindings */
43
44 Lisp_Object meta_map; /* The keymap used for globally bound
45 ESC-prefixed default commands */
46
47 Lisp_Object control_x_map; /* The keymap used for globally bound
48 C-x-prefixed default commands */
49
50 /* was MinibufLocalMap */
51 Lisp_Object Vminibuffer_local_map;
52 /* The keymap used by the minibuf for local
53 bindings when spaces are allowed in the
54 minibuf */
55
56 /* was MinibufLocalNSMap */
57 Lisp_Object Vminibuffer_local_ns_map;
58 /* The keymap used by the minibuf for local
59 bindings when spaces are not encouraged
60 in the minibuf */
61
62 /* keymap used for minibuffers when doing completion */
63 /* was MinibufLocalCompletionMap */
64 Lisp_Object Vminibuffer_local_completion_map;
65
66 /* keymap used for minibuffers when doing completion and require a match */
67 /* was MinibufLocalMustMatchMap */
68 Lisp_Object Vminibuffer_local_must_match_map;
69
70 /* Alist of minor mode variables and keymaps. */
71 Lisp_Object Vminor_mode_map_alist;
72
73 /* Keymap mapping ASCII function key sequences onto their preferred forms.
74 Initialized by the terminal-specific lisp files. See DEFVAR for more
75 documentation. */
76 Lisp_Object Vfunction_key_map;
77
78 /* Keymap mapping ASCII function key sequences onto their preferred forms. */
79 Lisp_Object Vkey_translation_map;
80
81 /* A list of all commands given new bindings since a certain time
82 when nil was stored here.
83 This is used to speed up recomputation of menu key equivalents
84 when Emacs starts up. t means don't record anything here. */
85 Lisp_Object Vdefine_key_rebound_commands;
86
87 Lisp_Object Qkeymapp, Qkeymap, Qnon_ascii;
88
89 /* A char with the CHAR_META bit set in a vector or the 0200 bit set
90 in a string key sequence is equivalent to prefixing with this
91 character. */
92 extern Lisp_Object meta_prefix_char;
93
94 extern Lisp_Object Voverriding_local_map;
95
96 static Lisp_Object define_as_prefix ();
97 static Lisp_Object describe_buffer_bindings ();
98 static void describe_command (), describe_translation ();
99 static void describe_map ();
100 \f
101 /* Keymap object support - constructors and predicates. */
102
103 DEFUN ("make-keymap", Fmake_keymap, Smake_keymap, 0, 1, 0,
104 "Construct and return a new keymap, of the form (keymap VECTOR . ALIST).\n\
105 VECTOR is a vector which holds the bindings for the ASCII\n\
106 characters. ALIST is an assoc-list which holds bindings for function keys,\n\
107 mouse events, and any other things that appear in the input stream.\n\
108 All entries in it are initially nil, meaning \"command undefined\".\n\n\
109 The optional arg STRING supplies a menu name for the keymap\n\
110 in case you use it as a menu with `x-popup-menu'.")
111 (string)
112 Lisp_Object string;
113 {
114 Lisp_Object tail;
115 if (!NILP (string))
116 tail = Fcons (string, Qnil);
117 else
118 tail = Qnil;
119 return Fcons (Qkeymap,
120 Fcons (Fmake_vector (make_number (DENSE_TABLE_SIZE), Qnil),
121 tail));
122 }
123
124 DEFUN ("make-sparse-keymap", Fmake_sparse_keymap, Smake_sparse_keymap, 0, 1, 0,
125 "Construct and return a new sparse-keymap list.\n\
126 Its car is `keymap' and its cdr is an alist of (CHAR . DEFINITION),\n\
127 which binds the character CHAR to DEFINITION, or (SYMBOL . DEFINITION),\n\
128 which binds the function key or mouse event SYMBOL to DEFINITION.\n\
129 Initially the alist is nil.\n\n\
130 The optional arg STRING supplies a menu name for the keymap\n\
131 in case you use it as a menu with `x-popup-menu'.")
132 (string)
133 Lisp_Object string;
134 {
135 if (!NILP (string))
136 return Fcons (Qkeymap, Fcons (string, Qnil));
137 return Fcons (Qkeymap, Qnil);
138 }
139
140 /* This function is used for installing the standard key bindings
141 at initialization time.
142
143 For example:
144
145 initial_define_key (control_x_map, Ctl('X'), "exchange-point-and-mark"); */
146
147 void
148 initial_define_key (keymap, key, defname)
149 Lisp_Object keymap;
150 int key;
151 char *defname;
152 {
153 store_in_keymap (keymap, make_number (key), intern (defname));
154 }
155
156 void
157 initial_define_lispy_key (keymap, keyname, defname)
158 Lisp_Object keymap;
159 char *keyname;
160 char *defname;
161 {
162 store_in_keymap (keymap, intern (keyname), intern (defname));
163 }
164
165 /* Define character fromchar in map frommap as an alias for character
166 tochar in map tomap. Subsequent redefinitions of the latter WILL
167 affect the former. */
168
169 #if 0
170 void
171 synkey (frommap, fromchar, tomap, tochar)
172 struct Lisp_Vector *frommap, *tomap;
173 int fromchar, tochar;
174 {
175 Lisp_Object v, c;
176 XSETVECTOR (v, tomap);
177 XSETFASTINT (c, tochar);
178 frommap->contents[fromchar] = Fcons (v, c);
179 }
180 #endif /* 0 */
181
182 DEFUN ("keymapp", Fkeymapp, Skeymapp, 1, 1, 0,
183 "Return t if OBJECT is a keymap.\n\
184 \n\
185 A keymap is a list (keymap . ALIST),\n\
186 or a symbol whose function definition is itself a keymap.\n\
187 ALIST elements look like (CHAR . DEFN) or (SYMBOL . DEFN);\n\
188 a vector of densely packed bindings for small character codes\n\
189 is also allowed as an element.")
190 (object)
191 Lisp_Object object;
192 {
193 return (NILP (get_keymap_1 (object, 0, 0)) ? Qnil : Qt);
194 }
195
196 /* Check that OBJECT is a keymap (after dereferencing through any
197 symbols). If it is, return it.
198
199 If AUTOLOAD is non-zero and OBJECT is a symbol whose function value
200 is an autoload form, do the autoload and try again.
201 If AUTOLOAD is nonzero, callers must assume GC is possible.
202
203 ERROR controls how we respond if OBJECT isn't a keymap.
204 If ERROR is non-zero, signal an error; otherwise, just return Qnil.
205
206 Note that most of the time, we don't want to pursue autoloads.
207 Functions like Faccessible_keymaps which scan entire keymap trees
208 shouldn't load every autoloaded keymap. I'm not sure about this,
209 but it seems to me that only read_key_sequence, Flookup_key, and
210 Fdefine_key should cause keymaps to be autoloaded. */
211
212 Lisp_Object
213 get_keymap_1 (object, error, autoload)
214 Lisp_Object object;
215 int error, autoload;
216 {
217 Lisp_Object tem;
218
219 autoload_retry:
220 tem = indirect_function (object);
221 if (CONSP (tem) && EQ (XCONS (tem)->car, Qkeymap))
222 return tem;
223
224 /* Should we do an autoload? Autoload forms for keymaps have
225 Qkeymap as their fifth element. */
226 if (autoload
227 && SYMBOLP (object)
228 && CONSP (tem)
229 && EQ (XCONS (tem)->car, Qautoload))
230 {
231 Lisp_Object tail;
232
233 tail = Fnth (make_number (4), tem);
234 if (EQ (tail, Qkeymap))
235 {
236 struct gcpro gcpro1, gcpro2;
237
238 GCPRO2 (tem, object);
239 do_autoload (tem, object);
240 UNGCPRO;
241
242 goto autoload_retry;
243 }
244 }
245
246 if (error)
247 wrong_type_argument (Qkeymapp, object);
248 else
249 return Qnil;
250 }
251
252
253 /* Follow any symbol chaining, and return the keymap denoted by OBJECT.
254 If OBJECT doesn't denote a keymap at all, signal an error. */
255 Lisp_Object
256 get_keymap (object)
257 Lisp_Object object;
258 {
259 return get_keymap_1 (object, 1, 0);
260 }
261 \f
262 /* Return the parent map of the keymap MAP, or nil if it has none.
263 We assume that MAP is a valid keymap. */
264
265 DEFUN ("keymap-parent", Fkeymap_parent, Skeymap_parent, 1, 1, 0,
266 "Return the parent keymap of KEYMAP.")
267 (keymap)
268 Lisp_Object keymap;
269 {
270 Lisp_Object list;
271
272 keymap = get_keymap_1 (keymap, 1, 1);
273
274 /* Skip past the initial element `keymap'. */
275 list = XCONS (keymap)->cdr;
276 for (; CONSP (list); list = XCONS (list)->cdr)
277 {
278 /* See if there is another `keymap'. */
279 if (EQ (Qkeymap, XCONS (list)->car))
280 return list;
281 }
282
283 return Qnil;
284 }
285
286 /* Set the parent keymap of MAP to PARENT. */
287
288 DEFUN ("set-keymap-parent", Fset_keymap_parent, Sset_keymap_parent, 2, 2, 0,
289 "Modify KEYMAP to set its parent map to PARENT.\n\
290 PARENT should be nil or another keymap.")
291 (keymap, parent)
292 Lisp_Object keymap, parent;
293 {
294 Lisp_Object list, prev;
295 int i;
296
297 keymap = get_keymap_1 (keymap, 1, 1);
298 if (!NILP (parent))
299 parent = get_keymap_1 (parent, 1, 1);
300
301 /* Skip past the initial element `keymap'. */
302 prev = keymap;
303 while (1)
304 {
305 list = XCONS (prev)->cdr;
306 /* If there is a parent keymap here, replace it.
307 If we came to the end, add the parent in PREV. */
308 if (! CONSP (list) || EQ (Qkeymap, XCONS (list)->car))
309 {
310 XCONS (prev)->cdr = parent;
311 break;
312 }
313 prev = list;
314 }
315
316 /* Scan through for submaps, and set their parents too. */
317
318 for (list = XCONS (keymap)->cdr; CONSP (list); list = XCONS (list)->cdr)
319 {
320 /* Stop the scan when we come to the parent. */
321 if (EQ (XCONS (list)->car, Qkeymap))
322 break;
323
324 /* If this element holds a prefix map, deal with it. */
325 if (CONSP (XCONS (list)->car)
326 && CONSP (XCONS (XCONS (list)->car)->cdr))
327 fix_submap_inheritance (keymap, XCONS (XCONS (list)->car)->car,
328 XCONS (XCONS (list)->car)->cdr);
329
330 if (VECTORP (XCONS (list)->car))
331 for (i = 0; i < XVECTOR (XCONS (list)->car)->size; i++)
332 if (CONSP (XVECTOR (XCONS (list)->car)->contents[i]))
333 fix_submap_inheritance (keymap, make_number (i),
334 XVECTOR (XCONS (list)->car)->contents[i]);
335 }
336
337 return parent;
338 }
339
340 /* EVENT is defined in MAP as a prefix, and SUBMAP is its definition.
341 if EVENT is also a prefix in MAP's parent,
342 make sure that SUBMAP inherits that definition as its own parent. */
343
344 fix_submap_inheritance (map, event, submap)
345 Lisp_Object map, event, submap;
346 {
347 Lisp_Object map_parent, parent_entry;
348
349 /* SUBMAP is a cons that we found as a key binding.
350 Discard the other things found in a menu key binding. */
351
352 if (CONSP (submap)
353 && STRINGP (XCONS (submap)->car))
354 {
355 submap = XCONS (submap)->cdr;
356 /* Also remove a menu help string, if any,
357 following the menu item name. */
358 if (CONSP (submap) && STRINGP (XCONS (submap)->car))
359 submap = XCONS (submap)->cdr;
360 /* Also remove the sublist that caches key equivalences, if any. */
361 if (CONSP (submap)
362 && CONSP (XCONS (submap)->car))
363 {
364 Lisp_Object carcar;
365 carcar = XCONS (XCONS (submap)->car)->car;
366 if (NILP (carcar) || VECTORP (carcar))
367 submap = XCONS (submap)->cdr;
368 }
369 }
370
371 /* If it isn't a keymap now, there's no work to do. */
372 if (! CONSP (submap)
373 || ! EQ (XCONS (submap)->car, Qkeymap))
374 return;
375
376 map_parent = Fkeymap_parent (map);
377 if (! NILP (map_parent))
378 parent_entry = access_keymap (map_parent, event, 0, 0);
379 else
380 parent_entry = Qnil;
381
382 if (! EQ (parent_entry, submap))
383 Fset_keymap_parent (submap, parent_entry);
384 }
385 \f
386 /* Look up IDX in MAP. IDX may be any sort of event.
387 Note that this does only one level of lookup; IDX must be a single
388 event, not a sequence.
389
390 If T_OK is non-zero, bindings for Qt are treated as default
391 bindings; any key left unmentioned by other tables and bindings is
392 given the binding of Qt.
393
394 If T_OK is zero, bindings for Qt are not treated specially.
395
396 If NOINHERIT, don't accept a subkeymap found in an inherited keymap. */
397
398 Lisp_Object
399 access_keymap (map, idx, t_ok, noinherit)
400 Lisp_Object map;
401 Lisp_Object idx;
402 int t_ok;
403 int noinherit;
404 {
405 int noprefix = 0;
406 Lisp_Object val;
407
408 /* If idx is a list (some sort of mouse click, perhaps?),
409 the index we want to use is the car of the list, which
410 ought to be a symbol. */
411 idx = EVENT_HEAD (idx);
412
413 /* If idx is a symbol, it might have modifiers, which need to
414 be put in the canonical order. */
415 if (SYMBOLP (idx))
416 idx = reorder_modifiers (idx);
417 else if (INTEGERP (idx))
418 /* Clobber the high bits that can be present on a machine
419 with more than 24 bits of integer. */
420 XSETFASTINT (idx, XINT (idx) & (CHAR_META | (CHAR_META - 1)));
421
422 {
423 Lisp_Object tail;
424 Lisp_Object t_binding;
425
426 t_binding = Qnil;
427 for (tail = map; CONSP (tail); tail = XCONS (tail)->cdr)
428 {
429 Lisp_Object binding;
430
431 binding = XCONS (tail)->car;
432 if (SYMBOLP (binding))
433 {
434 /* If NOINHERIT, stop finding prefix definitions
435 after we pass a second occurrence of the `keymap' symbol. */
436 if (noinherit && EQ (binding, Qkeymap) && ! EQ (tail, map))
437 noprefix = 1;
438 }
439 else if (CONSP (binding))
440 {
441 if (EQ (XCONS (binding)->car, idx))
442 {
443 val = XCONS (binding)->cdr;
444 if (noprefix && CONSP (val) && EQ (XCONS (val)->car, Qkeymap))
445 return Qnil;
446 if (CONSP (val))
447 fix_submap_inheritance (map, idx, val);
448 return val;
449 }
450 if (t_ok && EQ (XCONS (binding)->car, Qt))
451 t_binding = XCONS (binding)->cdr;
452 }
453 else if (VECTORP (binding))
454 {
455 if (NATNUMP (idx) && XFASTINT (idx) < XVECTOR (binding)->size)
456 {
457 val = XVECTOR (binding)->contents[XFASTINT (idx)];
458 if (noprefix && CONSP (val) && EQ (XCONS (val)->car, Qkeymap))
459 return Qnil;
460 if (CONSP (val))
461 fix_submap_inheritance (map, idx, val);
462 return val;
463 }
464 }
465
466 QUIT;
467 }
468
469 return t_binding;
470 }
471 }
472
473 /* Given OBJECT which was found in a slot in a keymap,
474 trace indirect definitions to get the actual definition of that slot.
475 An indirect definition is a list of the form
476 (KEYMAP . INDEX), where KEYMAP is a keymap or a symbol defined as one
477 and INDEX is the object to look up in KEYMAP to yield the definition.
478
479 Also if OBJECT has a menu string as the first element,
480 remove that. Also remove a menu help string as second element.
481
482 If AUTOLOAD is nonzero, load autoloadable keymaps
483 that are referred to with indirection. */
484
485 Lisp_Object
486 get_keyelt (object, autoload)
487 register Lisp_Object object;
488 int autoload;
489 {
490 while (1)
491 {
492 register Lisp_Object map, tem;
493
494 /* If the contents are (KEYMAP . ELEMENT), go indirect. */
495 map = get_keymap_1 (Fcar_safe (object), 0, autoload);
496 tem = Fkeymapp (map);
497 if (!NILP (tem))
498 object = access_keymap (map, Fcdr (object), 0, 0);
499
500 /* If the keymap contents looks like (STRING . DEFN),
501 use DEFN.
502 Keymap alist elements like (CHAR MENUSTRING . DEFN)
503 will be used by HierarKey menus. */
504 else if (CONSP (object)
505 && STRINGP (XCONS (object)->car))
506 {
507 object = XCONS (object)->cdr;
508 /* Also remove a menu help string, if any,
509 following the menu item name. */
510 if (CONSP (object) && STRINGP (XCONS (object)->car))
511 object = XCONS (object)->cdr;
512 /* Also remove the sublist that caches key equivalences, if any. */
513 if (CONSP (object)
514 && CONSP (XCONS (object)->car))
515 {
516 Lisp_Object carcar;
517 carcar = XCONS (XCONS (object)->car)->car;
518 if (NILP (carcar) || VECTORP (carcar))
519 object = XCONS (object)->cdr;
520 }
521 }
522
523 else
524 /* Anything else is really the value. */
525 return object;
526 }
527 }
528
529 Lisp_Object
530 store_in_keymap (keymap, idx, def)
531 Lisp_Object keymap;
532 register Lisp_Object idx;
533 register Lisp_Object def;
534 {
535 /* If we are preparing to dump, and DEF is a menu element
536 with a menu item string, copy it to ensure it is not pure. */
537 if (CONSP (def) && PURE_P (def) && STRINGP (XCONS (def)->car))
538 def = Fcons (XCONS (def)->car, XCONS (def)->cdr);
539
540 if (!CONSP (keymap) || ! EQ (XCONS (keymap)->car, Qkeymap))
541 error ("attempt to define a key in a non-keymap");
542
543 /* If idx is a list (some sort of mouse click, perhaps?),
544 the index we want to use is the car of the list, which
545 ought to be a symbol. */
546 idx = EVENT_HEAD (idx);
547
548 /* If idx is a symbol, it might have modifiers, which need to
549 be put in the canonical order. */
550 if (SYMBOLP (idx))
551 idx = reorder_modifiers (idx);
552 else if (INTEGERP (idx))
553 /* Clobber the high bits that can be present on a machine
554 with more than 24 bits of integer. */
555 XSETFASTINT (idx, XINT (idx) & (CHAR_META | (CHAR_META - 1)));
556
557 /* Scan the keymap for a binding of idx. */
558 {
559 Lisp_Object tail;
560
561 /* The cons after which we should insert new bindings. If the
562 keymap has a table element, we record its position here, so new
563 bindings will go after it; this way, the table will stay
564 towards the front of the alist and character lookups in dense
565 keymaps will remain fast. Otherwise, this just points at the
566 front of the keymap. */
567 Lisp_Object insertion_point;
568
569 insertion_point = keymap;
570 for (tail = XCONS (keymap)->cdr; CONSP (tail); tail = XCONS (tail)->cdr)
571 {
572 Lisp_Object elt;
573
574 elt = XCONS (tail)->car;
575 if (VECTORP (elt))
576 {
577 if (NATNUMP (idx) && XFASTINT (idx) < XVECTOR (elt)->size)
578 {
579 XVECTOR (elt)->contents[XFASTINT (idx)] = def;
580 return def;
581 }
582 insertion_point = tail;
583 }
584 else if (CONSP (elt))
585 {
586 if (EQ (idx, XCONS (elt)->car))
587 {
588 XCONS (elt)->cdr = def;
589 return def;
590 }
591 }
592 else if (SYMBOLP (elt))
593 {
594 /* If we find a 'keymap' symbol in the spine of KEYMAP,
595 then we must have found the start of a second keymap
596 being used as the tail of KEYMAP, and a binding for IDX
597 should be inserted before it. */
598 if (EQ (elt, Qkeymap))
599 goto keymap_end;
600 }
601
602 QUIT;
603 }
604
605 keymap_end:
606 /* We have scanned the entire keymap, and not found a binding for
607 IDX. Let's add one. */
608 XCONS (insertion_point)->cdr
609 = Fcons (Fcons (idx, def), XCONS (insertion_point)->cdr);
610 }
611
612 return def;
613 }
614
615
616 DEFUN ("copy-keymap", Fcopy_keymap, Scopy_keymap, 1, 1, 0,
617 "Return a copy of the keymap KEYMAP.\n\
618 The copy starts out with the same definitions of KEYMAP,\n\
619 but changing either the copy or KEYMAP does not affect the other.\n\
620 Any key definitions that are subkeymaps are recursively copied.\n\
621 However, a key definition which is a symbol whose definition is a keymap\n\
622 is not copied.")
623 (keymap)
624 Lisp_Object keymap;
625 {
626 register Lisp_Object copy, tail;
627
628 copy = Fcopy_alist (get_keymap (keymap));
629
630 for (tail = copy; CONSP (tail); tail = XCONS (tail)->cdr)
631 {
632 Lisp_Object elt;
633
634 elt = XCONS (tail)->car;
635 if (VECTORP (elt))
636 {
637 int i;
638
639 elt = Fcopy_sequence (elt);
640 XCONS (tail)->car = elt;
641
642 for (i = 0; i < XVECTOR (elt)->size; i++)
643 if (!SYMBOLP (XVECTOR (elt)->contents[i])
644 && ! NILP (Fkeymapp (XVECTOR (elt)->contents[i])))
645 XVECTOR (elt)->contents[i] =
646 Fcopy_keymap (XVECTOR (elt)->contents[i]);
647 }
648 else if (CONSP (elt))
649 {
650 /* Skip the optional menu string. */
651 if (CONSP (XCONS (elt)->cdr)
652 && STRINGP (XCONS (XCONS (elt)->cdr)->car))
653 {
654 Lisp_Object tem;
655
656 /* Copy the cell, since copy-alist didn't go this deep. */
657 XCONS (elt)->cdr = Fcons (XCONS (XCONS (elt)->cdr)->car,
658 XCONS (XCONS (elt)->cdr)->cdr);
659 elt = XCONS (elt)->cdr;
660
661 /* Also skip the optional menu help string. */
662 if (CONSP (XCONS (elt)->cdr)
663 && STRINGP (XCONS (XCONS (elt)->cdr)->car))
664 {
665 XCONS (elt)->cdr = Fcons (XCONS (XCONS (elt)->cdr)->car,
666 XCONS (XCONS (elt)->cdr)->cdr);
667 elt = XCONS (elt)->cdr;
668 }
669 /* There may also be a list that caches key equivalences.
670 Just delete it for the new keymap. */
671 if (CONSP (XCONS (elt)->cdr)
672 && CONSP (XCONS (XCONS (elt)->cdr)->car)
673 && (NILP (tem = XCONS (XCONS (XCONS (elt)->cdr)->car)->car)
674 || VECTORP (tem)))
675 XCONS (elt)->cdr = XCONS (XCONS (elt)->cdr)->cdr;
676 }
677 if (CONSP (elt)
678 && ! SYMBOLP (XCONS (elt)->cdr)
679 && ! NILP (Fkeymapp (XCONS (elt)->cdr)))
680 XCONS (elt)->cdr = Fcopy_keymap (XCONS (elt)->cdr);
681 }
682 }
683
684 return copy;
685 }
686 \f
687 /* Simple Keymap mutators and accessors. */
688
689 /* GC is possible in this function if it autoloads a keymap. */
690
691 DEFUN ("define-key", Fdefine_key, Sdefine_key, 3, 3, 0,
692 "Args KEYMAP, KEY, DEF. Define key sequence KEY, in KEYMAP, as DEF.\n\
693 KEYMAP is a keymap. KEY is a string or a vector of symbols and characters\n\
694 meaning a sequence of keystrokes and events.\n\
695 Non-ASCII characters with codes above 127 (such as ISO Latin-1)\n\
696 can be included if you use a vector.\n\
697 DEF is anything that can be a key's definition:\n\
698 nil (means key is undefined in this keymap),\n\
699 a command (a Lisp function suitable for interactive calling)\n\
700 a string (treated as a keyboard macro),\n\
701 a keymap (to define a prefix key),\n\
702 a symbol. When the key is looked up, the symbol will stand for its\n\
703 function definition, which should at that time be one of the above,\n\
704 or another symbol whose function definition is used, etc.\n\
705 a cons (STRING . DEFN), meaning that DEFN is the definition\n\
706 (DEFN should be a valid definition in its own right),\n\
707 or a cons (KEYMAP . CHAR), meaning use definition of CHAR in map KEYMAP.\n\
708 \n\
709 If KEYMAP is a sparse keymap, the pair binding KEY to DEF is added at\n\
710 the front of KEYMAP.")
711 (keymap, key, def)
712 Lisp_Object keymap;
713 Lisp_Object key;
714 Lisp_Object def;
715 {
716 register int idx;
717 register Lisp_Object c;
718 register Lisp_Object tem;
719 register Lisp_Object cmd;
720 int metized = 0;
721 int meta_bit;
722 int length;
723 struct gcpro gcpro1, gcpro2, gcpro3;
724
725 keymap = get_keymap_1 (keymap, 1, 1);
726
727 if (!VECTORP (key) && !STRINGP (key))
728 key = wrong_type_argument (Qarrayp, key);
729
730 length = XFASTINT (Flength (key));
731 if (length == 0)
732 return Qnil;
733
734 if (SYMBOLP (def) && !EQ (Vdefine_key_rebound_commands, Qt))
735 Vdefine_key_rebound_commands = Fcons (def, Vdefine_key_rebound_commands);
736
737 GCPRO3 (keymap, key, def);
738
739 if (VECTORP (key))
740 meta_bit = meta_modifier;
741 else
742 meta_bit = 0x80;
743
744 idx = 0;
745 while (1)
746 {
747 c = Faref (key, make_number (idx));
748
749 if (CONSP (c) && lucid_event_type_list_p (c))
750 c = Fevent_convert_list (c);
751
752 if (INTEGERP (c)
753 && (XINT (c) & meta_bit)
754 && !metized)
755 {
756 c = meta_prefix_char;
757 metized = 1;
758 }
759 else
760 {
761 if (INTEGERP (c))
762 XSETINT (c, XINT (c) & ~meta_bit);
763
764 metized = 0;
765 idx++;
766 }
767
768 if (! INTEGERP (c) && ! SYMBOLP (c) && ! CONSP (c))
769 error ("Key sequence contains invalid events");
770
771 if (idx == length)
772 RETURN_UNGCPRO (store_in_keymap (keymap, c, def));
773
774 cmd = get_keyelt (access_keymap (keymap, c, 0, 1), 1);
775
776 /* If this key is undefined, make it a prefix. */
777 if (NILP (cmd))
778 cmd = define_as_prefix (keymap, c);
779
780 keymap = get_keymap_1 (cmd, 0, 1);
781 if (NILP (keymap))
782 /* We must use Fkey_description rather than just passing key to
783 error; key might be a vector, not a string. */
784 error ("Key sequence %s uses invalid prefix characters",
785 XSTRING (Fkey_description (key))->data);
786 }
787 }
788
789 /* Value is number if KEY is too long; NIL if valid but has no definition. */
790 /* GC is possible in this function if it autoloads a keymap. */
791
792 DEFUN ("lookup-key", Flookup_key, Slookup_key, 2, 3, 0,
793 "In keymap KEYMAP, look up key sequence KEY. Return the definition.\n\
794 nil means undefined. See doc of `define-key' for kinds of definitions.\n\
795 \n\
796 A number as value means KEY is \"too long\";\n\
797 that is, characters or symbols in it except for the last one\n\
798 fail to be a valid sequence of prefix characters in KEYMAP.\n\
799 The number is how many characters at the front of KEY\n\
800 it takes to reach a non-prefix command.\n\
801 \n\
802 Normally, `lookup-key' ignores bindings for t, which act as default\n\
803 bindings, used when nothing else in the keymap applies; this makes it\n\
804 usable as a general function for probing keymaps. However, if the\n\
805 third optional argument ACCEPT-DEFAULT is non-nil, `lookup-key' will\n\
806 recognize the default bindings, just as `read-key-sequence' does.")
807 (keymap, key, accept_default)
808 register Lisp_Object keymap;
809 Lisp_Object key;
810 Lisp_Object accept_default;
811 {
812 register int idx;
813 register Lisp_Object tem;
814 register Lisp_Object cmd;
815 register Lisp_Object c;
816 int metized = 0;
817 int length;
818 int t_ok = ! NILP (accept_default);
819 int meta_bit;
820 struct gcpro gcpro1;
821
822 keymap = get_keymap_1 (keymap, 1, 1);
823
824 if (!VECTORP (key) && !STRINGP (key))
825 key = wrong_type_argument (Qarrayp, key);
826
827 length = XFASTINT (Flength (key));
828 if (length == 0)
829 return keymap;
830
831 if (VECTORP (key))
832 meta_bit = meta_modifier;
833 else
834 meta_bit = 0x80;
835
836 GCPRO1 (key);
837
838 idx = 0;
839 while (1)
840 {
841 c = Faref (key, make_number (idx));
842
843 if (CONSP (c) && lucid_event_type_list_p (c))
844 c = Fevent_convert_list (c);
845
846 if (INTEGERP (c)
847 && (XINT (c) & meta_bit)
848 && !metized)
849 {
850 c = meta_prefix_char;
851 metized = 1;
852 }
853 else
854 {
855 if (INTEGERP (c))
856 XSETINT (c, XINT (c) & ~meta_bit);
857
858 metized = 0;
859 idx++;
860 }
861
862 cmd = get_keyelt (access_keymap (keymap, c, t_ok, 0), 1);
863 if (idx == length)
864 RETURN_UNGCPRO (cmd);
865
866 keymap = get_keymap_1 (cmd, 0, 1);
867 if (NILP (keymap))
868 RETURN_UNGCPRO (make_number (idx));
869
870 QUIT;
871 }
872 }
873
874 /* Make KEYMAP define event C as a keymap (i.e., as a prefix).
875 Assume that currently it does not define C at all.
876 Return the keymap. */
877
878 static Lisp_Object
879 define_as_prefix (keymap, c)
880 Lisp_Object keymap, c;
881 {
882 Lisp_Object inherit, cmd;
883
884 cmd = Fmake_sparse_keymap (Qnil);
885 /* If this key is defined as a prefix in an inherited keymap,
886 make it a prefix in this map, and make its definition
887 inherit the other prefix definition. */
888 inherit = access_keymap (keymap, c, 0, 0);
889 #if 0
890 /* This code is needed to do the right thing in the following case:
891 keymap A inherits from B,
892 you define KEY as a prefix in A,
893 then later you define KEY as a prefix in B.
894 We want the old prefix definition in A to inherit from that in B.
895 It is hard to do that retroactively, so this code
896 creates the prefix in B right away.
897
898 But it turns out that this code causes problems immediately
899 when the prefix in A is defined: it causes B to define KEY
900 as a prefix with no subcommands.
901
902 So I took out this code. */
903 if (NILP (inherit))
904 {
905 /* If there's an inherited keymap
906 and it doesn't define this key,
907 make it define this key. */
908 Lisp_Object tail;
909
910 for (tail = Fcdr (keymap); CONSP (tail); tail = XCONS (tail)->cdr)
911 if (EQ (XCONS (tail)->car, Qkeymap))
912 break;
913
914 if (!NILP (tail))
915 inherit = define_as_prefix (tail, c);
916 }
917 #endif
918
919 cmd = nconc2 (cmd, inherit);
920 store_in_keymap (keymap, c, cmd);
921
922 return cmd;
923 }
924
925 /* Append a key to the end of a key sequence. We always make a vector. */
926
927 Lisp_Object
928 append_key (key_sequence, key)
929 Lisp_Object key_sequence, key;
930 {
931 Lisp_Object args[2];
932
933 args[0] = key_sequence;
934
935 args[1] = Fcons (key, Qnil);
936 return Fvconcat (2, args);
937 }
938
939 \f
940 /* Global, local, and minor mode keymap stuff. */
941
942 /* We can't put these variables inside current_minor_maps, since under
943 some systems, static gets macro-defined to be the empty string.
944 Ickypoo. */
945 static Lisp_Object *cmm_modes, *cmm_maps;
946 static int cmm_size;
947
948 /* Error handler used in current_minor_maps. */
949 static Lisp_Object
950 current_minor_maps_error ()
951 {
952 return Qnil;
953 }
954
955 /* Store a pointer to an array of the keymaps of the currently active
956 minor modes in *buf, and return the number of maps it contains.
957
958 This function always returns a pointer to the same buffer, and may
959 free or reallocate it, so if you want to keep it for a long time or
960 hand it out to lisp code, copy it. This procedure will be called
961 for every key sequence read, so the nice lispy approach (return a
962 new assoclist, list, what have you) for each invocation would
963 result in a lot of consing over time.
964
965 If we used xrealloc/xmalloc and ran out of memory, they would throw
966 back to the command loop, which would try to read a key sequence,
967 which would call this function again, resulting in an infinite
968 loop. Instead, we'll use realloc/malloc and silently truncate the
969 list, let the key sequence be read, and hope some other piece of
970 code signals the error. */
971 int
972 current_minor_maps (modeptr, mapptr)
973 Lisp_Object **modeptr, **mapptr;
974 {
975 int i = 0;
976 Lisp_Object alist, assoc, var, val;
977
978 for (alist = Vminor_mode_map_alist;
979 CONSP (alist);
980 alist = XCONS (alist)->cdr)
981 if ((assoc = XCONS (alist)->car, CONSP (assoc))
982 && (var = XCONS (assoc)->car, SYMBOLP (var))
983 && (val = find_symbol_value (var), ! EQ (val, Qunbound))
984 && ! NILP (val))
985 {
986 Lisp_Object temp;
987
988 if (i >= cmm_size)
989 {
990 Lisp_Object *newmodes, *newmaps;
991
992 if (cmm_maps)
993 {
994 BLOCK_INPUT;
995 cmm_size *= 2;
996 newmodes
997 = (Lisp_Object *) realloc (cmm_modes,
998 cmm_size * sizeof (Lisp_Object));
999 newmaps
1000 = (Lisp_Object *) realloc (cmm_maps,
1001 cmm_size * sizeof (Lisp_Object));
1002 UNBLOCK_INPUT;
1003 }
1004 else
1005 {
1006 BLOCK_INPUT;
1007 cmm_size = 30;
1008 newmodes
1009 = (Lisp_Object *) malloc (cmm_size * sizeof (Lisp_Object));
1010 newmaps
1011 = (Lisp_Object *) malloc (cmm_size * sizeof (Lisp_Object));
1012 UNBLOCK_INPUT;
1013 }
1014
1015 if (newmaps && newmodes)
1016 {
1017 cmm_modes = newmodes;
1018 cmm_maps = newmaps;
1019 }
1020 else
1021 break;
1022 }
1023
1024 /* Get the keymap definition--or nil if it is not defined. */
1025 temp = internal_condition_case_1 (Findirect_function,
1026 XCONS (assoc)->cdr,
1027 Qerror, current_minor_maps_error);
1028 if (!NILP (temp))
1029 {
1030 cmm_modes[i] = var;
1031 cmm_maps [i] = temp;
1032 i++;
1033 }
1034 }
1035
1036 if (modeptr) *modeptr = cmm_modes;
1037 if (mapptr) *mapptr = cmm_maps;
1038 return i;
1039 }
1040
1041 /* GC is possible in this function if it autoloads a keymap. */
1042
1043 DEFUN ("key-binding", Fkey_binding, Skey_binding, 1, 2, 0,
1044 "Return the binding for command KEY in current keymaps.\n\
1045 KEY is a string or vector, a sequence of keystrokes.\n\
1046 The binding is probably a symbol with a function definition.\n\
1047 \n\
1048 Normally, `key-binding' ignores bindings for t, which act as default\n\
1049 bindings, used when nothing else in the keymap applies; this makes it\n\
1050 usable as a general function for probing keymaps. However, if the\n\
1051 optional second argument ACCEPT-DEFAULT is non-nil, `key-binding' does\n\
1052 recognize the default bindings, just as `read-key-sequence' does.")
1053 (key, accept_default)
1054 Lisp_Object key, accept_default;
1055 {
1056 Lisp_Object *maps, value;
1057 int nmaps, i;
1058 struct gcpro gcpro1;
1059
1060 GCPRO1 (key);
1061
1062 if (!NILP (current_kboard->Voverriding_terminal_local_map))
1063 {
1064 value = Flookup_key (current_kboard->Voverriding_terminal_local_map,
1065 key, accept_default);
1066 if (! NILP (value) && !INTEGERP (value))
1067 RETURN_UNGCPRO (value);
1068 }
1069 else if (!NILP (Voverriding_local_map))
1070 {
1071 value = Flookup_key (Voverriding_local_map, key, accept_default);
1072 if (! NILP (value) && !INTEGERP (value))
1073 RETURN_UNGCPRO (value);
1074 }
1075 else
1076 {
1077 Lisp_Object local;
1078
1079 nmaps = current_minor_maps (0, &maps);
1080 /* Note that all these maps are GCPRO'd
1081 in the places where we found them. */
1082
1083 for (i = 0; i < nmaps; i++)
1084 if (! NILP (maps[i]))
1085 {
1086 value = Flookup_key (maps[i], key, accept_default);
1087 if (! NILP (value) && !INTEGERP (value))
1088 RETURN_UNGCPRO (value);
1089 }
1090
1091 local = get_local_map (PT, current_buffer);
1092
1093 if (! NILP (local))
1094 {
1095 value = Flookup_key (local, key, accept_default);
1096 if (! NILP (value) && !INTEGERP (value))
1097 RETURN_UNGCPRO (value);
1098 }
1099 }
1100
1101 value = Flookup_key (current_global_map, key, accept_default);
1102 UNGCPRO;
1103 if (! NILP (value) && !INTEGERP (value))
1104 return value;
1105
1106 return Qnil;
1107 }
1108
1109 /* GC is possible in this function if it autoloads a keymap. */
1110
1111 DEFUN ("local-key-binding", Flocal_key_binding, Slocal_key_binding, 1, 2, 0,
1112 "Return the binding for command KEYS in current local keymap only.\n\
1113 KEYS is a string, a sequence of keystrokes.\n\
1114 The binding is probably a symbol with a function definition.\n\
1115 \n\
1116 If optional argument ACCEPT-DEFAULT is non-nil, recognize default\n\
1117 bindings; see the description of `lookup-key' for more details about this.")
1118 (keys, accept_default)
1119 Lisp_Object keys, accept_default;
1120 {
1121 register Lisp_Object map;
1122 map = current_buffer->keymap;
1123 if (NILP (map))
1124 return Qnil;
1125 return Flookup_key (map, keys, accept_default);
1126 }
1127
1128 /* GC is possible in this function if it autoloads a keymap. */
1129
1130 DEFUN ("global-key-binding", Fglobal_key_binding, Sglobal_key_binding, 1, 2, 0,
1131 "Return the binding for command KEYS in current global keymap only.\n\
1132 KEYS is a string, a sequence of keystrokes.\n\
1133 The binding is probably a symbol with a function definition.\n\
1134 This function's return values are the same as those of lookup-key\n\
1135 \(which see).\n\
1136 \n\
1137 If optional argument ACCEPT-DEFAULT is non-nil, recognize default\n\
1138 bindings; see the description of `lookup-key' for more details about this.")
1139 (keys, accept_default)
1140 Lisp_Object keys, accept_default;
1141 {
1142 return Flookup_key (current_global_map, keys, accept_default);
1143 }
1144
1145 /* GC is possible in this function if it autoloads a keymap. */
1146
1147 DEFUN ("minor-mode-key-binding", Fminor_mode_key_binding, Sminor_mode_key_binding, 1, 2, 0,
1148 "Find the visible minor mode bindings of KEY.\n\
1149 Return an alist of pairs (MODENAME . BINDING), where MODENAME is the\n\
1150 the symbol which names the minor mode binding KEY, and BINDING is\n\
1151 KEY's definition in that mode. In particular, if KEY has no\n\
1152 minor-mode bindings, return nil. If the first binding is a\n\
1153 non-prefix, all subsequent bindings will be omitted, since they would\n\
1154 be ignored. Similarly, the list doesn't include non-prefix bindings\n\
1155 that come after prefix bindings.\n\
1156 \n\
1157 If optional argument ACCEPT-DEFAULT is non-nil, recognize default\n\
1158 bindings; see the description of `lookup-key' for more details about this.")
1159 (key, accept_default)
1160 Lisp_Object key, accept_default;
1161 {
1162 Lisp_Object *modes, *maps;
1163 int nmaps;
1164 Lisp_Object binding;
1165 int i, j;
1166 struct gcpro gcpro1, gcpro2;
1167
1168 nmaps = current_minor_maps (&modes, &maps);
1169 /* Note that all these maps are GCPRO'd
1170 in the places where we found them. */
1171
1172 binding = Qnil;
1173 GCPRO2 (key, binding);
1174
1175 for (i = j = 0; i < nmaps; i++)
1176 if (! NILP (maps[i])
1177 && ! NILP (binding = Flookup_key (maps[i], key, accept_default))
1178 && !INTEGERP (binding))
1179 {
1180 if (! NILP (get_keymap (binding)))
1181 maps[j++] = Fcons (modes[i], binding);
1182 else if (j == 0)
1183 RETURN_UNGCPRO (Fcons (Fcons (modes[i], binding), Qnil));
1184 }
1185
1186 UNGCPRO;
1187 return Flist (j, maps);
1188 }
1189
1190 DEFUN ("define-prefix-command", Fdefine_prefix_command, Sdefine_prefix_command, 1, 2, 0,
1191 "Define COMMAND as a prefix command. COMMAND should be a symbol.\n\
1192 A new sparse keymap is stored as COMMAND's function definition and its value.\n\
1193 If a second optional argument MAPVAR is given, the map is stored as\n\
1194 its value instead of as COMMAND's value; but COMMAND is still defined\n\
1195 as a function.")
1196 (command, mapvar)
1197 Lisp_Object command, mapvar;
1198 {
1199 Lisp_Object map;
1200 map = Fmake_sparse_keymap (Qnil);
1201 Ffset (command, map);
1202 if (!NILP (mapvar))
1203 Fset (mapvar, map);
1204 else
1205 Fset (command, map);
1206 return command;
1207 }
1208
1209 DEFUN ("use-global-map", Fuse_global_map, Suse_global_map, 1, 1, 0,
1210 "Select KEYMAP as the global keymap.")
1211 (keymap)
1212 Lisp_Object keymap;
1213 {
1214 keymap = get_keymap (keymap);
1215 current_global_map = keymap;
1216
1217 return Qnil;
1218 }
1219
1220 DEFUN ("use-local-map", Fuse_local_map, Suse_local_map, 1, 1, 0,
1221 "Select KEYMAP as the local keymap.\n\
1222 If KEYMAP is nil, that means no local keymap.")
1223 (keymap)
1224 Lisp_Object keymap;
1225 {
1226 if (!NILP (keymap))
1227 keymap = get_keymap (keymap);
1228
1229 current_buffer->keymap = keymap;
1230
1231 return Qnil;
1232 }
1233
1234 DEFUN ("current-local-map", Fcurrent_local_map, Scurrent_local_map, 0, 0, 0,
1235 "Return current buffer's local keymap, or nil if it has none.")
1236 ()
1237 {
1238 return current_buffer->keymap;
1239 }
1240
1241 DEFUN ("current-global-map", Fcurrent_global_map, Scurrent_global_map, 0, 0, 0,
1242 "Return the current global keymap.")
1243 ()
1244 {
1245 return current_global_map;
1246 }
1247
1248 DEFUN ("current-minor-mode-maps", Fcurrent_minor_mode_maps, Scurrent_minor_mode_maps, 0, 0, 0,
1249 "Return a list of keymaps for the minor modes of the current buffer.")
1250 ()
1251 {
1252 Lisp_Object *maps;
1253 int nmaps = current_minor_maps (0, &maps);
1254
1255 return Flist (nmaps, maps);
1256 }
1257 \f
1258 /* Help functions for describing and documenting keymaps. */
1259
1260 /* This function cannot GC. */
1261
1262 DEFUN ("accessible-keymaps", Faccessible_keymaps, Saccessible_keymaps,
1263 1, 2, 0,
1264 "Find all keymaps accessible via prefix characters from KEYMAP.\n\
1265 Returns a list of elements of the form (KEYS . MAP), where the sequence\n\
1266 KEYS starting from KEYMAP gets you to MAP. These elements are ordered\n\
1267 so that the KEYS increase in length. The first element is ([] . KEYMAP).\n\
1268 An optional argument PREFIX, if non-nil, should be a key sequence;\n\
1269 then the value includes only maps for prefixes that start with PREFIX.")
1270 (keymap, prefix)
1271 Lisp_Object keymap, prefix;
1272 {
1273 Lisp_Object maps, good_maps, tail;
1274 int prefixlen = 0;
1275
1276 /* no need for gcpro because we don't autoload any keymaps. */
1277
1278 if (!NILP (prefix))
1279 prefixlen = XINT (Flength (prefix));
1280
1281 if (!NILP (prefix))
1282 {
1283 /* If a prefix was specified, start with the keymap (if any) for
1284 that prefix, so we don't waste time considering other prefixes. */
1285 Lisp_Object tem;
1286 tem = Flookup_key (keymap, prefix, Qt);
1287 /* Flookup_key may give us nil, or a number,
1288 if the prefix is not defined in this particular map.
1289 It might even give us a list that isn't a keymap. */
1290 tem = get_keymap_1 (tem, 0, 0);
1291 if (!NILP (tem))
1292 maps = Fcons (Fcons (prefix, tem), Qnil);
1293 else
1294 return Qnil;
1295 }
1296 else
1297 maps = Fcons (Fcons (Fmake_vector (make_number (0), Qnil),
1298 get_keymap (keymap)),
1299 Qnil);
1300
1301 /* For each map in the list maps,
1302 look at any other maps it points to,
1303 and stick them at the end if they are not already in the list.
1304
1305 This is a breadth-first traversal, where tail is the queue of
1306 nodes, and maps accumulates a list of all nodes visited. */
1307
1308 for (tail = maps; CONSP (tail); tail = XCONS (tail)->cdr)
1309 {
1310 register Lisp_Object thisseq, thismap;
1311 Lisp_Object last;
1312 /* Does the current sequence end in the meta-prefix-char? */
1313 int is_metized;
1314
1315 thisseq = Fcar (Fcar (tail));
1316 thismap = Fcdr (Fcar (tail));
1317 last = make_number (XINT (Flength (thisseq)) - 1);
1318 is_metized = (XINT (last) >= 0
1319 && EQ (Faref (thisseq, last), meta_prefix_char));
1320
1321 for (; CONSP (thismap); thismap = XCONS (thismap)->cdr)
1322 {
1323 Lisp_Object elt;
1324
1325 elt = XCONS (thismap)->car;
1326
1327 QUIT;
1328
1329 if (VECTORP (elt))
1330 {
1331 register int i;
1332
1333 /* Vector keymap. Scan all the elements. */
1334 for (i = 0; i < XVECTOR (elt)->size; i++)
1335 {
1336 register Lisp_Object tem;
1337 register Lisp_Object cmd;
1338
1339 cmd = get_keyelt (XVECTOR (elt)->contents[i], 0);
1340 if (NILP (cmd)) continue;
1341 tem = Fkeymapp (cmd);
1342 if (!NILP (tem))
1343 {
1344 cmd = get_keymap (cmd);
1345 /* Ignore keymaps that are already added to maps. */
1346 tem = Frassq (cmd, maps);
1347 if (NILP (tem))
1348 {
1349 /* If the last key in thisseq is meta-prefix-char,
1350 turn it into a meta-ized keystroke. We know
1351 that the event we're about to append is an
1352 ascii keystroke since we're processing a
1353 keymap table. */
1354 if (is_metized)
1355 {
1356 int meta_bit = meta_modifier;
1357 tem = Fcopy_sequence (thisseq);
1358
1359 Faset (tem, last, make_number (i | meta_bit));
1360
1361 /* This new sequence is the same length as
1362 thisseq, so stick it in the list right
1363 after this one. */
1364 XCONS (tail)->cdr
1365 = Fcons (Fcons (tem, cmd), XCONS (tail)->cdr);
1366 }
1367 else
1368 {
1369 tem = append_key (thisseq, make_number (i));
1370 nconc2 (tail, Fcons (Fcons (tem, cmd), Qnil));
1371 }
1372 }
1373 }
1374 }
1375 }
1376 else if (CONSP (elt))
1377 {
1378 register Lisp_Object cmd, tem, filter;
1379
1380 cmd = get_keyelt (XCONS (elt)->cdr, 0);
1381 /* Ignore definitions that aren't keymaps themselves. */
1382 tem = Fkeymapp (cmd);
1383 if (!NILP (tem))
1384 {
1385 /* Ignore keymaps that have been seen already. */
1386 cmd = get_keymap (cmd);
1387 tem = Frassq (cmd, maps);
1388 if (NILP (tem))
1389 {
1390 /* Let elt be the event defined by this map entry. */
1391 elt = XCONS (elt)->car;
1392
1393 /* If the last key in thisseq is meta-prefix-char, and
1394 this entry is a binding for an ascii keystroke,
1395 turn it into a meta-ized keystroke. */
1396 if (is_metized && INTEGERP (elt))
1397 {
1398 tem = Fcopy_sequence (thisseq);
1399 Faset (tem, last,
1400 make_number (XINT (elt) | meta_modifier));
1401
1402 /* This new sequence is the same length as
1403 thisseq, so stick it in the list right
1404 after this one. */
1405 XCONS (tail)->cdr
1406 = Fcons (Fcons (tem, cmd), XCONS (tail)->cdr);
1407 }
1408 else
1409 nconc2 (tail,
1410 Fcons (Fcons (append_key (thisseq, elt), cmd),
1411 Qnil));
1412 }
1413 }
1414 }
1415 }
1416 }
1417
1418 if (NILP (prefix))
1419 return maps;
1420
1421 /* Now find just the maps whose access prefixes start with PREFIX. */
1422
1423 good_maps = Qnil;
1424 for (; CONSP (maps); maps = XCONS (maps)->cdr)
1425 {
1426 Lisp_Object elt, thisseq;
1427 elt = XCONS (maps)->car;
1428 thisseq = XCONS (elt)->car;
1429 /* The access prefix must be at least as long as PREFIX,
1430 and the first elements must match those of PREFIX. */
1431 if (XINT (Flength (thisseq)) >= prefixlen)
1432 {
1433 int i;
1434 for (i = 0; i < prefixlen; i++)
1435 {
1436 Lisp_Object i1;
1437 XSETFASTINT (i1, i);
1438 if (!EQ (Faref (thisseq, i1), Faref (prefix, i1)))
1439 break;
1440 }
1441 if (i == prefixlen)
1442 good_maps = Fcons (elt, good_maps);
1443 }
1444 }
1445
1446 return Fnreverse (good_maps);
1447 }
1448
1449 Lisp_Object Qsingle_key_description, Qkey_description;
1450
1451 /* This function cannot GC. */
1452
1453 DEFUN ("key-description", Fkey_description, Skey_description, 1, 1, 0,
1454 "Return a pretty description of key-sequence KEYS.\n\
1455 Control characters turn into \"C-foo\" sequences, meta into \"M-foo\"\n\
1456 spaces are put between sequence elements, etc.")
1457 (keys)
1458 Lisp_Object keys;
1459 {
1460 int len;
1461 int i;
1462 Lisp_Object sep;
1463 Lisp_Object *args;
1464
1465 if (STRINGP (keys))
1466 {
1467 Lisp_Object vector;
1468 vector = Fmake_vector (Flength (keys), Qnil);
1469 for (i = 0; i < XSTRING (keys)->size; i++)
1470 {
1471 if (XSTRING (keys)->data[i] & 0x80)
1472 XSETFASTINT (XVECTOR (vector)->contents[i],
1473 meta_modifier | (XSTRING (keys)->data[i] & ~0x80));
1474 else
1475 XSETFASTINT (XVECTOR (vector)->contents[i],
1476 XSTRING (keys)->data[i]);
1477 }
1478 keys = vector;
1479 }
1480 else if (!VECTORP (keys))
1481 keys = wrong_type_argument (Qarrayp, keys);
1482
1483 /* In effect, this computes
1484 (mapconcat 'single-key-description keys " ")
1485 but we shouldn't use mapconcat because it can do GC. */
1486
1487 len = XVECTOR (keys)->size;
1488 sep = build_string (" ");
1489 /* This has one extra element at the end that we don't pass to Fconcat. */
1490 args = (Lisp_Object *) alloca (len * 2 * sizeof (Lisp_Object));
1491
1492 for (i = 0; i < len; i++)
1493 {
1494 args[i * 2] = Fsingle_key_description (XVECTOR (keys)->contents[i]);
1495 args[i * 2 + 1] = sep;
1496 }
1497
1498 return Fconcat (len * 2 - 1, args);
1499 }
1500
1501 char *
1502 push_key_description (c, p)
1503 register unsigned int c;
1504 register char *p;
1505 {
1506 /* Clear all the meaningless bits above the meta bit. */
1507 c &= meta_modifier | ~ - meta_modifier;
1508
1509 if (c & alt_modifier)
1510 {
1511 *p++ = 'A';
1512 *p++ = '-';
1513 c -= alt_modifier;
1514 }
1515 if (c & ctrl_modifier)
1516 {
1517 *p++ = 'C';
1518 *p++ = '-';
1519 c -= ctrl_modifier;
1520 }
1521 if (c & hyper_modifier)
1522 {
1523 *p++ = 'H';
1524 *p++ = '-';
1525 c -= hyper_modifier;
1526 }
1527 if (c & meta_modifier)
1528 {
1529 *p++ = 'M';
1530 *p++ = '-';
1531 c -= meta_modifier;
1532 }
1533 if (c & shift_modifier)
1534 {
1535 *p++ = 'S';
1536 *p++ = '-';
1537 c -= shift_modifier;
1538 }
1539 if (c & super_modifier)
1540 {
1541 *p++ = 's';
1542 *p++ = '-';
1543 c -= super_modifier;
1544 }
1545 if (c < 040)
1546 {
1547 if (c == 033)
1548 {
1549 *p++ = 'E';
1550 *p++ = 'S';
1551 *p++ = 'C';
1552 }
1553 else if (c == '\t')
1554 {
1555 *p++ = 'T';
1556 *p++ = 'A';
1557 *p++ = 'B';
1558 }
1559 else if (c == Ctl('J'))
1560 {
1561 *p++ = 'L';
1562 *p++ = 'F';
1563 *p++ = 'D';
1564 }
1565 else if (c == Ctl('M'))
1566 {
1567 *p++ = 'R';
1568 *p++ = 'E';
1569 *p++ = 'T';
1570 }
1571 else
1572 {
1573 *p++ = 'C';
1574 *p++ = '-';
1575 if (c > 0 && c <= Ctl ('Z'))
1576 *p++ = c + 0140;
1577 else
1578 *p++ = c + 0100;
1579 }
1580 }
1581 else if (c == 0177)
1582 {
1583 *p++ = 'D';
1584 *p++ = 'E';
1585 *p++ = 'L';
1586 }
1587 else if (c == ' ')
1588 {
1589 *p++ = 'S';
1590 *p++ = 'P';
1591 *p++ = 'C';
1592 }
1593 else if (c < 256)
1594 *p++ = c;
1595 else
1596 {
1597 *p++ = '\\';
1598 *p++ = (7 & (c >> 15)) + '0';
1599 *p++ = (7 & (c >> 12)) + '0';
1600 *p++ = (7 & (c >> 9)) + '0';
1601 *p++ = (7 & (c >> 6)) + '0';
1602 *p++ = (7 & (c >> 3)) + '0';
1603 *p++ = (7 & (c >> 0)) + '0';
1604 }
1605
1606 return p;
1607 }
1608
1609 /* This function cannot GC. */
1610
1611 DEFUN ("single-key-description", Fsingle_key_description, Ssingle_key_description, 1, 1, 0,
1612 "Return a pretty description of command character KEY.\n\
1613 Control characters turn into C-whatever, etc.")
1614 (key)
1615 Lisp_Object key;
1616 {
1617 char tem[20];
1618
1619 key = EVENT_HEAD (key);
1620
1621 if (INTEGERP (key)) /* Normal character */
1622 {
1623 *push_key_description (XUINT (key), tem) = 0;
1624 return build_string (tem);
1625 }
1626 else if (SYMBOLP (key)) /* Function key or event-symbol */
1627 return Fsymbol_name (key);
1628 else if (STRINGP (key)) /* Buffer names in the menubar. */
1629 return Fcopy_sequence (key);
1630 else
1631 error ("KEY must be an integer, cons, symbol, or string");
1632 }
1633
1634 char *
1635 push_text_char_description (c, p)
1636 register unsigned int c;
1637 register char *p;
1638 {
1639 if (c >= 0200)
1640 {
1641 *p++ = 'M';
1642 *p++ = '-';
1643 c -= 0200;
1644 }
1645 if (c < 040)
1646 {
1647 *p++ = '^';
1648 *p++ = c + 64; /* 'A' - 1 */
1649 }
1650 else if (c == 0177)
1651 {
1652 *p++ = '^';
1653 *p++ = '?';
1654 }
1655 else
1656 *p++ = c;
1657 return p;
1658 }
1659
1660 /* This function cannot GC. */
1661
1662 DEFUN ("text-char-description", Ftext_char_description, Stext_char_description, 1, 1, 0,
1663 "Return a pretty description of file-character CHARACTER.\n\
1664 Control characters turn into \"^char\", etc.")
1665 (character)
1666 Lisp_Object character;
1667 {
1668 char tem[6];
1669
1670 CHECK_NUMBER (character, 0);
1671
1672 *push_text_char_description (XINT (character) & 0377, tem) = 0;
1673
1674 return build_string (tem);
1675 }
1676
1677 /* Return non-zero if SEQ contains only ASCII characters, perhaps with
1678 a meta bit. */
1679 static int
1680 ascii_sequence_p (seq)
1681 Lisp_Object seq;
1682 {
1683 int i;
1684 int len = XINT (Flength (seq));
1685
1686 for (i = 0; i < len; i++)
1687 {
1688 Lisp_Object ii, elt;
1689
1690 XSETFASTINT (ii, i);
1691 elt = Faref (seq, ii);
1692
1693 if (!INTEGERP (elt)
1694 || (XUINT (elt) & ~CHAR_META) >= 0x80)
1695 return 0;
1696 }
1697
1698 return 1;
1699 }
1700
1701 \f
1702 /* where-is - finding a command in a set of keymaps. */
1703
1704 /* This function can GC if Flookup_key autoloads any keymaps. */
1705
1706 DEFUN ("where-is-internal", Fwhere_is_internal, Swhere_is_internal, 1, 4, 0,
1707 "Return list of keys that invoke DEFINITION.\n\
1708 If KEYMAP is non-nil, search only KEYMAP and the global keymap.\n\
1709 If KEYMAP is nil, search all the currently active keymaps.\n\
1710 \n\
1711 If optional 3rd arg FIRSTONLY is non-nil, return the first key sequence found,\n\
1712 rather than a list of all possible key sequences.\n\
1713 If FIRSTONLY is the symbol `non-ascii', return the first binding found,\n\
1714 no matter what it is.\n\
1715 If FIRSTONLY has another non-nil value, prefer sequences of ASCII characters,\n\
1716 and entirely reject menu bindings.\n\
1717 \n\
1718 If optional 4th arg NOINDIRECT is non-nil, don't follow indirections\n\
1719 to other keymaps or slots. This makes it possible to search for an\n\
1720 indirect definition itself.")
1721 (definition, keymap, firstonly, noindirect)
1722 Lisp_Object definition, keymap;
1723 Lisp_Object firstonly, noindirect;
1724 {
1725 Lisp_Object maps;
1726 Lisp_Object found, sequence;
1727 int keymap_specified = !NILP (keymap);
1728 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
1729 /* 1 means ignore all menu bindings entirely. */
1730 int nomenus = !NILP (firstonly) && !EQ (firstonly, Qnon_ascii);
1731
1732 if (! keymap_specified)
1733 {
1734 #ifdef USE_TEXT_PROPERTIES
1735 keymap = get_local_map (PT, current_buffer);
1736 #else
1737 keymap = current_buffer->keymap;
1738 #endif
1739 }
1740
1741 if (!NILP (keymap))
1742 maps = nconc2 (Faccessible_keymaps (get_keymap (keymap), Qnil),
1743 Faccessible_keymaps (get_keymap (current_global_map),
1744 Qnil));
1745 else
1746 maps = Faccessible_keymaps (get_keymap (current_global_map), Qnil);
1747
1748 /* Put the minor mode keymaps on the front. */
1749 if (! keymap_specified)
1750 {
1751 Lisp_Object minors;
1752 minors = Fnreverse (Fcurrent_minor_mode_maps ());
1753 while (!NILP (minors))
1754 {
1755 maps = nconc2 (Faccessible_keymaps (get_keymap (XCONS (minors)->car),
1756 Qnil),
1757 maps);
1758 minors = XCONS (minors)->cdr;
1759 }
1760 }
1761
1762 GCPRO5 (definition, keymap, maps, found, sequence);
1763 found = Qnil;
1764 sequence = Qnil;
1765
1766 for (; !NILP (maps); maps = Fcdr (maps))
1767 {
1768 /* Key sequence to reach map, and the map that it reaches */
1769 register Lisp_Object this, map;
1770
1771 /* If Fcar (map) is a VECTOR, the current element within that vector. */
1772 int i = 0;
1773
1774 /* In order to fold [META-PREFIX-CHAR CHAR] sequences into
1775 [M-CHAR] sequences, check if last character of the sequence
1776 is the meta-prefix char. */
1777 Lisp_Object last;
1778 int last_is_meta;
1779
1780 this = Fcar (Fcar (maps));
1781 map = Fcdr (Fcar (maps));
1782 last = make_number (XINT (Flength (this)) - 1);
1783 last_is_meta = (XINT (last) >= 0
1784 && EQ (Faref (this, last), meta_prefix_char));
1785
1786 QUIT;
1787
1788 while (CONSP (map))
1789 {
1790 /* Because the code we want to run on each binding is rather
1791 large, we don't want to have two separate loop bodies for
1792 sparse keymap bindings and tables; we want to iterate one
1793 loop body over both keymap and vector bindings.
1794
1795 For this reason, if Fcar (map) is a vector, we don't
1796 advance map to the next element until i indicates that we
1797 have finished off the vector. */
1798
1799 Lisp_Object elt, key, binding;
1800 elt = XCONS (map)->car;
1801
1802 QUIT;
1803
1804 /* Set key and binding to the current key and binding, and
1805 advance map and i to the next binding. */
1806 if (VECTORP (elt))
1807 {
1808 /* In a vector, look at each element. */
1809 binding = XVECTOR (elt)->contents[i];
1810 XSETFASTINT (key, i);
1811 i++;
1812
1813 /* If we've just finished scanning a vector, advance map
1814 to the next element, and reset i in anticipation of the
1815 next vector we may find. */
1816 if (i >= XVECTOR (elt)->size)
1817 {
1818 map = XCONS (map)->cdr;
1819 i = 0;
1820 }
1821 }
1822 else if (CONSP (elt))
1823 {
1824 key = Fcar (Fcar (map));
1825 binding = Fcdr (Fcar (map));
1826
1827 map = XCONS (map)->cdr;
1828 }
1829 else
1830 /* We want to ignore keymap elements that are neither
1831 vectors nor conses. */
1832 {
1833 map = XCONS (map)->cdr;
1834 continue;
1835 }
1836
1837 /* Search through indirections unless that's not wanted. */
1838 if (NILP (noindirect))
1839 {
1840 if (nomenus)
1841 {
1842 while (1)
1843 {
1844 Lisp_Object map, tem;
1845 /* If the contents are (KEYMAP . ELEMENT), go indirect. */
1846 map = get_keymap_1 (Fcar_safe (definition), 0, 0);
1847 tem = Fkeymapp (map);
1848 if (!NILP (tem))
1849 definition = access_keymap (map, Fcdr (definition), 0, 0);
1850 else
1851 break;
1852 }
1853 /* If the contents are (STRING ...), reject. */
1854 if (CONSP (definition)
1855 && STRINGP (XCONS (definition)->car))
1856 continue;
1857 }
1858 else
1859 binding = get_keyelt (binding, 0);
1860 }
1861
1862 /* End this iteration if this element does not match
1863 the target. */
1864
1865 if (CONSP (definition))
1866 {
1867 Lisp_Object tem;
1868 tem = Fequal (binding, definition);
1869 if (NILP (tem))
1870 continue;
1871 }
1872 else
1873 if (!EQ (binding, definition))
1874 continue;
1875
1876 /* We have found a match.
1877 Construct the key sequence where we found it. */
1878 if (INTEGERP (key) && last_is_meta)
1879 {
1880 sequence = Fcopy_sequence (this);
1881 Faset (sequence, last, make_number (XINT (key) | meta_modifier));
1882 }
1883 else
1884 sequence = append_key (this, key);
1885
1886 /* Verify that this key binding is not shadowed by another
1887 binding for the same key, before we say it exists.
1888
1889 Mechanism: look for local definition of this key and if
1890 it is defined and does not match what we found then
1891 ignore this key.
1892
1893 Either nil or number as value from Flookup_key
1894 means undefined. */
1895 if (keymap_specified)
1896 {
1897 binding = Flookup_key (keymap, sequence, Qnil);
1898 if (!NILP (binding) && !INTEGERP (binding))
1899 {
1900 if (CONSP (definition))
1901 {
1902 Lisp_Object tem;
1903 tem = Fequal (binding, definition);
1904 if (NILP (tem))
1905 continue;
1906 }
1907 else
1908 if (!EQ (binding, definition))
1909 continue;
1910 }
1911 }
1912 else
1913 {
1914 binding = Fkey_binding (sequence, Qnil);
1915 if (!EQ (binding, definition))
1916 continue;
1917 }
1918
1919 /* It is a true unshadowed match. Record it, unless it's already
1920 been seen (as could happen when inheriting keymaps). */
1921 if (NILP (Fmember (sequence, found)))
1922 found = Fcons (sequence, found);
1923
1924 /* If firstonly is Qnon_ascii, then we can return the first
1925 binding we find. If firstonly is not Qnon_ascii but not
1926 nil, then we should return the first ascii-only binding
1927 we find. */
1928 if (EQ (firstonly, Qnon_ascii))
1929 RETURN_UNGCPRO (sequence);
1930 else if (! NILP (firstonly) && ascii_sequence_p (sequence))
1931 RETURN_UNGCPRO (sequence);
1932 }
1933 }
1934
1935 UNGCPRO;
1936
1937 found = Fnreverse (found);
1938
1939 /* firstonly may have been t, but we may have gone all the way through
1940 the keymaps without finding an all-ASCII key sequence. So just
1941 return the best we could find. */
1942 if (! NILP (firstonly))
1943 return Fcar (found);
1944
1945 return found;
1946 }
1947 \f
1948 /* describe-bindings - summarizing all the bindings in a set of keymaps. */
1949
1950 DEFUN ("describe-bindings", Fdescribe_bindings, Sdescribe_bindings, 0, 1, "",
1951 "Show a list of all defined keys, and their definitions.\n\
1952 The list is put in a buffer, which is displayed.\n\
1953 An optional argument PREFIX, if non-nil, should be a key sequence;\n\
1954 then we display only bindings that start with that prefix.")
1955 (prefix)
1956 Lisp_Object prefix;
1957 {
1958 register Lisp_Object thisbuf;
1959 XSETBUFFER (thisbuf, current_buffer);
1960 internal_with_output_to_temp_buffer ("*Help*",
1961 describe_buffer_bindings,
1962 Fcons (thisbuf, prefix));
1963 return Qnil;
1964 }
1965
1966 /* ARG is (BUFFER . PREFIX). */
1967
1968 static Lisp_Object
1969 describe_buffer_bindings (arg)
1970 Lisp_Object arg;
1971 {
1972 Lisp_Object descbuf, prefix, shadow;
1973 register Lisp_Object start1;
1974 struct gcpro gcpro1;
1975
1976 char *alternate_heading
1977 = "\
1978 Alternate Characters (use anywhere the nominal character is listed):\n\
1979 nominal alternate\n\
1980 ------- ---------\n";
1981
1982 descbuf = XCONS (arg)->car;
1983 prefix = XCONS (arg)->cdr;
1984 shadow = Qnil;
1985 GCPRO1 (shadow);
1986
1987 Fset_buffer (Vstandard_output);
1988
1989 /* Report on alternates for keys. */
1990 if (STRINGP (Vkeyboard_translate_table) && !NILP (prefix))
1991 {
1992 int c;
1993 unsigned char *translate = XSTRING (Vkeyboard_translate_table)->data;
1994 int translate_len = XSTRING (Vkeyboard_translate_table)->size;
1995
1996 for (c = 0; c < translate_len; c++)
1997 if (translate[c] != c)
1998 {
1999 char buf[20];
2000 char *bufend;
2001
2002 if (alternate_heading)
2003 {
2004 insert_string (alternate_heading);
2005 alternate_heading = 0;
2006 }
2007
2008 bufend = push_key_description (translate[c], buf);
2009 insert (buf, bufend - buf);
2010 Findent_to (make_number (16), make_number (1));
2011 bufend = push_key_description (c, buf);
2012 insert (buf, bufend - buf);
2013
2014 insert ("\n", 1);
2015 }
2016
2017 insert ("\n", 1);
2018 }
2019
2020 if (!NILP (Vkey_translation_map))
2021 describe_map_tree (Vkey_translation_map, 0, Qnil, prefix,
2022 "Key translations", 0, 1, 0);
2023
2024 {
2025 int i, nmaps;
2026 Lisp_Object *modes, *maps;
2027
2028 /* Temporarily switch to descbuf, so that we can get that buffer's
2029 minor modes correctly. */
2030 Fset_buffer (descbuf);
2031
2032 if (!NILP (current_kboard->Voverriding_terminal_local_map)
2033 || !NILP (Voverriding_local_map))
2034 nmaps = 0;
2035 else
2036 nmaps = current_minor_maps (&modes, &maps);
2037 Fset_buffer (Vstandard_output);
2038
2039 /* Print the minor mode maps. */
2040 for (i = 0; i < nmaps; i++)
2041 {
2042 /* The title for a minor mode keymap
2043 is constructed at run time.
2044 We let describe_map_tree do the actual insertion
2045 because it takes care of other features when doing so. */
2046 char *title, *p;
2047
2048 if (!SYMBOLP (modes[i]))
2049 abort();
2050
2051 p = title = (char *) alloca (40 + XSYMBOL (modes[i])->name->size);
2052 *p++ = '`';
2053 bcopy (XSYMBOL (modes[i])->name->data, p,
2054 XSYMBOL (modes[i])->name->size);
2055 p += XSYMBOL (modes[i])->name->size;
2056 *p++ = '\'';
2057 bcopy (" Minor Mode Bindings", p, sizeof (" Minor Mode Bindings") - 1);
2058 p += sizeof (" Minor Mode Bindings") - 1;
2059 *p = 0;
2060
2061 describe_map_tree (maps[i], 0, shadow, prefix, title, 0, 0, 0);
2062 shadow = Fcons (maps[i], shadow);
2063 }
2064 }
2065
2066 /* Print the (major mode) local map. */
2067 if (!NILP (current_kboard->Voverriding_terminal_local_map))
2068 start1 = current_kboard->Voverriding_terminal_local_map;
2069 else if (!NILP (Voverriding_local_map))
2070 start1 = Voverriding_local_map;
2071 else
2072 start1 = XBUFFER (descbuf)->keymap;
2073
2074 if (!NILP (start1))
2075 {
2076 describe_map_tree (start1, 0, shadow, prefix,
2077 "Major Mode Bindings", 0, 0, 0);
2078 shadow = Fcons (start1, shadow);
2079 }
2080
2081 describe_map_tree (current_global_map, 0, shadow, prefix,
2082 "Global Bindings", 0, 0, 1);
2083
2084 /* Print the function-key-map translations under this prefix. */
2085 if (!NILP (Vfunction_key_map))
2086 describe_map_tree (Vfunction_key_map, 0, Qnil, prefix,
2087 "Function key map translations", 0, 1, 0);
2088
2089 call0 (intern ("help-mode"));
2090 Fset_buffer (descbuf);
2091 UNGCPRO;
2092 return Qnil;
2093 }
2094
2095 /* Insert a description of the key bindings in STARTMAP,
2096 followed by those of all maps reachable through STARTMAP.
2097 If PARTIAL is nonzero, omit certain "uninteresting" commands
2098 (such as `undefined').
2099 If SHADOW is non-nil, it is a list of maps;
2100 don't mention keys which would be shadowed by any of them.
2101 PREFIX, if non-nil, says mention only keys that start with PREFIX.
2102 TITLE, if not 0, is a string to insert at the beginning.
2103 TITLE should not end with a colon or a newline; we supply that.
2104 If NOMENU is not 0, then omit menu-bar commands.
2105
2106 If TRANSL is nonzero, the definitions are actually key translations
2107 so print strings and vectors differently.
2108
2109 If ALWAYS_TITLE is nonzero, print the title even if there are no maps
2110 to look through. */
2111
2112 void
2113 describe_map_tree (startmap, partial, shadow, prefix, title, nomenu, transl,
2114 always_title)
2115 Lisp_Object startmap, shadow, prefix;
2116 int partial;
2117 char *title;
2118 int nomenu;
2119 int transl;
2120 int always_title;
2121 {
2122 Lisp_Object maps, seen, sub_shadows;
2123 struct gcpro gcpro1, gcpro2, gcpro3;
2124 int something = 0;
2125 char *key_heading
2126 = "\
2127 key binding\n\
2128 --- -------\n";
2129
2130 maps = Faccessible_keymaps (startmap, prefix);
2131 seen = Qnil;
2132 sub_shadows = Qnil;
2133 GCPRO3 (maps, seen, sub_shadows);
2134
2135 if (nomenu)
2136 {
2137 Lisp_Object list;
2138
2139 /* Delete from MAPS each element that is for the menu bar. */
2140 for (list = maps; !NILP (list); list = XCONS (list)->cdr)
2141 {
2142 Lisp_Object elt, prefix, tem;
2143
2144 elt = Fcar (list);
2145 prefix = Fcar (elt);
2146 if (XVECTOR (prefix)->size >= 1)
2147 {
2148 tem = Faref (prefix, make_number (0));
2149 if (EQ (tem, Qmenu_bar))
2150 maps = Fdelq (elt, maps);
2151 }
2152 }
2153 }
2154
2155 if (!NILP (maps) || always_title)
2156 {
2157 if (title)
2158 {
2159 insert_string (title);
2160 if (!NILP (prefix))
2161 {
2162 insert_string (" Starting With ");
2163 insert1 (Fkey_description (prefix));
2164 }
2165 insert_string (":\n");
2166 }
2167 insert_string (key_heading);
2168 something = 1;
2169 }
2170
2171 for (; !NILP (maps); maps = Fcdr (maps))
2172 {
2173 register Lisp_Object elt, prefix, tail;
2174
2175 elt = Fcar (maps);
2176 prefix = Fcar (elt);
2177
2178 sub_shadows = Qnil;
2179
2180 for (tail = shadow; CONSP (tail); tail = XCONS (tail)->cdr)
2181 {
2182 Lisp_Object shmap;
2183
2184 shmap = XCONS (tail)->car;
2185
2186 /* If the sequence by which we reach this keymap is zero-length,
2187 then the shadow map for this keymap is just SHADOW. */
2188 if ((STRINGP (prefix) && XSTRING (prefix)->size == 0)
2189 || (VECTORP (prefix) && XVECTOR (prefix)->size == 0))
2190 ;
2191 /* If the sequence by which we reach this keymap actually has
2192 some elements, then the sequence's definition in SHADOW is
2193 what we should use. */
2194 else
2195 {
2196 shmap = Flookup_key (shmap, Fcar (elt), Qt);
2197 if (INTEGERP (shmap))
2198 shmap = Qnil;
2199 }
2200
2201 /* If shmap is not nil and not a keymap,
2202 it completely shadows this map, so don't
2203 describe this map at all. */
2204 if (!NILP (shmap) && NILP (Fkeymapp (shmap)))
2205 goto skip;
2206
2207 if (!NILP (shmap))
2208 sub_shadows = Fcons (shmap, sub_shadows);
2209 }
2210
2211 describe_map (Fcdr (elt), Fcar (elt),
2212 transl ? describe_translation : describe_command,
2213 partial, sub_shadows, &seen, nomenu);
2214
2215 skip: ;
2216 }
2217
2218 if (something)
2219 insert_string ("\n");
2220
2221 UNGCPRO;
2222 }
2223
2224 static int previous_description_column;
2225
2226 static void
2227 describe_command (definition)
2228 Lisp_Object definition;
2229 {
2230 register Lisp_Object tem1;
2231 int column = current_column ();
2232 int description_column;
2233
2234 /* If column 16 is no good, go to col 32;
2235 but don't push beyond that--go to next line instead. */
2236 if (column > 30)
2237 {
2238 insert_char ('\n');
2239 description_column = 32;
2240 }
2241 else if (column > 14 || (column > 10 && previous_description_column == 32))
2242 description_column = 32;
2243 else
2244 description_column = 16;
2245
2246 Findent_to (make_number (description_column), make_number (1));
2247 previous_description_column = description_column;
2248
2249 if (SYMBOLP (definition))
2250 {
2251 XSETSTRING (tem1, XSYMBOL (definition)->name);
2252 insert1 (tem1);
2253 insert_string ("\n");
2254 }
2255 else if (STRINGP (definition) || VECTORP (definition))
2256 insert_string ("Keyboard Macro\n");
2257 else
2258 {
2259 tem1 = Fkeymapp (definition);
2260 if (!NILP (tem1))
2261 insert_string ("Prefix Command\n");
2262 else
2263 insert_string ("??\n");
2264 }
2265 }
2266
2267 static void
2268 describe_translation (definition)
2269 Lisp_Object definition;
2270 {
2271 register Lisp_Object tem1;
2272
2273 Findent_to (make_number (16), make_number (1));
2274
2275 if (SYMBOLP (definition))
2276 {
2277 XSETSTRING (tem1, XSYMBOL (definition)->name);
2278 insert1 (tem1);
2279 insert_string ("\n");
2280 }
2281 else if (STRINGP (definition) || VECTORP (definition))
2282 {
2283 insert1 (Fkey_description (definition));
2284 insert_string ("\n");
2285 }
2286 else
2287 {
2288 tem1 = Fkeymapp (definition);
2289 if (!NILP (tem1))
2290 insert_string ("Prefix Command\n");
2291 else
2292 insert_string ("??\n");
2293 }
2294 }
2295
2296 /* Like Flookup_key, but uses a list of keymaps SHADOW instead of a single map.
2297 Returns the first non-nil binding found in any of those maps. */
2298
2299 static Lisp_Object
2300 shadow_lookup (shadow, key, flag)
2301 Lisp_Object shadow, key, flag;
2302 {
2303 Lisp_Object tail, value;
2304
2305 for (tail = shadow; CONSP (tail); tail = XCONS (tail)->cdr)
2306 {
2307 value = Flookup_key (XCONS (tail)->car, key, flag);
2308 if (!NILP (value))
2309 return value;
2310 }
2311 return Qnil;
2312 }
2313
2314 /* Describe the contents of map MAP, assuming that this map itself is
2315 reached by the sequence of prefix keys KEYS (a string or vector).
2316 PARTIAL, SHADOW, NOMENU are as in `describe_map_tree' above. */
2317
2318 static void
2319 describe_map (map, keys, elt_describer, partial, shadow, seen, nomenu)
2320 register Lisp_Object map;
2321 Lisp_Object keys;
2322 int (*elt_describer) ();
2323 int partial;
2324 Lisp_Object shadow;
2325 Lisp_Object *seen;
2326 int nomenu;
2327 {
2328 Lisp_Object elt_prefix;
2329 Lisp_Object tail, definition, event;
2330 Lisp_Object tem;
2331 Lisp_Object suppress;
2332 Lisp_Object kludge;
2333 int first = 1;
2334 struct gcpro gcpro1, gcpro2, gcpro3;
2335
2336 if (!NILP (keys) && XFASTINT (Flength (keys)) > 0)
2337 {
2338 /* Call Fkey_description first, to avoid GC bug for the other string. */
2339 tem = Fkey_description (keys);
2340 elt_prefix = concat2 (tem, build_string (" "));
2341 }
2342 else
2343 elt_prefix = Qnil;
2344
2345 if (partial)
2346 suppress = intern ("suppress-keymap");
2347
2348 /* This vector gets used to present single keys to Flookup_key. Since
2349 that is done once per keymap element, we don't want to cons up a
2350 fresh vector every time. */
2351 kludge = Fmake_vector (make_number (1), Qnil);
2352 definition = Qnil;
2353
2354 GCPRO3 (elt_prefix, definition, kludge);
2355
2356 for (tail = map; CONSP (tail); tail = XCONS (tail)->cdr)
2357 {
2358 QUIT;
2359
2360 if (VECTORP (XCONS (tail)->car))
2361 describe_vector (XCONS (tail)->car,
2362 elt_prefix, elt_describer, partial, shadow, map);
2363 else if (CONSP (XCONS (tail)->car))
2364 {
2365 event = XCONS (XCONS (tail)->car)->car;
2366
2367 /* Ignore bindings whose "keys" are not really valid events.
2368 (We get these in the frames and buffers menu.) */
2369 if (! (SYMBOLP (event) || INTEGERP (event)))
2370 continue;
2371
2372 if (nomenu && EQ (event, Qmenu_bar))
2373 continue;
2374
2375 definition = get_keyelt (XCONS (XCONS (tail)->car)->cdr, 0);
2376
2377 /* Don't show undefined commands or suppressed commands. */
2378 if (NILP (definition)) continue;
2379 if (SYMBOLP (definition) && partial)
2380 {
2381 tem = Fget (definition, suppress);
2382 if (!NILP (tem))
2383 continue;
2384 }
2385
2386 /* Don't show a command that isn't really visible
2387 because a local definition of the same key shadows it. */
2388
2389 XVECTOR (kludge)->contents[0] = event;
2390 if (!NILP (shadow))
2391 {
2392 tem = shadow_lookup (shadow, kludge, Qt);
2393 if (!NILP (tem)) continue;
2394 }
2395
2396 tem = Flookup_key (map, kludge, Qt);
2397 if (! EQ (tem, definition)) continue;
2398
2399 if (first)
2400 {
2401 previous_description_column = 0;
2402 insert ("\n", 1);
2403 first = 0;
2404 }
2405
2406 if (!NILP (elt_prefix))
2407 insert1 (elt_prefix);
2408
2409 /* THIS gets the string to describe the character EVENT. */
2410 insert1 (Fsingle_key_description (event));
2411
2412 /* Print a description of the definition of this character.
2413 elt_describer will take care of spacing out far enough
2414 for alignment purposes. */
2415 (*elt_describer) (definition);
2416 }
2417 else if (EQ (XCONS (tail)->car, Qkeymap))
2418 {
2419 /* The same keymap might be in the structure twice, if we're
2420 using an inherited keymap. So skip anything we've already
2421 encountered. */
2422 tem = Fassq (tail, *seen);
2423 if (CONSP (tem) && !NILP (Fequal (XCONS (tem)->car, keys)))
2424 break;
2425 *seen = Fcons (Fcons (tail, keys), *seen);
2426 }
2427 }
2428
2429 UNGCPRO;
2430 }
2431
2432 static int
2433 describe_vector_princ (elt)
2434 Lisp_Object elt;
2435 {
2436 Findent_to (make_number (16), make_number (1));
2437 Fprinc (elt, Qnil);
2438 Fterpri (Qnil);
2439 }
2440
2441 DEFUN ("describe-vector", Fdescribe_vector, Sdescribe_vector, 1, 1, 0,
2442 "Insert a description of contents of VECTOR.\n\
2443 This is text showing the elements of vector matched against indices.")
2444 (vector)
2445 Lisp_Object vector;
2446 {
2447 int count = specpdl_ptr - specpdl;
2448
2449 specbind (Qstandard_output, Fcurrent_buffer ());
2450 CHECK_VECTOR_OR_CHAR_TABLE (vector, 0);
2451 describe_vector (vector, Qnil, describe_vector_princ, 0, Qnil, Qnil);
2452
2453 return unbind_to (count, Qnil);
2454 }
2455
2456 /* Insert in the current buffer a description of the contents of VECTOR.
2457 We call ELT_DESCRIBER to insert the description of one value found
2458 in VECTOR.
2459
2460 ELT_PREFIX describes what "comes before" the keys or indices defined
2461 by this vector.
2462
2463 If the vector is in a keymap, ELT_PREFIX is a prefix key which
2464 leads to this keymap.
2465
2466 If the vector is a chartable, ELT_PREFIX is the vector
2467 of bytes that lead to the character set or portion of a character
2468 set described by this chartable.
2469
2470 If PARTIAL is nonzero, it means do not mention suppressed commands
2471 (that assumes the vector is in a keymap).
2472
2473 SHADOW is a list of keymaps that shadow this map.
2474 If it is non-nil, then we look up the key in those maps
2475 and we don't mention it now if it is defined by any of them.
2476
2477 ENTIRE_MAP is the keymap in which this vector appears.
2478 If the definition in effect in the whole map does not match
2479 the one in this vector, we ignore this one. */
2480
2481 describe_vector (vector, elt_prefix, elt_describer,
2482 partial, shadow, entire_map)
2483 register Lisp_Object vector;
2484 Lisp_Object elt_prefix;
2485 int (*elt_describer) ();
2486 int partial;
2487 Lisp_Object shadow;
2488 Lisp_Object entire_map;
2489 {
2490 Lisp_Object this;
2491 Lisp_Object dummy;
2492 Lisp_Object definition;
2493 Lisp_Object tem2;
2494 register int i;
2495 Lisp_Object suppress;
2496 Lisp_Object kludge;
2497 Lisp_Object chartable_kludge;
2498 int first = 1;
2499 int size;
2500 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2501
2502 definition = Qnil;
2503 chartable_kludge = Qnil;
2504
2505 /* This vector gets used to present single keys to Flookup_key. Since
2506 that is done once per vector element, we don't want to cons up a
2507 fresh vector every time. */
2508 kludge = Fmake_vector (make_number (1), Qnil);
2509 GCPRO4 (elt_prefix, definition, kludge, chartable_kludge);
2510
2511 if (partial)
2512 suppress = intern ("suppress-keymap");
2513
2514 /* This does the right thing for char-tables as well as ordinary vectors. */
2515 size = XFASTINT (Flength (vector));
2516
2517 for (i = 0; i < size; i++)
2518 {
2519 QUIT;
2520 definition = get_keyelt (XVECTOR (vector)->contents[i], 0);
2521
2522 if (NILP (definition)) continue;
2523
2524 /* Don't mention suppressed commands. */
2525 if (SYMBOLP (definition) && partial)
2526 {
2527 this = Fget (definition, suppress);
2528 if (!NILP (this))
2529 continue;
2530 }
2531
2532 /* If this binding is shadowed by some other map, ignore it. */
2533 if (!NILP (shadow))
2534 {
2535 Lisp_Object tem;
2536
2537 XVECTOR (kludge)->contents[0] = make_number (i);
2538 tem = shadow_lookup (shadow, kludge, Qt);
2539
2540 if (!NILP (tem)) continue;
2541 }
2542
2543 /* Ignore this definition if it is shadowed by an earlier
2544 one in the same keymap. */
2545 if (!NILP (entire_map))
2546 {
2547 Lisp_Object tem;
2548
2549 XVECTOR (kludge)->contents[0] = make_number (i);
2550 tem = Flookup_key (entire_map, kludge, Qt);
2551
2552 if (! EQ (tem, definition))
2553 continue;
2554 }
2555
2556 /* If we find a char-table within a char-table,
2557 scan it recursively; it defines the details for
2558 a character set or a portion of a character set. */
2559 if (CHAR_TABLE_P (vector) && CHAR_TABLE_P (definition))
2560 {
2561 int outer_level
2562 = !NILP (elt_prefix) ? XVECTOR (elt_prefix)->size : 0;
2563 if (NILP (chartable_kludge))
2564 {
2565 chartable_kludge
2566 = Fmake_vector (make_number (outer_level + 1), Qnil);
2567 if (outer_level != 0)
2568 bcopy (XVECTOR (elt_prefix)->contents,
2569 XVECTOR (chartable_kludge)->contents,
2570 outer_level * sizeof (Lisp_Object));
2571 }
2572 XVECTOR (chartable_kludge)->contents[outer_level]
2573 = make_number (i);
2574 describe_vector (definition, chartable_kludge, elt_describer,
2575 partial, shadow, entire_map);
2576 continue;
2577 }
2578
2579 if (first)
2580 {
2581 insert ("\n", 1);
2582 first = 0;
2583 }
2584
2585 if (CHAR_TABLE_P (vector))
2586 {
2587 if (!NILP (elt_prefix))
2588 {
2589 /* Must combine elt_prefix with i to produce a character
2590 code, then insert that character's description. */
2591 }
2592 else
2593 {
2594 /* Get the string to describe the character I, and print it. */
2595 XSETFASTINT (dummy, i);
2596
2597 /* THIS gets the string to describe the character DUMMY. */
2598 this = Fsingle_key_description (dummy);
2599 insert1 (this);
2600 }
2601 }
2602 else
2603 {
2604 /* Output the prefix that applies to every entry in this map. */
2605 if (!NILP (elt_prefix))
2606 insert1 (elt_prefix);
2607
2608 /* Get the string to describe the character I, and print it. */
2609 XSETFASTINT (dummy, i);
2610
2611 /* THIS gets the string to describe the character DUMMY. */
2612 this = Fsingle_key_description (dummy);
2613 insert1 (this);
2614 }
2615
2616 /* Find all consecutive characters that have the same definition. */
2617 while (i + 1 < XVECTOR (vector)->size
2618 && (tem2 = get_keyelt (XVECTOR (vector)->contents[i+1], 0),
2619 EQ (tem2, definition)))
2620 i++;
2621
2622 /* If we have a range of more than one character,
2623 print where the range reaches to. */
2624
2625 if (i != XINT (dummy))
2626 {
2627 insert (" .. ", 4);
2628 if (CHAR_TABLE_P (vector))
2629 {
2630 if (!NILP (elt_prefix))
2631 {
2632 /* Must combine elt_prefix with i to produce a character
2633 code, then insert that character's description. */
2634 }
2635 else
2636 {
2637 XSETFASTINT (dummy, i);
2638
2639 this = Fsingle_key_description (dummy);
2640 insert1 (this);
2641 }
2642 }
2643 else
2644 {
2645 if (!NILP (elt_prefix))
2646 insert1 (elt_prefix);
2647
2648 XSETFASTINT (dummy, i);
2649 insert1 (Fsingle_key_description (dummy));
2650 }
2651 }
2652
2653 /* Print a description of the definition of this character.
2654 elt_describer will take care of spacing out far enough
2655 for alignment purposes. */
2656 (*elt_describer) (definition);
2657 }
2658
2659 UNGCPRO;
2660 }
2661 \f
2662 /* Apropos - finding all symbols whose names match a regexp. */
2663 Lisp_Object apropos_predicate;
2664 Lisp_Object apropos_accumulate;
2665
2666 static void
2667 apropos_accum (symbol, string)
2668 Lisp_Object symbol, string;
2669 {
2670 register Lisp_Object tem;
2671
2672 tem = Fstring_match (string, Fsymbol_name (symbol), Qnil);
2673 if (!NILP (tem) && !NILP (apropos_predicate))
2674 tem = call1 (apropos_predicate, symbol);
2675 if (!NILP (tem))
2676 apropos_accumulate = Fcons (symbol, apropos_accumulate);
2677 }
2678
2679 DEFUN ("apropos-internal", Fapropos_internal, Sapropos_internal, 1, 2, 0,
2680 "Show all symbols whose names contain match for REGEXP.\n\
2681 If optional 2nd arg PREDICATE is non-nil, (funcall PREDICATE SYMBOL) is done\n\
2682 for each symbol and a symbol is mentioned only if that returns non-nil.\n\
2683 Return list of symbols found.")
2684 (regexp, predicate)
2685 Lisp_Object regexp, predicate;
2686 {
2687 struct gcpro gcpro1, gcpro2;
2688 CHECK_STRING (regexp, 0);
2689 apropos_predicate = predicate;
2690 GCPRO2 (apropos_predicate, apropos_accumulate);
2691 apropos_accumulate = Qnil;
2692 map_obarray (Vobarray, apropos_accum, regexp);
2693 apropos_accumulate = Fsort (apropos_accumulate, Qstring_lessp);
2694 UNGCPRO;
2695 return apropos_accumulate;
2696 }
2697 \f
2698 syms_of_keymap ()
2699 {
2700 Lisp_Object tem;
2701
2702 Qkeymap = intern ("keymap");
2703 staticpro (&Qkeymap);
2704
2705 /* Initialize the keymaps standardly used.
2706 Each one is the value of a Lisp variable, and is also
2707 pointed to by a C variable */
2708
2709 global_map = Fcons (Qkeymap,
2710 Fcons (Fmake_vector (make_number (0400), Qnil), Qnil));
2711 Fset (intern ("global-map"), global_map);
2712
2713 meta_map = Fmake_keymap (Qnil);
2714 Fset (intern ("esc-map"), meta_map);
2715 Ffset (intern ("ESC-prefix"), meta_map);
2716
2717 control_x_map = Fmake_keymap (Qnil);
2718 Fset (intern ("ctl-x-map"), control_x_map);
2719 Ffset (intern ("Control-X-prefix"), control_x_map);
2720
2721 DEFVAR_LISP ("define-key-rebound-commands", &Vdefine_key_rebound_commands,
2722 "List of commands given new key bindings recently.\n\
2723 This is used for internal purposes during Emacs startup;\n\
2724 don't alter it yourself.");
2725 Vdefine_key_rebound_commands = Qt;
2726
2727 DEFVAR_LISP ("minibuffer-local-map", &Vminibuffer_local_map,
2728 "Default keymap to use when reading from the minibuffer.");
2729 Vminibuffer_local_map = Fmake_sparse_keymap (Qnil);
2730
2731 DEFVAR_LISP ("minibuffer-local-ns-map", &Vminibuffer_local_ns_map,
2732 "Local keymap for the minibuffer when spaces are not allowed.");
2733 Vminibuffer_local_ns_map = Fmake_sparse_keymap (Qnil);
2734
2735 DEFVAR_LISP ("minibuffer-local-completion-map", &Vminibuffer_local_completion_map,
2736 "Local keymap for minibuffer input with completion.");
2737 Vminibuffer_local_completion_map = Fmake_sparse_keymap (Qnil);
2738
2739 DEFVAR_LISP ("minibuffer-local-must-match-map", &Vminibuffer_local_must_match_map,
2740 "Local keymap for minibuffer input with completion, for exact match.");
2741 Vminibuffer_local_must_match_map = Fmake_sparse_keymap (Qnil);
2742
2743 current_global_map = global_map;
2744
2745 DEFVAR_LISP ("minor-mode-map-alist", &Vminor_mode_map_alist,
2746 "Alist of keymaps to use for minor modes.\n\
2747 Each element looks like (VARIABLE . KEYMAP); KEYMAP is used to read\n\
2748 key sequences and look up bindings iff VARIABLE's value is non-nil.\n\
2749 If two active keymaps bind the same key, the keymap appearing earlier\n\
2750 in the list takes precedence.");
2751 Vminor_mode_map_alist = Qnil;
2752
2753 DEFVAR_LISP ("function-key-map", &Vfunction_key_map,
2754 "Keymap mapping ASCII function key sequences onto their preferred forms.\n\
2755 This allows Emacs to recognize function keys sent from ASCII\n\
2756 terminals at any point in a key sequence.\n\
2757 \n\
2758 The `read-key-sequence' function replaces any subsequence bound by\n\
2759 `function-key-map' with its binding. More precisely, when the active\n\
2760 keymaps have no binding for the current key sequence but\n\
2761 `function-key-map' binds a suffix of the sequence to a vector or string,\n\
2762 `read-key-sequence' replaces the matching suffix with its binding, and\n\
2763 continues with the new sequence.\n\
2764 \n\
2765 The events that come from bindings in `function-key-map' are not\n\
2766 themselves looked up in `function-key-map'.\n\
2767 \n\
2768 For example, suppose `function-key-map' binds `ESC O P' to [f1].\n\
2769 Typing `ESC O P' to `read-key-sequence' would return [f1]. Typing\n\
2770 `C-x ESC O P' would return [?\\C-x f1]. If [f1] were a prefix\n\
2771 key, typing `ESC O P x' would return [f1 x].");
2772 Vfunction_key_map = Fmake_sparse_keymap (Qnil);
2773
2774 DEFVAR_LISP ("key-translation-map", &Vkey_translation_map,
2775 "Keymap of key translations that can override keymaps.\n\
2776 This keymap works like `function-key-map', but comes after that,\n\
2777 and applies even for keys that have ordinary bindings.");
2778 Vkey_translation_map = Qnil;
2779
2780 Qsingle_key_description = intern ("single-key-description");
2781 staticpro (&Qsingle_key_description);
2782
2783 Qkey_description = intern ("key-description");
2784 staticpro (&Qkey_description);
2785
2786 Qkeymapp = intern ("keymapp");
2787 staticpro (&Qkeymapp);
2788
2789 Qnon_ascii = intern ("non-ascii");
2790 staticpro (&Qnon_ascii);
2791
2792 defsubr (&Skeymapp);
2793 defsubr (&Skeymap_parent);
2794 defsubr (&Sset_keymap_parent);
2795 defsubr (&Smake_keymap);
2796 defsubr (&Smake_sparse_keymap);
2797 defsubr (&Scopy_keymap);
2798 defsubr (&Skey_binding);
2799 defsubr (&Slocal_key_binding);
2800 defsubr (&Sglobal_key_binding);
2801 defsubr (&Sminor_mode_key_binding);
2802 defsubr (&Sdefine_key);
2803 defsubr (&Slookup_key);
2804 defsubr (&Sdefine_prefix_command);
2805 defsubr (&Suse_global_map);
2806 defsubr (&Suse_local_map);
2807 defsubr (&Scurrent_local_map);
2808 defsubr (&Scurrent_global_map);
2809 defsubr (&Scurrent_minor_mode_maps);
2810 defsubr (&Saccessible_keymaps);
2811 defsubr (&Skey_description);
2812 defsubr (&Sdescribe_vector);
2813 defsubr (&Ssingle_key_description);
2814 defsubr (&Stext_char_description);
2815 defsubr (&Swhere_is_internal);
2816 defsubr (&Sdescribe_bindings);
2817 defsubr (&Sapropos_internal);
2818 }
2819
2820 keys_of_keymap ()
2821 {
2822 Lisp_Object tem;
2823
2824 initial_define_key (global_map, 033, "ESC-prefix");
2825 initial_define_key (global_map, Ctl('X'), "Control-X-prefix");
2826 }