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