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