; Merge from origin/emacs-25
[emacs.git] / src / keymap.c
blobb27df1d0452817f103aa22f90e5ababd81d9c17f
1 /* Manipulation of keymaps
2 Copyright (C) 1985-1988, 1993-1995, 1998-2016 Free Software
3 Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or (at
10 your option) any later version.
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
20 /* Old BUGS:
21 - [M-C-a] != [?\M-\C-a]
22 - [M-f2] != [?\e f2].
23 - (define-key map [menu-bar foo] <bla>) does not always place <bla>
24 at the head of the menu (if `foo' was already bound earlier and
25 then unbound, for example).
26 TODO:
27 - allow many more Meta -> ESC mappings (like Hyper -> C-e for Emacspeak)
28 - Think about the various defaulting that's currently hard-coded in
29 keyboard.c (uppercase->lowercase, char->charset, button-events, ...)
30 and make it more generic. Maybe we should allow mappings of the
31 form (PREDICATE . BINDING) as generalization of the default binding,
32 tho probably a cleaner way to attack this is to allow functional
33 keymaps (i.e. keymaps that are implemented as functions that implement
34 a few different methods like `lookup', `map', ...).
35 - Make [a] equivalent to [?a].
36 BEWARE:
37 - map-keymap should work meaningfully even if entries are added/removed
38 to the keymap while iterating through it:
39 start - removed <= visited <= start + added
42 #include <config.h>
43 #include <stdio.h>
45 #include "lisp.h"
46 #include "commands.h"
47 #include "character.h"
48 #include "buffer.h"
49 #include "keyboard.h"
50 #include "termhooks.h"
51 #include "blockinput.h"
52 #include "puresize.h"
53 #include "intervals.h"
54 #include "keymap.h"
55 #include "window.h"
57 /* Actually allocate storage for these variables. */
59 Lisp_Object current_global_map; /* Current global keymap. */
61 Lisp_Object global_map; /* Default global key bindings. */
63 Lisp_Object meta_map; /* The keymap used for globally bound
64 ESC-prefixed default commands. */
66 Lisp_Object control_x_map; /* The keymap used for globally bound
67 C-x-prefixed default commands. */
69 /* The keymap used by the minibuf for local
70 bindings when spaces are allowed in the
71 minibuf. */
73 /* The keymap used by the minibuf for local
74 bindings when spaces are not encouraged
75 in the minibuf. */
77 /* Alist of elements like (DEL . "\d"). */
78 static Lisp_Object exclude_keys;
80 /* Pre-allocated 2-element vector for Fcommand_remapping to use. */
81 static Lisp_Object command_remapping_vector;
83 /* Hash table used to cache a reverse-map to speed up calls to where-is. */
84 static Lisp_Object where_is_cache;
85 /* Which keymaps are reverse-stored in the cache. */
86 static Lisp_Object where_is_cache_keymaps;
88 static Lisp_Object store_in_keymap (Lisp_Object, Lisp_Object, Lisp_Object);
90 static Lisp_Object define_as_prefix (Lisp_Object, Lisp_Object);
91 static void describe_command (Lisp_Object, Lisp_Object);
92 static void describe_translation (Lisp_Object, Lisp_Object);
93 static void describe_map (Lisp_Object, Lisp_Object,
94 void (*) (Lisp_Object, Lisp_Object),
95 bool, Lisp_Object, Lisp_Object*, bool, bool);
96 static void describe_vector (Lisp_Object, Lisp_Object, Lisp_Object,
97 void (*) (Lisp_Object, Lisp_Object), bool,
98 Lisp_Object, Lisp_Object, bool, bool);
99 static void silly_event_symbol_error (Lisp_Object);
100 static Lisp_Object get_keyelt (Lisp_Object, bool);
102 static void
103 CHECK_VECTOR_OR_CHAR_TABLE (Lisp_Object x)
105 CHECK_TYPE (VECTORP (x) || CHAR_TABLE_P (x), Qvector_or_char_table_p, x);
108 /* Keymap object support - constructors and predicates. */
110 DEFUN ("make-keymap", Fmake_keymap, Smake_keymap, 0, 1, 0,
111 doc: /* Construct and return a new keymap, of the form (keymap CHARTABLE . ALIST).
112 CHARTABLE is a char-table that holds the bindings for all characters
113 without modifiers. All entries in it are initially nil, meaning
114 "command undefined". ALIST is an assoc-list which holds bindings for
115 function keys, mouse events, and any other things that appear in the
116 input stream. Initially, ALIST is nil.
118 The optional arg STRING supplies a menu name for the keymap
119 in case you use it as a menu with `x-popup-menu'. */)
120 (Lisp_Object string)
122 Lisp_Object tail;
123 if (!NILP (string))
124 tail = list1 (string);
125 else
126 tail = Qnil;
127 return Fcons (Qkeymap,
128 Fcons (Fmake_char_table (Qkeymap, Qnil), tail));
131 DEFUN ("make-sparse-keymap", Fmake_sparse_keymap, Smake_sparse_keymap, 0, 1, 0,
132 doc: /* Construct and return a new sparse keymap.
133 Its car is `keymap' and its cdr is an alist of (CHAR . DEFINITION),
134 which binds the character CHAR to DEFINITION, or (SYMBOL . DEFINITION),
135 which binds the function key or mouse event SYMBOL to DEFINITION.
136 Initially the alist is nil.
138 The optional arg STRING supplies a menu name for the keymap
139 in case you use it as a menu with `x-popup-menu'. */)
140 (Lisp_Object string)
142 if (!NILP (string))
144 if (!NILP (Vpurify_flag))
145 string = Fpurecopy (string);
146 return list2 (Qkeymap, string);
148 return list1 (Qkeymap);
151 /* This function is used for installing the standard key bindings
152 at initialization time.
154 For example:
156 initial_define_key (control_x_map, Ctl('X'), "exchange-point-and-mark"); */
158 void
159 initial_define_key (Lisp_Object keymap, int key, const char *defname)
161 store_in_keymap (keymap, make_number (key), intern_c_string (defname));
164 void
165 initial_define_lispy_key (Lisp_Object keymap, const char *keyname, const char *defname)
167 store_in_keymap (keymap, intern_c_string (keyname), intern_c_string (defname));
170 DEFUN ("keymapp", Fkeymapp, Skeymapp, 1, 1, 0,
171 doc: /* Return t if OBJECT is a keymap.
173 A keymap is a list (keymap . ALIST),
174 or a symbol whose function definition is itself a keymap.
175 ALIST elements look like (CHAR . DEFN) or (SYMBOL . DEFN);
176 a vector of densely packed bindings for small character codes
177 is also allowed as an element. */)
178 (Lisp_Object object)
180 return (KEYMAPP (object) ? Qt : Qnil);
183 DEFUN ("keymap-prompt", Fkeymap_prompt, Skeymap_prompt, 1, 1, 0,
184 doc: /* Return the prompt-string of a keymap MAP.
185 If non-nil, the prompt is shown in the echo-area
186 when reading a key-sequence to be looked-up in this keymap. */)
187 (Lisp_Object map)
189 map = get_keymap (map, 0, 0);
190 while (CONSP (map))
192 Lisp_Object tem = XCAR (map);
193 if (STRINGP (tem))
194 return tem;
195 else if (KEYMAPP (tem))
197 tem = Fkeymap_prompt (tem);
198 if (!NILP (tem))
199 return tem;
201 map = XCDR (map);
203 return Qnil;
206 /* Check that OBJECT is a keymap (after dereferencing through any
207 symbols). If it is, return it.
209 If AUTOLOAD and if OBJECT is a symbol whose function value
210 is an autoload form, do the autoload and try again.
211 If AUTOLOAD, callers must assume GC is possible.
213 ERROR_IF_NOT_KEYMAP controls how we respond if OBJECT isn't a keymap.
214 If ERROR_IF_NOT_KEYMAP, signal an error; otherwise,
215 just return Qnil.
217 Note that most of the time, we don't want to pursue autoloads.
218 Functions like Faccessible_keymaps which scan entire keymap trees
219 shouldn't load every autoloaded keymap. I'm not sure about this,
220 but it seems to me that only read_key_sequence, Flookup_key, and
221 Fdefine_key should cause keymaps to be autoloaded.
223 This function can GC when AUTOLOAD is true, because it calls
224 Fautoload_do_load which can GC. */
226 Lisp_Object
227 get_keymap (Lisp_Object object, bool error_if_not_keymap, bool autoload)
229 Lisp_Object tem;
231 autoload_retry:
232 if (NILP (object))
233 goto end;
234 if (CONSP (object) && EQ (XCAR (object), Qkeymap))
235 return object;
237 tem = indirect_function (object);
238 if (CONSP (tem))
240 if (EQ (XCAR (tem), Qkeymap))
241 return tem;
243 /* Should we do an autoload? Autoload forms for keymaps have
244 Qkeymap as their fifth element. */
245 if ((autoload || !error_if_not_keymap) && EQ (XCAR (tem), Qautoload)
246 && SYMBOLP (object))
248 Lisp_Object tail;
250 tail = Fnth (make_number (4), tem);
251 if (EQ (tail, Qkeymap))
253 if (autoload)
255 Fautoload_do_load (tem, object, Qnil);
256 goto autoload_retry;
258 else
259 return object;
264 end:
265 if (error_if_not_keymap)
266 wrong_type_argument (Qkeymapp, object);
267 return Qnil;
270 /* Return the parent map of KEYMAP, or nil if it has none.
271 We assume that KEYMAP is a valid keymap. */
273 static Lisp_Object
274 keymap_parent (Lisp_Object keymap, bool autoload)
276 Lisp_Object list;
278 keymap = get_keymap (keymap, 1, autoload);
280 /* Skip past the initial element `keymap'. */
281 list = XCDR (keymap);
282 for (; CONSP (list); list = XCDR (list))
284 /* See if there is another `keymap'. */
285 if (KEYMAPP (list))
286 return list;
289 return get_keymap (list, 0, autoload);
292 DEFUN ("keymap-parent", Fkeymap_parent, Skeymap_parent, 1, 1, 0,
293 doc: /* Return the parent keymap of KEYMAP.
294 If KEYMAP has no parent, return nil. */)
295 (Lisp_Object keymap)
297 return keymap_parent (keymap, 1);
300 /* Check whether MAP is one of MAPS parents. */
301 static bool
302 keymap_memberp (Lisp_Object map, Lisp_Object maps)
304 if (NILP (map)) return 0;
305 while (KEYMAPP (maps) && !EQ (map, maps))
306 maps = keymap_parent (maps, 0);
307 return (EQ (map, maps));
310 /* Set the parent keymap of MAP to PARENT. */
312 DEFUN ("set-keymap-parent", Fset_keymap_parent, Sset_keymap_parent, 2, 2, 0,
313 doc: /* Modify KEYMAP to set its parent map to PARENT.
314 Return PARENT. PARENT should be nil or another keymap. */)
315 (Lisp_Object keymap, Lisp_Object parent)
317 Lisp_Object list, prev;
319 /* Flush any reverse-map cache. */
320 where_is_cache = Qnil; where_is_cache_keymaps = Qt;
322 keymap = get_keymap (keymap, 1, 1);
324 if (!NILP (parent))
326 parent = get_keymap (parent, 1, 0);
328 /* Check for cycles. */
329 if (keymap_memberp (keymap, parent))
330 error ("Cyclic keymap inheritance");
333 /* Skip past the initial element `keymap'. */
334 prev = keymap;
335 while (1)
337 list = XCDR (prev);
338 /* If there is a parent keymap here, replace it.
339 If we came to the end, add the parent in PREV. */
340 if (!CONSP (list) || KEYMAPP (list))
342 CHECK_IMPURE (prev, XCONS (prev));
343 XSETCDR (prev, parent);
344 return parent;
346 prev = list;
351 /* Look up IDX in MAP. IDX may be any sort of event.
352 Note that this does only one level of lookup; IDX must be a single
353 event, not a sequence.
355 MAP must be a keymap or a list of keymaps.
357 If T_OK, bindings for Qt are treated as default
358 bindings; any key left unmentioned by other tables and bindings is
359 given the binding of Qt.
361 If not T_OK, bindings for Qt are not treated specially.
363 If NOINHERIT, don't accept a subkeymap found in an inherited keymap.
365 Return Qunbound if no binding was found (and return Qnil if a nil
366 binding was found). */
368 static Lisp_Object
369 access_keymap_1 (Lisp_Object map, Lisp_Object idx,
370 bool t_ok, bool noinherit, bool autoload)
372 /* If idx is a list (some sort of mouse click, perhaps?),
373 the index we want to use is the car of the list, which
374 ought to be a symbol. */
375 idx = EVENT_HEAD (idx);
377 /* If idx is a symbol, it might have modifiers, which need to
378 be put in the canonical order. */
379 if (SYMBOLP (idx))
380 idx = reorder_modifiers (idx);
381 else if (INTEGERP (idx))
382 /* Clobber the high bits that can be present on a machine
383 with more than 24 bits of integer. */
384 XSETFASTINT (idx, XINT (idx) & (CHAR_META | (CHAR_META - 1)));
386 /* Handle the special meta -> esc mapping. */
387 if (INTEGERP (idx) && XFASTINT (idx) & meta_modifier)
389 /* See if there is a meta-map. If there's none, there is
390 no binding for IDX, unless a default binding exists in MAP. */
391 Lisp_Object event_meta_binding, event_meta_map;
392 /* A strange value in which Meta is set would cause
393 infinite recursion. Protect against that. */
394 if (XINT (meta_prefix_char) & CHAR_META)
395 meta_prefix_char = make_number (27);
396 event_meta_binding = access_keymap_1 (map, meta_prefix_char, t_ok,
397 noinherit, autoload);
398 event_meta_map = get_keymap (event_meta_binding, 0, autoload);
399 if (CONSP (event_meta_map))
401 map = event_meta_map;
402 idx = make_number (XFASTINT (idx) & ~meta_modifier);
404 else if (t_ok)
405 /* Set IDX to t, so that we only find a default binding. */
406 idx = Qt;
407 else
408 /* An explicit nil binding, or no binding at all. */
409 return NILP (event_meta_binding) ? Qnil : Qunbound;
412 /* t_binding is where we put a default binding that applies,
413 to use in case we do not find a binding specifically
414 for this key sequence. */
416 Lisp_Object tail;
417 Lisp_Object t_binding = Qunbound;
418 Lisp_Object retval = Qunbound;
419 Lisp_Object retval_tail = Qnil;
421 for (tail = (CONSP (map) && EQ (Qkeymap, XCAR (map))) ? XCDR (map) : map;
422 (CONSP (tail)
423 || (tail = get_keymap (tail, 0, autoload), CONSP (tail)));
424 tail = XCDR (tail))
426 /* Qunbound in VAL means we have found no binding. */
427 Lisp_Object val = Qunbound;
428 Lisp_Object binding = XCAR (tail);
429 Lisp_Object submap = get_keymap (binding, 0, autoload);
431 if (EQ (binding, Qkeymap))
433 if (noinherit || NILP (retval))
434 /* If NOINHERIT, stop here, the rest is inherited. */
435 break;
436 else if (!EQ (retval, Qunbound))
438 Lisp_Object parent_entry;
439 eassert (KEYMAPP (retval));
440 parent_entry
441 = get_keymap (access_keymap_1 (tail, idx,
442 t_ok, 0, autoload),
443 0, autoload);
444 if (KEYMAPP (parent_entry))
446 if (CONSP (retval_tail))
447 XSETCDR (retval_tail, parent_entry);
448 else
450 retval_tail = Fcons (retval, parent_entry);
451 retval = Fcons (Qkeymap, retval_tail);
454 break;
457 else if (CONSP (submap))
459 val = access_keymap_1 (submap, idx, t_ok, noinherit, autoload);
461 else if (CONSP (binding))
463 Lisp_Object key = XCAR (binding);
465 if (EQ (key, idx))
466 val = XCDR (binding);
467 else if (t_ok && EQ (key, Qt))
469 t_binding = XCDR (binding);
470 t_ok = 0;
473 else if (VECTORP (binding))
475 if (INTEGERP (idx) && XFASTINT (idx) < ASIZE (binding))
476 val = AREF (binding, XFASTINT (idx));
478 else if (CHAR_TABLE_P (binding))
480 /* Character codes with modifiers
481 are not included in a char-table.
482 All character codes without modifiers are included. */
483 if (INTEGERP (idx) && (XFASTINT (idx) & CHAR_MODIFIER_MASK) == 0)
485 val = Faref (binding, idx);
486 /* nil has a special meaning for char-tables, so
487 we use something else to record an explicitly
488 unbound entry. */
489 if (NILP (val))
490 val = Qunbound;
494 /* If we found a binding, clean it up and return it. */
495 if (!EQ (val, Qunbound))
497 if (EQ (val, Qt))
498 /* A Qt binding is just like an explicit nil binding
499 (i.e. it shadows any parent binding but not bindings in
500 keymaps of lower precedence). */
501 val = Qnil;
503 val = get_keyelt (val, autoload);
505 if (!KEYMAPP (val))
507 if (NILP (retval) || EQ (retval, Qunbound))
508 retval = val;
509 if (!NILP (val))
510 break; /* Shadows everything that follows. */
512 else if (NILP (retval) || EQ (retval, Qunbound))
513 retval = val;
514 else if (CONSP (retval_tail))
516 XSETCDR (retval_tail, list1 (val));
517 retval_tail = XCDR (retval_tail);
519 else
521 retval_tail = list1 (val);
522 retval = Fcons (Qkeymap, Fcons (retval, retval_tail));
525 QUIT;
528 return EQ (Qunbound, retval) ? get_keyelt (t_binding, autoload) : retval;
532 Lisp_Object
533 access_keymap (Lisp_Object map, Lisp_Object idx,
534 bool t_ok, bool noinherit, bool autoload)
536 Lisp_Object val = access_keymap_1 (map, idx, t_ok, noinherit, autoload);
537 return EQ (val, Qunbound) ? Qnil : val;
540 static void
541 map_keymap_item (map_keymap_function_t fun, Lisp_Object args, Lisp_Object key, Lisp_Object val, void *data)
543 if (EQ (val, Qt))
544 val = Qnil;
545 (*fun) (key, val, args, data);
548 static void
549 map_keymap_char_table_item (Lisp_Object args, Lisp_Object key, Lisp_Object val)
551 if (!NILP (val))
553 map_keymap_function_t fun
554 = (map_keymap_function_t) XSAVE_FUNCPOINTER (args, 0);
555 /* If the key is a range, make a copy since map_char_table modifies
556 it in place. */
557 if (CONSP (key))
558 key = Fcons (XCAR (key), XCDR (key));
559 map_keymap_item (fun, XSAVE_OBJECT (args, 2), key,
560 val, XSAVE_POINTER (args, 1));
564 /* Call FUN for every binding in MAP and stop at (and return) the parent.
565 FUN is called with 4 arguments: FUN (KEY, BINDING, ARGS, DATA). */
566 static Lisp_Object
567 map_keymap_internal (Lisp_Object map,
568 map_keymap_function_t fun,
569 Lisp_Object args,
570 void *data)
572 Lisp_Object tail
573 = (CONSP (map) && EQ (Qkeymap, XCAR (map))) ? XCDR (map) : map;
575 for (; CONSP (tail) && !EQ (Qkeymap, XCAR (tail)); tail = XCDR (tail))
577 Lisp_Object binding = XCAR (tail);
579 if (KEYMAPP (binding)) /* An embedded parent. */
580 break;
581 else if (CONSP (binding))
582 map_keymap_item (fun, args, XCAR (binding), XCDR (binding), data);
583 else if (VECTORP (binding))
585 /* Loop over the char values represented in the vector. */
586 int len = ASIZE (binding);
587 int c;
588 for (c = 0; c < len; c++)
590 Lisp_Object character;
591 XSETFASTINT (character, c);
592 map_keymap_item (fun, args, character, AREF (binding, c), data);
595 else if (CHAR_TABLE_P (binding))
596 map_char_table (map_keymap_char_table_item, Qnil, binding,
597 make_save_funcptr_ptr_obj ((voidfuncptr) fun, data,
598 args));
601 return tail;
604 static void
605 map_keymap_call (Lisp_Object key, Lisp_Object val, Lisp_Object fun, void *dummy)
607 call2 (fun, key, val);
610 /* Same as map_keymap_internal, but traverses parent keymaps as well.
611 AUTOLOAD indicates that autoloaded keymaps should be loaded. */
612 void
613 map_keymap (Lisp_Object map, map_keymap_function_t fun, Lisp_Object args,
614 void *data, bool autoload)
616 map = get_keymap (map, 1, autoload);
617 while (CONSP (map))
619 if (KEYMAPP (XCAR (map)))
621 map_keymap (XCAR (map), fun, args, data, autoload);
622 map = XCDR (map);
624 else
625 map = map_keymap_internal (map, fun, args, data);
626 if (!CONSP (map))
627 map = get_keymap (map, 0, autoload);
631 /* Same as map_keymap, but does it right, properly eliminating duplicate
632 bindings due to inheritance. */
633 void
634 map_keymap_canonical (Lisp_Object map, map_keymap_function_t fun, Lisp_Object args, void *data)
636 /* map_keymap_canonical may be used from redisplay (e.g. when building menus)
637 so be careful to ignore errors and to inhibit redisplay. */
638 map = safe_call1 (Qkeymap_canonicalize, map);
639 /* No need to use `map_keymap' here because canonical map has no parent. */
640 map_keymap_internal (map, fun, args, data);
643 DEFUN ("map-keymap-internal", Fmap_keymap_internal, Smap_keymap_internal, 2, 2, 0,
644 doc: /* Call FUNCTION once for each event binding in KEYMAP.
645 FUNCTION is called with two arguments: the event that is bound, and
646 the definition it is bound to. The event may be a character range.
647 If KEYMAP has a parent, this function returns it without processing it. */)
648 (Lisp_Object function, Lisp_Object keymap)
650 keymap = get_keymap (keymap, 1, 1);
651 keymap = map_keymap_internal (keymap, map_keymap_call, function, NULL);
652 return keymap;
655 DEFUN ("map-keymap", Fmap_keymap, Smap_keymap, 2, 3, 0,
656 doc: /* Call FUNCTION once for each event binding in KEYMAP.
657 FUNCTION is called with two arguments: the event that is bound, and
658 the definition it is bound to. The event may be a character range.
660 If KEYMAP has a parent, the parent's bindings are included as well.
661 This works recursively: if the parent has itself a parent, then the
662 grandparent's bindings are also included and so on.
663 usage: (map-keymap FUNCTION KEYMAP) */)
664 (Lisp_Object function, Lisp_Object keymap, Lisp_Object sort_first)
666 if (! NILP (sort_first))
667 return call2 (intern ("map-keymap-sorted"), function, keymap);
669 map_keymap (keymap, map_keymap_call, function, NULL, 1);
670 return Qnil;
673 /* Given OBJECT which was found in a slot in a keymap,
674 trace indirect definitions to get the actual definition of that slot.
675 An indirect definition is a list of the form
676 (KEYMAP . INDEX), where KEYMAP is a keymap or a symbol defined as one
677 and INDEX is the object to look up in KEYMAP to yield the definition.
679 Also if OBJECT has a menu string as the first element,
680 remove that. Also remove a menu help string as second element.
682 If AUTOLOAD, load autoloadable keymaps
683 that are referred to with indirection.
685 This can GC because menu_item_eval_property calls Feval. */
687 static Lisp_Object
688 get_keyelt (Lisp_Object object, bool autoload)
690 while (1)
692 if (!(CONSP (object)))
693 /* This is really the value. */
694 return object;
696 /* If the keymap contents looks like (menu-item name . DEFN)
697 or (menu-item name DEFN ...) then use DEFN.
698 This is a new format menu item. */
699 else if (EQ (XCAR (object), Qmenu_item))
701 if (CONSP (XCDR (object)))
703 Lisp_Object tem;
705 object = XCDR (XCDR (object));
706 tem = object;
707 if (CONSP (object))
708 object = XCAR (object);
710 /* If there's a `:filter FILTER', apply FILTER to the
711 menu-item's definition to get the real definition to
712 use. */
713 for (; CONSP (tem) && CONSP (XCDR (tem)); tem = XCDR (tem))
714 if (EQ (XCAR (tem), QCfilter) && autoload)
716 Lisp_Object filter;
717 filter = XCAR (XCDR (tem));
718 filter = list2 (filter, list2 (Qquote, object));
719 object = menu_item_eval_property (filter);
720 break;
723 else
724 /* Invalid keymap. */
725 return object;
728 /* If the keymap contents looks like (STRING . DEFN), use DEFN.
729 Keymap alist elements like (CHAR MENUSTRING . DEFN)
730 will be used by HierarKey menus. */
731 else if (STRINGP (XCAR (object)))
732 object = XCDR (object);
734 else
735 return object;
739 static Lisp_Object
740 store_in_keymap (Lisp_Object keymap, register Lisp_Object idx, Lisp_Object def)
742 /* Flush any reverse-map cache. */
743 where_is_cache = Qnil;
744 where_is_cache_keymaps = Qt;
746 if (EQ (idx, Qkeymap))
747 error ("`keymap' is reserved for embedded parent maps");
749 /* If we are preparing to dump, and DEF is a menu element
750 with a menu item indicator, copy it to ensure it is not pure. */
751 if (CONSP (def) && PURE_P (XCONS (def))
752 && (EQ (XCAR (def), Qmenu_item) || STRINGP (XCAR (def))))
753 def = Fcons (XCAR (def), XCDR (def));
755 if (!CONSP (keymap) || !EQ (XCAR (keymap), Qkeymap))
756 error ("attempt to define a key in a non-keymap");
758 /* If idx is a cons, and the car part is a character, idx must be of
759 the form (FROM-CHAR . TO-CHAR). */
760 if (CONSP (idx) && CHARACTERP (XCAR (idx)))
761 CHECK_CHARACTER_CDR (idx);
762 else
763 /* If idx is a list (some sort of mouse click, perhaps?),
764 the index we want to use is the car of the list, which
765 ought to be a symbol. */
766 idx = EVENT_HEAD (idx);
768 /* If idx is a symbol, it might have modifiers, which need to
769 be put in the canonical order. */
770 if (SYMBOLP (idx))
771 idx = reorder_modifiers (idx);
772 else if (INTEGERP (idx))
773 /* Clobber the high bits that can be present on a machine
774 with more than 24 bits of integer. */
775 XSETFASTINT (idx, XINT (idx) & (CHAR_META | (CHAR_META - 1)));
777 /* Scan the keymap for a binding of idx. */
779 Lisp_Object tail;
781 /* The cons after which we should insert new bindings. If the
782 keymap has a table element, we record its position here, so new
783 bindings will go after it; this way, the table will stay
784 towards the front of the alist and character lookups in dense
785 keymaps will remain fast. Otherwise, this just points at the
786 front of the keymap. */
787 Lisp_Object insertion_point;
789 insertion_point = keymap;
790 for (tail = XCDR (keymap); CONSP (tail); tail = XCDR (tail))
792 Lisp_Object elt;
794 elt = XCAR (tail);
795 if (VECTORP (elt))
797 if (NATNUMP (idx) && XFASTINT (idx) < ASIZE (elt))
799 CHECK_IMPURE (elt, XVECTOR (elt));
800 ASET (elt, XFASTINT (idx), def);
801 return def;
803 else if (CONSP (idx) && CHARACTERP (XCAR (idx)))
805 int from = XFASTINT (XCAR (idx));
806 int to = XFASTINT (XCDR (idx));
808 if (to >= ASIZE (elt))
809 to = ASIZE (elt) - 1;
810 for (; from <= to; from++)
811 ASET (elt, from, def);
812 if (to == XFASTINT (XCDR (idx)))
813 /* We have defined all keys in IDX. */
814 return def;
816 insertion_point = tail;
818 else if (CHAR_TABLE_P (elt))
820 /* Character codes with modifiers
821 are not included in a char-table.
822 All character codes without modifiers are included. */
823 if (NATNUMP (idx) && !(XFASTINT (idx) & CHAR_MODIFIER_MASK))
825 Faset (elt, idx,
826 /* nil has a special meaning for char-tables, so
827 we use something else to record an explicitly
828 unbound entry. */
829 NILP (def) ? Qt : def);
830 return def;
832 else if (CONSP (idx) && CHARACTERP (XCAR (idx)))
834 Fset_char_table_range (elt, idx, NILP (def) ? Qt : def);
835 return def;
837 insertion_point = tail;
839 else if (CONSP (elt))
841 if (EQ (Qkeymap, XCAR (elt)))
842 { /* A sub keymap. This might be due to a lookup that found
843 two matching bindings (maybe because of a sub keymap).
844 It almost never happens (since the second binding normally
845 only happens in the inherited part of the keymap), but
846 if it does, we want to update the sub-keymap since the
847 main one might be temporary (built by access_keymap). */
848 tail = insertion_point = elt;
850 else if (EQ (idx, XCAR (elt)))
852 CHECK_IMPURE (elt, XCONS (elt));
853 XSETCDR (elt, def);
854 return def;
856 else if (CONSP (idx)
857 && CHARACTERP (XCAR (idx))
858 && CHARACTERP (XCAR (elt)))
860 int from = XFASTINT (XCAR (idx));
861 int to = XFASTINT (XCDR (idx));
863 if (from <= XFASTINT (XCAR (elt))
864 && to >= XFASTINT (XCAR (elt)))
866 XSETCDR (elt, def);
867 if (from == to)
868 return def;
872 else if (EQ (elt, Qkeymap))
873 /* If we find a 'keymap' symbol in the spine of KEYMAP,
874 then we must have found the start of a second keymap
875 being used as the tail of KEYMAP, and a binding for IDX
876 should be inserted before it. */
877 goto keymap_end;
879 QUIT;
882 keymap_end:
883 /* We have scanned the entire keymap, and not found a binding for
884 IDX. Let's add one. */
886 Lisp_Object elt;
888 if (CONSP (idx) && CHARACTERP (XCAR (idx)))
890 /* IDX specifies a range of characters, and not all of them
891 were handled yet, which means this keymap doesn't have a
892 char-table. So, we insert a char-table now. */
893 elt = Fmake_char_table (Qkeymap, Qnil);
894 Fset_char_table_range (elt, idx, NILP (def) ? Qt : def);
896 else
897 elt = Fcons (idx, def);
898 CHECK_IMPURE (insertion_point, XCONS (insertion_point));
899 XSETCDR (insertion_point, Fcons (elt, XCDR (insertion_point)));
903 return def;
906 static Lisp_Object
907 copy_keymap_item (Lisp_Object elt)
909 Lisp_Object res, tem;
911 if (!CONSP (elt))
912 return elt;
914 res = tem = elt;
916 /* Is this a new format menu item. */
917 if (EQ (XCAR (tem), Qmenu_item))
919 /* Copy cell with menu-item marker. */
920 res = elt = Fcons (XCAR (tem), XCDR (tem));
921 tem = XCDR (elt);
922 if (CONSP (tem))
924 /* Copy cell with menu-item name. */
925 XSETCDR (elt, Fcons (XCAR (tem), XCDR (tem)));
926 elt = XCDR (elt);
927 tem = XCDR (elt);
929 if (CONSP (tem))
931 /* Copy cell with binding and if the binding is a keymap,
932 copy that. */
933 XSETCDR (elt, Fcons (XCAR (tem), XCDR (tem)));
934 elt = XCDR (elt);
935 tem = XCAR (elt);
936 if (CONSP (tem) && EQ (XCAR (tem), Qkeymap))
937 XSETCAR (elt, Fcopy_keymap (tem));
938 tem = XCDR (elt);
941 else
943 /* It may be an old format menu item.
944 Skip the optional menu string. */
945 if (STRINGP (XCAR (tem)))
947 /* Copy the cell, since copy-alist didn't go this deep. */
948 res = elt = Fcons (XCAR (tem), XCDR (tem));
949 tem = XCDR (elt);
950 /* Also skip the optional menu help string. */
951 if (CONSP (tem) && STRINGP (XCAR (tem)))
953 XSETCDR (elt, Fcons (XCAR (tem), XCDR (tem)));
954 elt = XCDR (elt);
955 tem = XCDR (elt);
957 if (CONSP (tem) && EQ (XCAR (tem), Qkeymap))
958 XSETCDR (elt, Fcopy_keymap (tem));
960 else if (EQ (XCAR (tem), Qkeymap))
961 res = Fcopy_keymap (elt);
963 return res;
966 static void
967 copy_keymap_1 (Lisp_Object chartable, Lisp_Object idx, Lisp_Object elt)
969 Fset_char_table_range (chartable, idx, copy_keymap_item (elt));
972 DEFUN ("copy-keymap", Fcopy_keymap, Scopy_keymap, 1, 1, 0,
973 doc: /* Return a copy of the keymap KEYMAP.
975 Note that this is almost never needed. If you want a keymap that's like
976 another yet with a few changes, you should use map inheritance rather
977 than copying. I.e. something like:
979 (let ((map (make-sparse-keymap)))
980 (set-keymap-parent map <theirmap>)
981 (define-key map ...)
982 ...)
984 After performing `copy-keymap', the copy starts out with the same definitions
985 of KEYMAP, but changing either the copy or KEYMAP does not affect the other.
986 Any key definitions that are subkeymaps are recursively copied.
987 However, a key definition which is a symbol whose definition is a keymap
988 is not copied. */)
989 (Lisp_Object keymap)
991 Lisp_Object copy, tail;
992 keymap = get_keymap (keymap, 1, 0);
993 copy = tail = list1 (Qkeymap);
994 keymap = XCDR (keymap); /* Skip the `keymap' symbol. */
996 while (CONSP (keymap) && !EQ (XCAR (keymap), Qkeymap))
998 Lisp_Object elt = XCAR (keymap);
999 if (CHAR_TABLE_P (elt))
1001 elt = Fcopy_sequence (elt);
1002 map_char_table (copy_keymap_1, Qnil, elt, elt);
1004 else if (VECTORP (elt))
1006 int i;
1007 elt = Fcopy_sequence (elt);
1008 for (i = 0; i < ASIZE (elt); i++)
1009 ASET (elt, i, copy_keymap_item (AREF (elt, i)));
1011 else if (CONSP (elt))
1013 if (EQ (XCAR (elt), Qkeymap))
1014 /* This is a sub keymap. */
1015 elt = Fcopy_keymap (elt);
1016 else
1017 elt = Fcons (XCAR (elt), copy_keymap_item (XCDR (elt)));
1019 XSETCDR (tail, list1 (elt));
1020 tail = XCDR (tail);
1021 keymap = XCDR (keymap);
1023 XSETCDR (tail, keymap);
1024 return copy;
1027 /* Simple Keymap mutators and accessors. */
1029 /* GC is possible in this function if it autoloads a keymap. */
1031 DEFUN ("define-key", Fdefine_key, Sdefine_key, 3, 3, 0,
1032 doc: /* In KEYMAP, define key sequence KEY as DEF.
1033 KEYMAP is a keymap.
1035 KEY is a string or a vector of symbols and characters, representing a
1036 sequence of keystrokes and events. Non-ASCII characters with codes
1037 above 127 (such as ISO Latin-1) can be represented by vectors.
1038 Two types of vector have special meanings:
1039 [remap COMMAND] remaps any key binding for COMMAND.
1040 [t] creates a default definition, which applies to any event with no
1041 other definition in KEYMAP.
1043 DEF is anything that can be a key's definition:
1044 nil (means key is undefined in this keymap),
1045 a command (a Lisp function suitable for interactive calling),
1046 a string (treated as a keyboard macro),
1047 a keymap (to define a prefix key),
1048 a symbol (when the key is looked up, the symbol will stand for its
1049 function definition, which should at that time be one of the above,
1050 or another symbol whose function definition is used, etc.),
1051 a cons (STRING . DEFN), meaning that DEFN is the definition
1052 (DEFN should be a valid definition in its own right),
1053 or a cons (MAP . CHAR), meaning use definition of CHAR in keymap MAP,
1054 or an extended menu item definition.
1055 (See info node `(elisp)Extended Menu Items'.)
1057 If KEYMAP is a sparse keymap with a binding for KEY, the existing
1058 binding is altered. If there is no binding for KEY, the new pair
1059 binding KEY to DEF is added at the front of KEYMAP. */)
1060 (Lisp_Object keymap, Lisp_Object key, Lisp_Object def)
1062 ptrdiff_t idx;
1063 Lisp_Object c;
1064 Lisp_Object cmd;
1065 bool metized = 0;
1066 int meta_bit;
1067 ptrdiff_t length;
1069 keymap = get_keymap (keymap, 1, 1);
1071 length = CHECK_VECTOR_OR_STRING (key);
1072 if (length == 0)
1073 return Qnil;
1075 if (SYMBOLP (def) && !EQ (Vdefine_key_rebound_commands, Qt))
1076 Vdefine_key_rebound_commands = Fcons (def, Vdefine_key_rebound_commands);
1078 meta_bit = (VECTORP (key) || (STRINGP (key) && STRING_MULTIBYTE (key))
1079 ? meta_modifier : 0x80);
1081 if (VECTORP (def) && ASIZE (def) > 0 && CONSP (AREF (def, 0)))
1082 { /* DEF is apparently an XEmacs-style keyboard macro. */
1083 Lisp_Object tmp = Fmake_vector (make_number (ASIZE (def)), Qnil);
1084 ptrdiff_t i = ASIZE (def);
1085 while (--i >= 0)
1087 Lisp_Object defi = AREF (def, i);
1088 if (CONSP (defi) && lucid_event_type_list_p (defi))
1089 defi = Fevent_convert_list (defi);
1090 ASET (tmp, i, defi);
1092 def = tmp;
1095 idx = 0;
1096 while (1)
1098 c = Faref (key, make_number (idx));
1100 if (CONSP (c))
1102 /* C may be a Lucid style event type list or a cons (FROM .
1103 TO) specifying a range of characters. */
1104 if (lucid_event_type_list_p (c))
1105 c = Fevent_convert_list (c);
1106 else if (CHARACTERP (XCAR (c)))
1107 CHECK_CHARACTER_CDR (c);
1110 if (SYMBOLP (c))
1111 silly_event_symbol_error (c);
1113 if (INTEGERP (c)
1114 && (XINT (c) & meta_bit)
1115 && !metized)
1117 c = meta_prefix_char;
1118 metized = 1;
1120 else
1122 if (INTEGERP (c))
1123 XSETINT (c, XINT (c) & ~meta_bit);
1125 metized = 0;
1126 idx++;
1129 if (!INTEGERP (c) && !SYMBOLP (c)
1130 && (!CONSP (c)
1131 /* If C is a range, it must be a leaf. */
1132 || (INTEGERP (XCAR (c)) && idx != length)))
1133 message_with_string ("Key sequence contains invalid event %s", c, 1);
1135 if (idx == length)
1136 return store_in_keymap (keymap, c, def);
1138 cmd = access_keymap (keymap, c, 0, 1, 1);
1140 /* If this key is undefined, make it a prefix. */
1141 if (NILP (cmd))
1142 cmd = define_as_prefix (keymap, c);
1144 keymap = get_keymap (cmd, 0, 1);
1145 if (!CONSP (keymap))
1147 const char *trailing_esc = ((EQ (c, meta_prefix_char) && metized)
1148 ? (idx == 0 ? "ESC" : " ESC")
1149 : "");
1151 /* We must use Fkey_description rather than just passing key to
1152 error; key might be a vector, not a string. */
1153 error ("Key sequence %s starts with non-prefix key %s%s",
1154 SDATA (Fkey_description (key, Qnil)),
1155 SDATA (Fkey_description (Fsubstring (key, make_number (0),
1156 make_number (idx)),
1157 Qnil)),
1158 trailing_esc);
1163 /* This function may GC (it calls Fkey_binding). */
1165 DEFUN ("command-remapping", Fcommand_remapping, Scommand_remapping, 1, 3, 0,
1166 doc: /* Return the remapping for command COMMAND.
1167 Returns nil if COMMAND is not remapped (or not a symbol).
1169 If the optional argument POSITION is non-nil, it specifies a mouse
1170 position as returned by `event-start' and `event-end', and the
1171 remapping occurs in the keymaps associated with it. It can also be a
1172 number or marker, in which case the keymap properties at the specified
1173 buffer position instead of point are used. The KEYMAPS argument is
1174 ignored if POSITION is non-nil.
1176 If the optional argument KEYMAPS is non-nil, it should be a list of
1177 keymaps to search for command remapping. Otherwise, search for the
1178 remapping in all currently active keymaps. */)
1179 (Lisp_Object command, Lisp_Object position, Lisp_Object keymaps)
1181 if (!SYMBOLP (command))
1182 return Qnil;
1184 ASET (command_remapping_vector, 1, command);
1186 if (NILP (keymaps))
1187 command = Fkey_binding (command_remapping_vector, Qnil, Qt, position);
1188 else
1189 command = Flookup_key (Fcons (Qkeymap, keymaps),
1190 command_remapping_vector, Qnil);
1191 return INTEGERP (command) ? Qnil : command;
1194 /* Value is number if KEY is too long; nil if valid but has no definition. */
1195 /* GC is possible in this function. */
1197 DEFUN ("lookup-key", Flookup_key, Slookup_key, 2, 3, 0,
1198 doc: /* In keymap KEYMAP, look up key sequence KEY. Return the definition.
1199 A value of nil means undefined. See doc of `define-key'
1200 for kinds of definitions.
1202 A number as value means KEY is "too long";
1203 that is, characters or symbols in it except for the last one
1204 fail to be a valid sequence of prefix characters in KEYMAP.
1205 The number is how many characters at the front of KEY
1206 it takes to reach a non-prefix key.
1208 Normally, `lookup-key' ignores bindings for t, which act as default
1209 bindings, used when nothing else in the keymap applies; this makes it
1210 usable as a general function for probing keymaps. However, if the
1211 third optional argument ACCEPT-DEFAULT is non-nil, `lookup-key' will
1212 recognize the default bindings, just as `read-key-sequence' does. */)
1213 (Lisp_Object keymap, Lisp_Object key, Lisp_Object accept_default)
1215 ptrdiff_t idx;
1216 Lisp_Object cmd;
1217 Lisp_Object c;
1218 ptrdiff_t length;
1219 bool t_ok = !NILP (accept_default);
1221 keymap = get_keymap (keymap, 1, 1);
1223 length = CHECK_VECTOR_OR_STRING (key);
1224 if (length == 0)
1225 return keymap;
1227 idx = 0;
1228 while (1)
1230 c = Faref (key, make_number (idx++));
1232 if (CONSP (c) && lucid_event_type_list_p (c))
1233 c = Fevent_convert_list (c);
1235 /* Turn the 8th bit of string chars into a meta modifier. */
1236 if (STRINGP (key) && XINT (c) & 0x80 && !STRING_MULTIBYTE (key))
1237 XSETINT (c, (XINT (c) | meta_modifier) & ~0x80);
1239 /* Allow string since binding for `menu-bar-select-buffer'
1240 includes the buffer name in the key sequence. */
1241 if (!INTEGERP (c) && !SYMBOLP (c) && !CONSP (c) && !STRINGP (c))
1242 message_with_string ("Key sequence contains invalid event %s", c, 1);
1244 cmd = access_keymap (keymap, c, t_ok, 0, 1);
1245 if (idx == length)
1246 return cmd;
1248 keymap = get_keymap (cmd, 0, 1);
1249 if (!CONSP (keymap))
1250 return make_number (idx);
1252 QUIT;
1256 /* Make KEYMAP define event C as a keymap (i.e., as a prefix).
1257 Assume that currently it does not define C at all.
1258 Return the keymap. */
1260 static Lisp_Object
1261 define_as_prefix (Lisp_Object keymap, Lisp_Object c)
1263 Lisp_Object cmd;
1265 cmd = Fmake_sparse_keymap (Qnil);
1266 store_in_keymap (keymap, c, cmd);
1268 return cmd;
1271 /* Append a key to the end of a key sequence. We always make a vector. */
1273 static Lisp_Object
1274 append_key (Lisp_Object key_sequence, Lisp_Object key)
1276 AUTO_LIST1 (key_list, key);
1277 return CALLN (Fvconcat, key_sequence, key_list);
1280 /* Given a event type C which is a symbol,
1281 signal an error if is a mistake such as RET or M-RET or C-DEL, etc. */
1283 static void
1284 silly_event_symbol_error (Lisp_Object c)
1286 Lisp_Object parsed, base, name, assoc;
1287 int modifiers;
1289 parsed = parse_modifiers (c);
1290 modifiers = XFASTINT (XCAR (XCDR (parsed)));
1291 base = XCAR (parsed);
1292 name = Fsymbol_name (base);
1293 /* This alist includes elements such as ("RET" . "\\r"). */
1294 assoc = Fassoc (name, exclude_keys);
1296 if (! NILP (assoc))
1298 char new_mods[sizeof ("\\A-\\C-\\H-\\M-\\S-\\s-")];
1299 char *p = new_mods;
1300 Lisp_Object keystring;
1301 if (modifiers & alt_modifier)
1302 { *p++ = '\\'; *p++ = 'A'; *p++ = '-'; }
1303 if (modifiers & ctrl_modifier)
1304 { *p++ = '\\'; *p++ = 'C'; *p++ = '-'; }
1305 if (modifiers & hyper_modifier)
1306 { *p++ = '\\'; *p++ = 'H'; *p++ = '-'; }
1307 if (modifiers & meta_modifier)
1308 { *p++ = '\\'; *p++ = 'M'; *p++ = '-'; }
1309 if (modifiers & shift_modifier)
1310 { *p++ = '\\'; *p++ = 'S'; *p++ = '-'; }
1311 if (modifiers & super_modifier)
1312 { *p++ = '\\'; *p++ = 's'; *p++ = '-'; }
1313 *p = 0;
1315 c = reorder_modifiers (c);
1316 AUTO_STRING_WITH_LEN (new_mods_string, new_mods, p - new_mods);
1317 keystring = concat2 (new_mods_string, XCDR (assoc));
1319 error ("To bind the key %s, use [?%s], not [%s]",
1320 SDATA (SYMBOL_NAME (c)), SDATA (keystring),
1321 SDATA (SYMBOL_NAME (c)));
1325 /* Global, local, and minor mode keymap stuff. */
1327 /* We can't put these variables inside current_minor_maps, since under
1328 some systems, static gets macro-defined to be the empty string.
1329 Ickypoo. */
1330 static Lisp_Object *cmm_modes = NULL, *cmm_maps = NULL;
1331 static ptrdiff_t cmm_size = 0;
1333 /* Store a pointer to an array of the currently active minor modes in
1334 *modeptr, a pointer to an array of the keymaps of the currently
1335 active minor modes in *mapptr, and return the number of maps
1336 *mapptr contains.
1338 This function always returns a pointer to the same buffer, and may
1339 free or reallocate it, so if you want to keep it for a long time or
1340 hand it out to lisp code, copy it. This procedure will be called
1341 for every key sequence read, so the nice lispy approach (return a
1342 new assoclist, list, what have you) for each invocation would
1343 result in a lot of consing over time.
1345 If we used xrealloc/xmalloc and ran out of memory, they would throw
1346 back to the command loop, which would try to read a key sequence,
1347 which would call this function again, resulting in an infinite
1348 loop. Instead, we'll use realloc/malloc and silently truncate the
1349 list, let the key sequence be read, and hope some other piece of
1350 code signals the error. */
1351 ptrdiff_t
1352 current_minor_maps (Lisp_Object **modeptr, Lisp_Object **mapptr)
1354 ptrdiff_t i = 0;
1355 int list_number = 0;
1356 Lisp_Object alist, assoc, var, val;
1357 Lisp_Object emulation_alists;
1358 Lisp_Object lists[2];
1360 emulation_alists = Vemulation_mode_map_alists;
1361 lists[0] = Vminor_mode_overriding_map_alist;
1362 lists[1] = Vminor_mode_map_alist;
1364 for (list_number = 0; list_number < 2; list_number++)
1366 if (CONSP (emulation_alists))
1368 alist = XCAR (emulation_alists);
1369 emulation_alists = XCDR (emulation_alists);
1370 if (SYMBOLP (alist))
1371 alist = find_symbol_value (alist);
1372 list_number = -1;
1374 else
1375 alist = lists[list_number];
1377 for ( ; CONSP (alist); alist = XCDR (alist))
1378 if ((assoc = XCAR (alist), CONSP (assoc))
1379 && (var = XCAR (assoc), SYMBOLP (var))
1380 && (val = find_symbol_value (var), !EQ (val, Qunbound))
1381 && !NILP (val))
1383 Lisp_Object temp;
1385 /* If a variable has an entry in Vminor_mode_overriding_map_alist,
1386 and also an entry in Vminor_mode_map_alist,
1387 ignore the latter. */
1388 if (list_number == 1)
1390 val = assq_no_quit (var, lists[0]);
1391 if (!NILP (val))
1392 continue;
1395 if (i >= cmm_size)
1397 ptrdiff_t newsize, allocsize;
1398 Lisp_Object *newmodes, *newmaps;
1400 /* Check for size calculation overflow. Other code
1401 (e.g., read_key_sequence) adds 3 to the count
1402 later, so subtract 3 from the limit here. */
1403 if (min (PTRDIFF_MAX, SIZE_MAX) / (2 * sizeof *newmodes) - 3
1404 < cmm_size)
1405 break;
1407 newsize = cmm_size == 0 ? 30 : cmm_size * 2;
1408 allocsize = newsize * sizeof *newmodes;
1410 /* Use malloc here. See the comment above this function.
1411 Avoid realloc here; it causes spurious traps on GNU/Linux [KFS] */
1412 block_input ();
1413 newmodes = malloc (allocsize);
1414 if (newmodes)
1416 if (cmm_modes)
1418 memcpy (newmodes, cmm_modes,
1419 cmm_size * sizeof cmm_modes[0]);
1420 free (cmm_modes);
1422 cmm_modes = newmodes;
1425 newmaps = malloc (allocsize);
1426 if (newmaps)
1428 if (cmm_maps)
1430 memcpy (newmaps, cmm_maps,
1431 cmm_size * sizeof cmm_maps[0]);
1432 free (cmm_maps);
1434 cmm_maps = newmaps;
1436 unblock_input ();
1438 if (newmodes == NULL || newmaps == NULL)
1439 break;
1440 cmm_size = newsize;
1443 /* Get the keymap definition--or nil if it is not defined. */
1444 temp = Findirect_function (XCDR (assoc), Qt);
1445 if (!NILP (temp))
1447 cmm_modes[i] = var;
1448 cmm_maps [i] = temp;
1449 i++;
1454 if (modeptr) *modeptr = cmm_modes;
1455 if (mapptr) *mapptr = cmm_maps;
1456 return i;
1459 /* Return the offset of POSITION, a click position, in the style of
1460 the respective argument of Fkey_binding. */
1461 static ptrdiff_t
1462 click_position (Lisp_Object position)
1464 EMACS_INT pos = (INTEGERP (position) ? XINT (position)
1465 : MARKERP (position) ? marker_position (position)
1466 : PT);
1467 if (! (BEGV <= pos && pos <= ZV))
1468 args_out_of_range (Fcurrent_buffer (), position);
1469 return pos;
1472 DEFUN ("current-active-maps", Fcurrent_active_maps, Scurrent_active_maps,
1473 0, 2, 0,
1474 doc: /* Return a list of the currently active keymaps.
1475 OLP if non-nil indicates that we should obey `overriding-local-map' and
1476 `overriding-terminal-local-map'. POSITION can specify a click position
1477 like in the respective argument of `key-binding'. */)
1478 (Lisp_Object olp, Lisp_Object position)
1480 ptrdiff_t count = SPECPDL_INDEX ();
1482 Lisp_Object keymaps = list1 (current_global_map);
1484 /* If a mouse click position is given, our variables are based on
1485 the buffer clicked on, not the current buffer. So we may have to
1486 switch the buffer here. */
1488 if (CONSP (position))
1490 Lisp_Object window;
1492 window = POSN_WINDOW (position);
1494 if (WINDOWP (window)
1495 && BUFFERP (XWINDOW (window)->contents)
1496 && XBUFFER (XWINDOW (window)->contents) != current_buffer)
1498 /* Arrange to go back to the original buffer once we're done
1499 processing the key sequence. We don't use
1500 save_excursion_{save,restore} here, in analogy to
1501 `read-key-sequence' to avoid saving point. Maybe this
1502 would not be a problem here, but it is easier to keep
1503 things the same.
1505 record_unwind_current_buffer ();
1506 set_buffer_internal (XBUFFER (XWINDOW (window)->contents));
1510 if (!NILP (olp)
1511 /* The doc said that overriding-terminal-local-map should
1512 override overriding-local-map. The code used them both,
1513 but it seems clearer to use just one. rms, jan 2005. */
1514 && NILP (KVAR (current_kboard, Voverriding_terminal_local_map))
1515 && !NILP (Voverriding_local_map))
1516 keymaps = Fcons (Voverriding_local_map, keymaps);
1518 if (NILP (XCDR (keymaps)))
1520 Lisp_Object *maps;
1521 int nmaps, i;
1522 ptrdiff_t pt = click_position (position);
1523 /* This usually returns the buffer's local map,
1524 but that can be overridden by a `local-map' property. */
1525 Lisp_Object local_map = get_local_map (pt, current_buffer, Qlocal_map);
1526 /* This returns nil unless there is a `keymap' property. */
1527 Lisp_Object keymap = get_local_map (pt, current_buffer, Qkeymap);
1528 Lisp_Object otlp = KVAR (current_kboard, Voverriding_terminal_local_map);
1530 if (CONSP (position))
1532 Lisp_Object string = POSN_STRING (position);
1534 /* For a mouse click, get the local text-property keymap
1535 of the place clicked on, rather than point. */
1537 if (POSN_INBUFFER_P (position))
1539 Lisp_Object pos;
1541 pos = POSN_BUFFER_POSN (position);
1542 if (INTEGERP (pos)
1543 && XINT (pos) >= BEG && XINT (pos) <= Z)
1545 local_map = get_local_map (XINT (pos),
1546 current_buffer, Qlocal_map);
1548 keymap = get_local_map (XINT (pos),
1549 current_buffer, Qkeymap);
1553 /* If on a mode line string with a local keymap,
1554 or for a click on a string, i.e. overlay string or a
1555 string displayed via the `display' property,
1556 consider `local-map' and `keymap' properties of
1557 that string. */
1559 if (CONSP (string) && STRINGP (XCAR (string)))
1561 Lisp_Object pos, map;
1563 pos = XCDR (string);
1564 string = XCAR (string);
1565 if (INTEGERP (pos)
1566 && XINT (pos) >= 0
1567 && XINT (pos) < SCHARS (string))
1569 map = Fget_text_property (pos, Qlocal_map, string);
1570 if (!NILP (map))
1571 local_map = map;
1573 map = Fget_text_property (pos, Qkeymap, string);
1574 if (!NILP (map))
1575 keymap = map;
1581 if (!NILP (local_map))
1582 keymaps = Fcons (local_map, keymaps);
1584 /* Now put all the minor mode keymaps on the list. */
1585 nmaps = current_minor_maps (0, &maps);
1587 for (i = --nmaps; i >= 0; i--)
1588 if (!NILP (maps[i]))
1589 keymaps = Fcons (maps[i], keymaps);
1591 if (!NILP (keymap))
1592 keymaps = Fcons (keymap, keymaps);
1594 if (!NILP (olp) && !NILP (otlp))
1595 keymaps = Fcons (otlp, keymaps);
1598 unbind_to (count, Qnil);
1600 return keymaps;
1603 /* GC is possible in this function if it autoloads a keymap. */
1605 DEFUN ("key-binding", Fkey_binding, Skey_binding, 1, 4, 0,
1606 doc: /* Return the binding for command KEY in current keymaps.
1607 KEY is a string or vector, a sequence of keystrokes.
1608 The binding is probably a symbol with a function definition.
1610 Normally, `key-binding' ignores bindings for t, which act as default
1611 bindings, used when nothing else in the keymap applies; this makes it
1612 usable as a general function for probing keymaps. However, if the
1613 optional second argument ACCEPT-DEFAULT is non-nil, `key-binding' does
1614 recognize the default bindings, just as `read-key-sequence' does.
1616 Like the normal command loop, `key-binding' will remap the command
1617 resulting from looking up KEY by looking up the command in the
1618 current keymaps. However, if the optional third argument NO-REMAP
1619 is non-nil, `key-binding' returns the unmapped command.
1621 If KEY is a key sequence initiated with the mouse, the used keymaps
1622 will depend on the clicked mouse position with regard to the buffer
1623 and possible local keymaps on strings.
1625 If the optional argument POSITION is non-nil, it specifies a mouse
1626 position as returned by `event-start' and `event-end', and the lookup
1627 occurs in the keymaps associated with it instead of KEY. It can also
1628 be a number or marker, in which case the keymap properties at the
1629 specified buffer position instead of point are used.
1631 (Lisp_Object key, Lisp_Object accept_default, Lisp_Object no_remap, Lisp_Object position)
1633 Lisp_Object value;
1635 if (NILP (position) && VECTORP (key))
1637 Lisp_Object event;
1639 if (ASIZE (key) == 0)
1640 return Qnil;
1642 /* mouse events may have a symbolic prefix indicating the
1643 scrollbar or mode line */
1644 event = AREF (key, SYMBOLP (AREF (key, 0)) && ASIZE (key) > 1 ? 1 : 0);
1646 /* We are not interested in locations without event data */
1648 if (EVENT_HAS_PARAMETERS (event) && CONSP (XCDR (event)))
1650 Lisp_Object kind = EVENT_HEAD_KIND (EVENT_HEAD (event));
1651 if (EQ (kind, Qmouse_click))
1652 position = EVENT_START (event);
1656 value = Flookup_key (Fcons (Qkeymap, Fcurrent_active_maps (Qt, position)),
1657 key, accept_default);
1659 if (NILP (value) || INTEGERP (value))
1660 return Qnil;
1662 /* If the result of the ordinary keymap lookup is an interactive
1663 command, look for a key binding (ie. remapping) for that command. */
1665 if (NILP (no_remap) && SYMBOLP (value))
1667 Lisp_Object value1;
1668 if (value1 = Fcommand_remapping (value, position, Qnil), !NILP (value1))
1669 value = value1;
1672 return value;
1675 /* GC is possible in this function if it autoloads a keymap. */
1677 DEFUN ("local-key-binding", Flocal_key_binding, Slocal_key_binding, 1, 2, 0,
1678 doc: /* Return the binding for command KEYS in current local keymap only.
1679 KEYS is a string or vector, a sequence of keystrokes.
1680 The binding is probably a symbol with a function definition.
1682 If optional argument ACCEPT-DEFAULT is non-nil, recognize default
1683 bindings; see the description of `lookup-key' for more details about this. */)
1684 (Lisp_Object keys, Lisp_Object accept_default)
1686 register Lisp_Object map;
1687 map = BVAR (current_buffer, keymap);
1688 if (NILP (map))
1689 return Qnil;
1690 return Flookup_key (map, keys, accept_default);
1693 /* GC is possible in this function if it autoloads a keymap. */
1695 DEFUN ("global-key-binding", Fglobal_key_binding, Sglobal_key_binding, 1, 2, 0,
1696 doc: /* Return the binding for command KEYS in current global keymap only.
1697 KEYS is a string or vector, a sequence of keystrokes.
1698 The binding is probably a symbol with a function definition.
1699 This function's return values are the same as those of `lookup-key'
1700 \(which see).
1702 If optional argument ACCEPT-DEFAULT is non-nil, recognize default
1703 bindings; see the description of `lookup-key' for more details about this. */)
1704 (Lisp_Object keys, Lisp_Object accept_default)
1706 return Flookup_key (current_global_map, keys, accept_default);
1709 /* GC is possible in this function if it autoloads a keymap. */
1711 DEFUN ("minor-mode-key-binding", Fminor_mode_key_binding, Sminor_mode_key_binding, 1, 2, 0,
1712 doc: /* Find the visible minor mode bindings of KEY.
1713 Return an alist of pairs (MODENAME . BINDING), where MODENAME is
1714 the symbol which names the minor mode binding KEY, and BINDING is
1715 KEY's definition in that mode. In particular, if KEY has no
1716 minor-mode bindings, return nil. If the first binding is a
1717 non-prefix, all subsequent bindings will be omitted, since they would
1718 be ignored. Similarly, the list doesn't include non-prefix bindings
1719 that come after prefix bindings.
1721 If optional argument ACCEPT-DEFAULT is non-nil, recognize default
1722 bindings; see the description of `lookup-key' for more details about this. */)
1723 (Lisp_Object key, Lisp_Object accept_default)
1725 Lisp_Object *modes, *maps;
1726 int nmaps;
1727 Lisp_Object binding;
1728 int i, j;
1730 nmaps = current_minor_maps (&modes, &maps);
1732 binding = Qnil;
1734 for (i = j = 0; i < nmaps; i++)
1735 if (!NILP (maps[i])
1736 && !NILP (binding = Flookup_key (maps[i], key, accept_default))
1737 && !INTEGERP (binding))
1739 if (KEYMAPP (binding))
1740 maps[j++] = Fcons (modes[i], binding);
1741 else if (j == 0)
1742 return list1 (Fcons (modes[i], binding));
1745 return Flist (j, maps);
1748 DEFUN ("define-prefix-command", Fdefine_prefix_command, Sdefine_prefix_command, 1, 3, 0,
1749 doc: /* Define COMMAND as a prefix command. COMMAND should be a symbol.
1750 A new sparse keymap is stored as COMMAND's function definition and its
1751 value.
1752 This prepares COMMAND for use as a prefix key's binding.
1753 If a second optional argument MAPVAR is given, it should be a symbol.
1754 The map is then stored as MAPVAR's value instead of as COMMAND's
1755 value; but COMMAND is still defined as a function.
1756 The third optional argument NAME, if given, supplies a menu name
1757 string for the map. This is required to use the keymap as a menu.
1758 This function returns COMMAND. */)
1759 (Lisp_Object command, Lisp_Object mapvar, Lisp_Object name)
1761 Lisp_Object map;
1762 map = Fmake_sparse_keymap (name);
1763 Ffset (command, map);
1764 if (!NILP (mapvar))
1765 Fset (mapvar, map);
1766 else
1767 Fset (command, map);
1768 return command;
1771 DEFUN ("use-global-map", Fuse_global_map, Suse_global_map, 1, 1, 0,
1772 doc: /* Select KEYMAP as the global keymap. */)
1773 (Lisp_Object keymap)
1775 keymap = get_keymap (keymap, 1, 1);
1776 current_global_map = keymap;
1778 return Qnil;
1781 DEFUN ("use-local-map", Fuse_local_map, Suse_local_map, 1, 1, 0,
1782 doc: /* Select KEYMAP as the local keymap.
1783 If KEYMAP is nil, that means no local keymap. */)
1784 (Lisp_Object keymap)
1786 if (!NILP (keymap))
1787 keymap = get_keymap (keymap, 1, 1);
1789 bset_keymap (current_buffer, keymap);
1791 return Qnil;
1794 DEFUN ("current-local-map", Fcurrent_local_map, Scurrent_local_map, 0, 0, 0,
1795 doc: /* Return current buffer's local keymap, or nil if it has none.
1796 Normally the local keymap is set by the major mode with `use-local-map'. */)
1797 (void)
1799 return BVAR (current_buffer, keymap);
1802 DEFUN ("current-global-map", Fcurrent_global_map, Scurrent_global_map, 0, 0, 0,
1803 doc: /* Return the current global keymap. */)
1804 (void)
1806 return current_global_map;
1809 DEFUN ("current-minor-mode-maps", Fcurrent_minor_mode_maps, Scurrent_minor_mode_maps, 0, 0, 0,
1810 doc: /* Return a list of keymaps for the minor modes of the current buffer. */)
1811 (void)
1813 Lisp_Object *maps;
1814 int nmaps = current_minor_maps (0, &maps);
1816 return Flist (nmaps, maps);
1819 /* Help functions for describing and documenting keymaps. */
1821 struct accessible_keymaps_data {
1822 Lisp_Object maps, tail, thisseq;
1823 /* Does the current sequence end in the meta-prefix-char? */
1824 bool is_metized;
1827 static void
1828 accessible_keymaps_1 (Lisp_Object key, Lisp_Object cmd, Lisp_Object args, void *data)
1829 /* Use void * data to be compatible with map_keymap_function_t. */
1831 struct accessible_keymaps_data *d = data; /* Cast! */
1832 Lisp_Object maps = d->maps;
1833 Lisp_Object tail = d->tail;
1834 Lisp_Object thisseq = d->thisseq;
1835 bool is_metized = d->is_metized && INTEGERP (key);
1836 Lisp_Object tem;
1838 cmd = get_keymap (get_keyelt (cmd, 0), 0, 0);
1839 if (NILP (cmd))
1840 return;
1842 /* Look for and break cycles. */
1843 while (!NILP (tem = Frassq (cmd, maps)))
1845 Lisp_Object prefix = XCAR (tem);
1846 ptrdiff_t lim = XINT (Flength (XCAR (tem)));
1847 if (lim <= XINT (Flength (thisseq)))
1848 { /* This keymap was already seen with a smaller prefix. */
1849 ptrdiff_t i = 0;
1850 while (i < lim && EQ (Faref (prefix, make_number (i)),
1851 Faref (thisseq, make_number (i))))
1852 i++;
1853 if (i >= lim)
1854 /* `prefix' is a prefix of `thisseq' => there's a cycle. */
1855 return;
1857 /* This occurrence of `cmd' in `maps' does not correspond to a cycle,
1858 but maybe `cmd' occurs again further down in `maps', so keep
1859 looking. */
1860 maps = XCDR (Fmemq (tem, maps));
1863 /* If the last key in thisseq is meta-prefix-char,
1864 turn it into a meta-ized keystroke. We know
1865 that the event we're about to append is an
1866 ascii keystroke since we're processing a
1867 keymap table. */
1868 if (is_metized)
1870 int meta_bit = meta_modifier;
1871 Lisp_Object last = make_number (XINT (Flength (thisseq)) - 1);
1872 tem = Fcopy_sequence (thisseq);
1874 Faset (tem, last, make_number (XINT (key) | meta_bit));
1876 /* This new sequence is the same length as
1877 thisseq, so stick it in the list right
1878 after this one. */
1879 XSETCDR (tail,
1880 Fcons (Fcons (tem, cmd), XCDR (tail)));
1882 else
1884 tem = append_key (thisseq, key);
1885 nconc2 (tail, list1 (Fcons (tem, cmd)));
1889 /* This function cannot GC. */
1891 DEFUN ("accessible-keymaps", Faccessible_keymaps, Saccessible_keymaps,
1892 1, 2, 0,
1893 doc: /* Find all keymaps accessible via prefix characters from KEYMAP.
1894 Returns a list of elements of the form (KEYS . MAP), where the sequence
1895 KEYS starting from KEYMAP gets you to MAP. These elements are ordered
1896 so that the KEYS increase in length. The first element is ([] . KEYMAP).
1897 An optional argument PREFIX, if non-nil, should be a key sequence;
1898 then the value includes only maps for prefixes that start with PREFIX. */)
1899 (Lisp_Object keymap, Lisp_Object prefix)
1901 Lisp_Object maps, tail;
1902 EMACS_INT prefixlen = XFASTINT (Flength (prefix));
1904 if (!NILP (prefix))
1906 /* If a prefix was specified, start with the keymap (if any) for
1907 that prefix, so we don't waste time considering other prefixes. */
1908 Lisp_Object tem;
1909 tem = Flookup_key (keymap, prefix, Qt);
1910 /* Flookup_key may give us nil, or a number,
1911 if the prefix is not defined in this particular map.
1912 It might even give us a list that isn't a keymap. */
1913 tem = get_keymap (tem, 0, 0);
1914 /* If the keymap is autoloaded `tem' is not a cons-cell, but we still
1915 want to return it. */
1916 if (!NILP (tem))
1918 /* Convert PREFIX to a vector now, so that later on
1919 we don't have to deal with the possibility of a string. */
1920 if (STRINGP (prefix))
1922 int i, i_byte, c;
1923 Lisp_Object copy;
1925 copy = Fmake_vector (make_number (SCHARS (prefix)), Qnil);
1926 for (i = 0, i_byte = 0; i < SCHARS (prefix);)
1928 int i_before = i;
1930 FETCH_STRING_CHAR_ADVANCE (c, prefix, i, i_byte);
1931 if (SINGLE_BYTE_CHAR_P (c) && (c & 0200))
1932 c ^= 0200 | meta_modifier;
1933 ASET (copy, i_before, make_number (c));
1935 prefix = copy;
1937 maps = list1 (Fcons (prefix, tem));
1939 else
1940 return Qnil;
1942 else
1943 maps = list1 (Fcons (zero_vector, get_keymap (keymap, 1, 0)));
1945 /* For each map in the list maps,
1946 look at any other maps it points to,
1947 and stick them at the end if they are not already in the list.
1949 This is a breadth-first traversal, where tail is the queue of
1950 nodes, and maps accumulates a list of all nodes visited. */
1952 for (tail = maps; CONSP (tail); tail = XCDR (tail))
1954 struct accessible_keymaps_data data;
1955 register Lisp_Object thismap = Fcdr (XCAR (tail));
1956 Lisp_Object last;
1958 data.thisseq = Fcar (XCAR (tail));
1959 data.maps = maps;
1960 data.tail = tail;
1961 last = make_number (XINT (Flength (data.thisseq)) - 1);
1962 /* Does the current sequence end in the meta-prefix-char? */
1963 data.is_metized = (XINT (last) >= 0
1964 /* Don't metize the last char of PREFIX. */
1965 && XINT (last) >= prefixlen
1966 && EQ (Faref (data.thisseq, last), meta_prefix_char));
1968 /* Since we can't run lisp code, we can't scan autoloaded maps. */
1969 if (CONSP (thismap))
1970 map_keymap (thismap, accessible_keymaps_1, Qnil, &data, 0);
1972 return maps;
1975 /* This function cannot GC. */
1977 DEFUN ("key-description", Fkey_description, Skey_description, 1, 2, 0,
1978 doc: /* Return a pretty description of key-sequence KEYS.
1979 Optional arg PREFIX is the sequence of keys leading up to KEYS.
1980 For example, [?\C-x ?l] is converted into the string \"C-x l\".
1982 For an approximate inverse of this, see `kbd'. */)
1983 (Lisp_Object keys, Lisp_Object prefix)
1985 ptrdiff_t len = 0;
1986 EMACS_INT i;
1987 ptrdiff_t i_byte;
1988 Lisp_Object *args;
1989 EMACS_INT size = XINT (Flength (keys));
1990 Lisp_Object list;
1991 Lisp_Object sep = build_string (" ");
1992 Lisp_Object key;
1993 Lisp_Object result;
1994 bool add_meta = 0;
1995 USE_SAFE_ALLOCA;
1997 if (!NILP (prefix))
1998 size += XINT (Flength (prefix));
2000 /* This has one extra element at the end that we don't pass to Fconcat. */
2001 EMACS_INT size4;
2002 if (INT_MULTIPLY_WRAPV (size, 4, &size4))
2003 memory_full (SIZE_MAX);
2004 SAFE_ALLOCA_LISP (args, size4);
2006 /* In effect, this computes
2007 (mapconcat 'single-key-description keys " ")
2008 but we shouldn't use mapconcat because it can do GC. */
2010 next_list:
2011 if (!NILP (prefix))
2012 list = prefix, prefix = Qnil;
2013 else if (!NILP (keys))
2014 list = keys, keys = Qnil;
2015 else
2017 if (add_meta)
2019 args[len] = Fsingle_key_description (meta_prefix_char, Qnil);
2020 result = Fconcat (len + 1, args);
2022 else if (len == 0)
2023 result = empty_unibyte_string;
2024 else
2025 result = Fconcat (len - 1, args);
2026 SAFE_FREE ();
2027 return result;
2030 if (STRINGP (list))
2031 size = SCHARS (list);
2032 else if (VECTORP (list))
2033 size = ASIZE (list);
2034 else if (CONSP (list))
2035 size = XINT (Flength (list));
2036 else
2037 wrong_type_argument (Qarrayp, list);
2039 i = i_byte = 0;
2041 while (i < size)
2043 if (STRINGP (list))
2045 int c;
2046 FETCH_STRING_CHAR_ADVANCE (c, list, i, i_byte);
2047 if (SINGLE_BYTE_CHAR_P (c) && (c & 0200))
2048 c ^= 0200 | meta_modifier;
2049 XSETFASTINT (key, c);
2051 else if (VECTORP (list))
2053 key = AREF (list, i); i++;
2055 else
2057 key = XCAR (list);
2058 list = XCDR (list);
2059 i++;
2062 if (add_meta)
2064 if (!INTEGERP (key)
2065 || EQ (key, meta_prefix_char)
2066 || (XINT (key) & meta_modifier))
2068 args[len++] = Fsingle_key_description (meta_prefix_char, Qnil);
2069 args[len++] = sep;
2070 if (EQ (key, meta_prefix_char))
2071 continue;
2073 else
2074 XSETINT (key, XINT (key) | meta_modifier);
2075 add_meta = 0;
2077 else if (EQ (key, meta_prefix_char))
2079 add_meta = 1;
2080 continue;
2082 args[len++] = Fsingle_key_description (key, Qnil);
2083 args[len++] = sep;
2085 goto next_list;
2089 char *
2090 push_key_description (EMACS_INT ch, char *p)
2092 int c, c2;
2093 bool tab_as_ci;
2095 /* Clear all the meaningless bits above the meta bit. */
2096 c = ch & (meta_modifier | ~ - meta_modifier);
2097 c2 = c & ~(alt_modifier | ctrl_modifier | hyper_modifier
2098 | meta_modifier | shift_modifier | super_modifier);
2100 if (! CHARACTERP (make_number (c2)))
2102 /* KEY_DESCRIPTION_SIZE is large enough for this. */
2103 p += sprintf (p, "[%d]", c);
2104 return p;
2107 tab_as_ci = (c2 == '\t' && (c & meta_modifier));
2109 if (c & alt_modifier)
2111 *p++ = 'A';
2112 *p++ = '-';
2113 c -= alt_modifier;
2115 if ((c & ctrl_modifier) != 0
2116 || (c2 < ' ' && c2 != 27 && c2 != '\t' && c2 != Ctl ('M'))
2117 || tab_as_ci)
2119 *p++ = 'C';
2120 *p++ = '-';
2121 c &= ~ctrl_modifier;
2123 if (c & hyper_modifier)
2125 *p++ = 'H';
2126 *p++ = '-';
2127 c -= hyper_modifier;
2129 if (c & meta_modifier)
2131 *p++ = 'M';
2132 *p++ = '-';
2133 c -= meta_modifier;
2135 if (c & shift_modifier)
2137 *p++ = 'S';
2138 *p++ = '-';
2139 c -= shift_modifier;
2141 if (c & super_modifier)
2143 *p++ = 's';
2144 *p++ = '-';
2145 c -= super_modifier;
2147 if (c < 040)
2149 if (c == 033)
2151 *p++ = 'E';
2152 *p++ = 'S';
2153 *p++ = 'C';
2155 else if (tab_as_ci)
2157 *p++ = 'i';
2159 else if (c == '\t')
2161 *p++ = 'T';
2162 *p++ = 'A';
2163 *p++ = 'B';
2165 else if (c == Ctl ('M'))
2167 *p++ = 'R';
2168 *p++ = 'E';
2169 *p++ = 'T';
2171 else
2173 /* `C-' already added above. */
2174 if (c > 0 && c <= Ctl ('Z'))
2175 *p++ = c + 0140;
2176 else
2177 *p++ = c + 0100;
2180 else if (c == 0177)
2182 *p++ = 'D';
2183 *p++ = 'E';
2184 *p++ = 'L';
2186 else if (c == ' ')
2188 *p++ = 'S';
2189 *p++ = 'P';
2190 *p++ = 'C';
2192 else if (c < 128)
2193 *p++ = c;
2194 else
2196 /* Now we are sure that C is a valid character code. */
2197 p += CHAR_STRING (c, (unsigned char *) p);
2200 return p;
2203 /* This function cannot GC. */
2205 DEFUN ("single-key-description", Fsingle_key_description,
2206 Ssingle_key_description, 1, 2, 0,
2207 doc: /* Return a pretty description of command character KEY.
2208 Control characters turn into C-whatever, etc.
2209 Optional argument NO-ANGLES non-nil means don't put angle brackets
2210 around function keys and event symbols. */)
2211 (Lisp_Object key, Lisp_Object no_angles)
2213 USE_SAFE_ALLOCA;
2215 if (CONSP (key) && lucid_event_type_list_p (key))
2216 key = Fevent_convert_list (key);
2218 if (CONSP (key) && INTEGERP (XCAR (key)) && INTEGERP (XCDR (key)))
2219 /* An interval from a map-char-table. */
2221 AUTO_STRING (dot_dot, "..");
2222 return concat3 (Fsingle_key_description (XCAR (key), no_angles),
2223 dot_dot,
2224 Fsingle_key_description (XCDR (key), no_angles));
2227 key = EVENT_HEAD (key);
2229 if (INTEGERP (key)) /* Normal character. */
2231 char tem[KEY_DESCRIPTION_SIZE];
2232 char *p = push_key_description (XINT (key), tem);
2233 *p = 0;
2234 return make_specified_string (tem, -1, p - tem, 1);
2236 else if (SYMBOLP (key)) /* Function key or event-symbol. */
2238 if (NILP (no_angles))
2240 Lisp_Object result;
2241 char *buffer = SAFE_ALLOCA (sizeof "<>"
2242 + SBYTES (SYMBOL_NAME (key)));
2243 esprintf (buffer, "<%s>", SDATA (SYMBOL_NAME (key)));
2244 result = build_string (buffer);
2245 SAFE_FREE ();
2246 return result;
2248 else
2249 return Fsymbol_name (key);
2251 else if (STRINGP (key)) /* Buffer names in the menubar. */
2252 return Fcopy_sequence (key);
2253 else
2254 error ("KEY must be an integer, cons, symbol, or string");
2257 static char *
2258 push_text_char_description (register unsigned int c, register char *p)
2260 if (c >= 0200)
2262 *p++ = 'M';
2263 *p++ = '-';
2264 c -= 0200;
2266 if (c < 040)
2268 *p++ = '^';
2269 *p++ = c + 64; /* 'A' - 1 */
2271 else if (c == 0177)
2273 *p++ = '^';
2274 *p++ = '?';
2276 else
2277 *p++ = c;
2278 return p;
2281 /* This function cannot GC. */
2283 DEFUN ("text-char-description", Ftext_char_description, Stext_char_description, 1, 1, 0,
2284 doc: /* Return a pretty description of file-character CHARACTER.
2285 Control characters turn into "^char", etc. This differs from
2286 `single-key-description' which turns them into "C-char".
2287 Also, this function recognizes the 2**7 bit as the Meta character,
2288 whereas `single-key-description' uses the 2**27 bit for Meta.
2289 See Info node `(elisp)Describing Characters' for examples. */)
2290 (Lisp_Object character)
2292 /* Currently MAX_MULTIBYTE_LENGTH is 4 (< 6). */
2293 char str[6];
2294 int c;
2296 CHECK_CHARACTER (character);
2298 c = XINT (character);
2299 if (!ASCII_CHAR_P (c))
2301 int len = CHAR_STRING (c, (unsigned char *) str);
2303 return make_multibyte_string (str, 1, len);
2306 *push_text_char_description (c & 0377, str) = 0;
2308 return build_string (str);
2311 static int where_is_preferred_modifier;
2313 /* Return 0 if SEQ uses non-preferred modifiers or non-char events.
2314 Else, return 2 if SEQ uses the where_is_preferred_modifier,
2315 and 1 otherwise. */
2316 static int
2317 preferred_sequence_p (Lisp_Object seq)
2319 EMACS_INT i;
2320 EMACS_INT len = XFASTINT (Flength (seq));
2321 int result = 1;
2323 for (i = 0; i < len; i++)
2325 Lisp_Object ii, elt;
2327 XSETFASTINT (ii, i);
2328 elt = Faref (seq, ii);
2330 if (!INTEGERP (elt))
2331 return 0;
2332 else
2334 int modifiers = XINT (elt) & (CHAR_MODIFIER_MASK & ~CHAR_META);
2335 if (modifiers == where_is_preferred_modifier)
2336 result = 2;
2337 else if (modifiers)
2338 return 0;
2342 return result;
2346 /* where-is - finding a command in a set of keymaps. */
2348 static void where_is_internal_1 (Lisp_Object key, Lisp_Object binding,
2349 Lisp_Object args, void *data);
2351 /* Like Flookup_key, but uses a list of keymaps SHADOW instead of a single map.
2352 Returns the first non-nil binding found in any of those maps.
2353 If REMAP is true, pass the result of the lookup through command
2354 remapping before returning it. */
2356 static Lisp_Object
2357 shadow_lookup (Lisp_Object shadow, Lisp_Object key, Lisp_Object flag,
2358 bool remap)
2360 Lisp_Object tail, value;
2362 for (tail = shadow; CONSP (tail); tail = XCDR (tail))
2364 value = Flookup_key (XCAR (tail), key, flag);
2365 if (NATNUMP (value))
2367 value = Flookup_key (XCAR (tail),
2368 Fsubstring (key, make_number (0), value), flag);
2369 if (!NILP (value))
2370 return Qnil;
2372 else if (!NILP (value))
2374 Lisp_Object remapping;
2375 if (remap && SYMBOLP (value)
2376 && (remapping = Fcommand_remapping (value, Qnil, shadow),
2377 !NILP (remapping)))
2378 return remapping;
2379 else
2380 return value;
2383 return Qnil;
2386 static Lisp_Object Vmouse_events;
2388 struct where_is_internal_data {
2389 Lisp_Object definition, this, last;
2390 bool last_is_meta, noindirect;
2391 Lisp_Object sequences;
2394 /* This function can't GC, AFAIK. */
2395 /* Return the list of bindings found. This list is ordered "longest
2396 to shortest". It may include bindings that are actually shadowed
2397 by others, as well as duplicate bindings and remapping bindings.
2398 The list returned is potentially shared with where_is_cache, so
2399 be careful not to modify it via side-effects. */
2401 static Lisp_Object
2402 where_is_internal (Lisp_Object definition, Lisp_Object keymaps,
2403 bool noindirect, bool nomenus)
2405 Lisp_Object maps = Qnil;
2406 Lisp_Object found;
2407 struct where_is_internal_data data;
2409 /* Only important use of caching is for the menubar
2410 (i.e. where-is-internal called with (def nil t nil nil)). */
2411 if (nomenus && !noindirect)
2413 /* Check heuristic-consistency of the cache. */
2414 if (NILP (Fequal (keymaps, where_is_cache_keymaps)))
2415 where_is_cache = Qnil;
2417 if (NILP (where_is_cache))
2419 /* We need to create the cache. */
2420 where_is_cache = Fmake_hash_table (0, NULL);
2421 where_is_cache_keymaps = Qt;
2423 else
2424 /* We can reuse the cache. */
2425 return Fgethash (definition, where_is_cache, Qnil);
2427 else
2428 /* Kill the cache so that where_is_internal_1 doesn't think
2429 we're filling it up. */
2430 where_is_cache = Qnil;
2432 found = keymaps;
2433 while (CONSP (found))
2435 maps =
2436 nconc2 (maps,
2437 Faccessible_keymaps (get_keymap (XCAR (found), 1, 0), Qnil));
2438 found = XCDR (found);
2441 data.sequences = Qnil;
2442 for (; CONSP (maps); maps = XCDR (maps))
2444 /* Key sequence to reach map, and the map that it reaches */
2445 register Lisp_Object this, map, tem;
2447 /* In order to fold [META-PREFIX-CHAR CHAR] sequences into
2448 [M-CHAR] sequences, check if last character of the sequence
2449 is the meta-prefix char. */
2450 Lisp_Object last;
2451 bool last_is_meta;
2453 this = Fcar (XCAR (maps));
2454 map = Fcdr (XCAR (maps));
2455 last = make_number (XINT (Flength (this)) - 1);
2456 last_is_meta = (XINT (last) >= 0
2457 && EQ (Faref (this, last), meta_prefix_char));
2459 /* if (nomenus && !preferred_sequence_p (this)) */
2460 if (nomenus && XINT (last) >= 0
2461 && SYMBOLP (tem = Faref (this, make_number (0)))
2462 && !NILP (Fmemq (XCAR (parse_modifiers (tem)), Vmouse_events)))
2463 /* If no menu entries should be returned, skip over the
2464 keymaps bound to `menu-bar' and `tool-bar' and other
2465 non-ascii prefixes like `C-down-mouse-2'. */
2466 continue;
2468 QUIT;
2470 data.definition = definition;
2471 data.noindirect = noindirect;
2472 data.this = this;
2473 data.last = last;
2474 data.last_is_meta = last_is_meta;
2476 if (CONSP (map))
2477 map_keymap (map, where_is_internal_1, Qnil, &data, 0);
2480 if (nomenus && !noindirect)
2481 { /* Remember for which keymaps this cache was built.
2482 We do it here (late) because we want to keep where_is_cache_keymaps
2483 set to t while the cache isn't fully filled. */
2484 where_is_cache_keymaps = keymaps;
2485 /* During cache-filling, data.sequences is not filled by
2486 where_is_internal_1. */
2487 return Fgethash (definition, where_is_cache, Qnil);
2489 else
2490 return data.sequences;
2493 /* This function can GC if Flookup_key autoloads any keymaps. */
2495 DEFUN ("where-is-internal", Fwhere_is_internal, Swhere_is_internal, 1, 5, 0,
2496 doc: /* Return list of keys that invoke DEFINITION.
2497 If KEYMAP is a keymap, search only KEYMAP and the global keymap.
2498 If KEYMAP is nil, search all the currently active keymaps, except
2499 for `overriding-local-map' (which is ignored).
2500 If KEYMAP is a list of keymaps, search only those keymaps.
2502 If optional 3rd arg FIRSTONLY is non-nil, return the first key sequence found,
2503 rather than a list of all possible key sequences.
2504 If FIRSTONLY is the symbol `non-ascii', return the first binding found,
2505 no matter what it is.
2506 If FIRSTONLY has another non-nil value, prefer bindings
2507 that use the modifier key specified in `where-is-preferred-modifier'
2508 \(or their meta variants) and entirely reject menu bindings.
2510 If optional 4th arg NOINDIRECT is non-nil, don't extract the commands inside
2511 menu-items. This makes it possible to search for a menu-item itself.
2513 The optional 5th arg NO-REMAP alters how command remapping is handled:
2515 - If another command OTHER-COMMAND is remapped to DEFINITION, normally
2516 search for the bindings of OTHER-COMMAND and include them in the
2517 returned list. But if NO-REMAP is non-nil, include the vector
2518 [remap OTHER-COMMAND] in the returned list instead, without
2519 searching for those other bindings.
2521 - If DEFINITION is remapped to OTHER-COMMAND, normally return the
2522 bindings for OTHER-COMMAND. But if NO-REMAP is non-nil, return the
2523 bindings for DEFINITION instead, ignoring its remapping. */)
2524 (Lisp_Object definition, Lisp_Object keymap, Lisp_Object firstonly, Lisp_Object noindirect, Lisp_Object no_remap)
2526 /* The keymaps in which to search. */
2527 Lisp_Object keymaps;
2528 /* Potentially relevant bindings in "shortest to longest" order. */
2529 Lisp_Object sequences = Qnil;
2530 /* Actually relevant bindings. */
2531 Lisp_Object found = Qnil;
2532 /* 1 means ignore all menu bindings entirely. */
2533 bool nomenus = !NILP (firstonly) && !EQ (firstonly, Qnon_ascii);
2534 /* List of sequences found via remapping. Keep them in a separate
2535 variable, so as to push them later, since we prefer
2536 non-remapped binding. */
2537 Lisp_Object remapped_sequences = Qnil;
2538 /* Whether or not we're handling remapped sequences. This is needed
2539 because remapping is not done recursively by Fcommand_remapping: you
2540 can't remap a remapped command. */
2541 bool remapped = 0;
2542 Lisp_Object tem = Qnil;
2544 /* Refresh the C version of the modifier preference. */
2545 where_is_preferred_modifier
2546 = parse_solitary_modifier (Vwhere_is_preferred_modifier);
2548 /* Find the relevant keymaps. */
2549 if (CONSP (keymap) && KEYMAPP (XCAR (keymap)))
2550 keymaps = keymap;
2551 else if (!NILP (keymap))
2552 keymaps = list2 (keymap, current_global_map);
2553 else
2554 keymaps = Fcurrent_active_maps (Qnil, Qnil);
2556 tem = Fcommand_remapping (definition, Qnil, keymaps);
2557 /* If `definition' is remapped to tem', then OT1H no key will run
2558 that command (since they will run `tem' instead), so we should
2559 return nil; but OTOH all keys bound to `definition' (or to `tem')
2560 will run the same command.
2561 So for menu-shortcut purposes, we want to find all the keys bound (maybe
2562 via remapping) to `tem'. But for the purpose of finding the keys that
2563 run `definition', then we'd want to just return nil.
2564 We choose to make it work right for menu-shortcuts, since it's the most
2565 common use.
2566 Known bugs: if you remap switch-to-buffer to toto, C-h f switch-to-buffer
2567 will tell you that switch-to-buffer is bound to C-x b even though C-x b
2568 will run toto instead. And if `toto' is itself remapped to forward-char,
2569 then C-h f toto will tell you that it's bound to C-f even though C-f does
2570 not run toto and it won't tell you that C-x b does run toto. */
2571 if (NILP (no_remap) && !NILP (tem))
2572 definition = tem;
2574 if (SYMBOLP (definition)
2575 && !NILP (firstonly)
2576 && !NILP (tem = Fget (definition, QCadvertised_binding)))
2578 /* We have a list of advertised bindings. */
2579 while (CONSP (tem))
2580 if (EQ (shadow_lookup (keymaps, XCAR (tem), Qnil, 0), definition))
2581 return XCAR (tem);
2582 else
2583 tem = XCDR (tem);
2584 if (EQ (shadow_lookup (keymaps, tem, Qnil, 0), definition))
2585 return tem;
2588 sequences = Freverse (where_is_internal (definition, keymaps,
2589 !NILP (noindirect), nomenus));
2591 while (CONSP (sequences)
2592 /* If we're at the end of the `sequences' list and we haven't
2593 considered remapped sequences yet, copy them over and
2594 process them. */
2595 || (!remapped && (sequences = remapped_sequences,
2596 remapped = 1,
2597 CONSP (sequences))))
2599 Lisp_Object sequence, function;
2601 sequence = XCAR (sequences);
2602 sequences = XCDR (sequences);
2604 /* Verify that this key binding is not shadowed by another
2605 binding for the same key, before we say it exists.
2607 Mechanism: look for local definition of this key and if
2608 it is defined and does not match what we found then
2609 ignore this key.
2611 Either nil or number as value from Flookup_key
2612 means undefined. */
2613 if (NILP (Fequal (shadow_lookup (keymaps, sequence, Qnil, remapped),
2614 definition)))
2615 continue;
2617 /* If the current sequence is a command remapping with
2618 format [remap COMMAND], find the key sequences
2619 which run COMMAND, and use those sequences instead. */
2620 if (NILP (no_remap) && !remapped
2621 && VECTORP (sequence) && ASIZE (sequence) == 2
2622 && EQ (AREF (sequence, 0), Qremap)
2623 && (function = AREF (sequence, 1), SYMBOLP (function)))
2625 Lisp_Object seqs = where_is_internal (function, keymaps,
2626 !NILP (noindirect), nomenus);
2627 remapped_sequences = nconc2 (Freverse (seqs), remapped_sequences);
2628 continue;
2631 /* Don't annoy user with strings from a menu such as the
2632 entries from the "Edit => Paste from Kill Menu".
2633 Change them all to "(any string)", so that there
2634 seems to be only one menu item to report. */
2635 if (! NILP (sequence))
2637 Lisp_Object tem1;
2638 tem1 = Faref (sequence, make_number (ASIZE (sequence) - 1));
2639 if (STRINGP (tem1))
2640 Faset (sequence, make_number (ASIZE (sequence) - 1),
2641 build_string ("(any string)"));
2644 /* It is a true unshadowed match. Record it, unless it's already
2645 been seen (as could happen when inheriting keymaps). */
2646 if (NILP (Fmember (sequence, found)))
2647 found = Fcons (sequence, found);
2649 /* If firstonly is Qnon_ascii, then we can return the first
2650 binding we find. If firstonly is not Qnon_ascii but not
2651 nil, then we should return the first ascii-only binding
2652 we find. */
2653 if (EQ (firstonly, Qnon_ascii))
2654 return sequence;
2655 else if (!NILP (firstonly)
2656 && 2 == preferred_sequence_p (sequence))
2657 return sequence;
2660 found = Fnreverse (found);
2662 /* firstonly may have been t, but we may have gone all the way through
2663 the keymaps without finding an all-ASCII key sequence. So just
2664 return the best we could find. */
2665 if (NILP (firstonly))
2666 return found;
2667 else if (where_is_preferred_modifier == 0)
2668 return Fcar (found);
2669 else
2670 { /* Maybe we did not find a preferred_modifier binding, but we did find
2671 some ASCII binding. */
2672 Lisp_Object bindings = found;
2673 while (CONSP (bindings))
2674 if (preferred_sequence_p (XCAR (bindings)))
2675 return XCAR (bindings);
2676 else
2677 bindings = XCDR (bindings);
2678 return Fcar (found);
2682 /* This function can GC because get_keyelt can. */
2684 static void
2685 where_is_internal_1 (Lisp_Object key, Lisp_Object binding, Lisp_Object args, void *data)
2687 struct where_is_internal_data *d = data; /* Cast! */
2688 Lisp_Object definition = d->definition;
2689 bool noindirect = d->noindirect;
2690 Lisp_Object this = d->this;
2691 Lisp_Object last = d->last;
2692 bool last_is_meta = d->last_is_meta;
2693 Lisp_Object sequence;
2695 /* Search through indirections unless that's not wanted. */
2696 if (!noindirect)
2697 binding = get_keyelt (binding, 0);
2699 /* End this iteration if this element does not match
2700 the target. */
2702 if (!(!NILP (where_is_cache) /* everything "matches" during cache-fill. */
2703 || EQ (binding, definition)
2704 || (CONSP (definition) && !NILP (Fequal (binding, definition)))))
2705 /* Doesn't match. */
2706 return;
2708 /* We have found a match. Construct the key sequence where we found it. */
2709 if (INTEGERP (key) && last_is_meta)
2711 sequence = Fcopy_sequence (this);
2712 Faset (sequence, last, make_number (XINT (key) | meta_modifier));
2714 else
2716 if (CONSP (key))
2717 key = Fcons (XCAR (key), XCDR (key));
2718 sequence = append_key (this, key);
2721 if (!NILP (where_is_cache))
2723 Lisp_Object sequences = Fgethash (binding, where_is_cache, Qnil);
2724 Fputhash (binding, Fcons (sequence, sequences), where_is_cache);
2726 else
2727 d->sequences = Fcons (sequence, d->sequences);
2730 /* describe-bindings - summarizing all the bindings in a set of keymaps. */
2732 DEFUN ("describe-buffer-bindings", Fdescribe_buffer_bindings, Sdescribe_buffer_bindings, 1, 3, 0,
2733 doc: /* Insert the list of all defined keys and their definitions.
2734 The list is inserted in the current buffer, while the bindings are
2735 looked up in BUFFER.
2736 The optional argument PREFIX, if non-nil, should be a key sequence;
2737 then we display only bindings that start with that prefix.
2738 The optional argument MENUS, if non-nil, says to mention menu bindings.
2739 \(Ordinarily these are omitted from the output.) */)
2740 (Lisp_Object buffer, Lisp_Object prefix, Lisp_Object menus)
2742 Lisp_Object outbuf, shadow;
2743 bool nomenu = NILP (menus);
2744 Lisp_Object start1;
2746 const char *alternate_heading
2747 = "\
2748 Keyboard translations:\n\n\
2749 You type Translation\n\
2750 -------- -----------\n";
2752 CHECK_BUFFER (buffer);
2754 shadow = Qnil;
2755 outbuf = Fcurrent_buffer ();
2757 /* Report on alternates for keys. */
2758 if (STRINGP (KVAR (current_kboard, Vkeyboard_translate_table)) && !NILP (prefix))
2760 int c;
2761 const unsigned char *translate = SDATA (KVAR (current_kboard, Vkeyboard_translate_table));
2762 int translate_len = SCHARS (KVAR (current_kboard, Vkeyboard_translate_table));
2764 for (c = 0; c < translate_len; c++)
2765 if (translate[c] != c)
2767 char buf[KEY_DESCRIPTION_SIZE];
2768 char *bufend;
2770 if (alternate_heading)
2772 insert_string (alternate_heading);
2773 alternate_heading = 0;
2776 bufend = push_key_description (translate[c], buf);
2777 insert (buf, bufend - buf);
2778 Findent_to (make_number (16), make_number (1));
2779 bufend = push_key_description (c, buf);
2780 insert (buf, bufend - buf);
2782 insert ("\n", 1);
2784 /* Insert calls signal_after_change which may GC. */
2785 translate = SDATA (KVAR (current_kboard, Vkeyboard_translate_table));
2788 insert ("\n", 1);
2791 if (!NILP (Vkey_translation_map))
2792 describe_map_tree (Vkey_translation_map, 0, Qnil, prefix,
2793 "Key translations", nomenu, 1, 0, 0);
2796 /* Print the (major mode) local map. */
2797 start1 = Qnil;
2798 if (!NILP (KVAR (current_kboard, Voverriding_terminal_local_map)))
2799 start1 = KVAR (current_kboard, Voverriding_terminal_local_map);
2801 if (!NILP (start1))
2803 describe_map_tree (start1, 1, shadow, prefix,
2804 "\f\nOverriding Bindings", nomenu, 0, 0, 0);
2805 shadow = Fcons (start1, shadow);
2806 start1 = Qnil;
2808 else if (!NILP (Voverriding_local_map))
2809 start1 = Voverriding_local_map;
2811 if (!NILP (start1))
2813 describe_map_tree (start1, 1, shadow, prefix,
2814 "\f\nOverriding Bindings", nomenu, 0, 0, 0);
2815 shadow = Fcons (start1, shadow);
2817 else
2819 /* Print the minor mode and major mode keymaps. */
2820 int i, nmaps;
2821 Lisp_Object *modes, *maps;
2823 /* Temporarily switch to `buffer', so that we can get that buffer's
2824 minor modes correctly. */
2825 Fset_buffer (buffer);
2827 nmaps = current_minor_maps (&modes, &maps);
2828 Fset_buffer (outbuf);
2830 start1 = get_local_map (BUF_PT (XBUFFER (buffer)),
2831 XBUFFER (buffer), Qkeymap);
2832 if (!NILP (start1))
2834 describe_map_tree (start1, 1, shadow, prefix,
2835 "\f\n`keymap' Property Bindings", nomenu,
2836 0, 0, 0);
2837 shadow = Fcons (start1, shadow);
2840 /* Print the minor mode maps. */
2841 for (i = 0; i < nmaps; i++)
2843 /* The title for a minor mode keymap
2844 is constructed at run time.
2845 We let describe_map_tree do the actual insertion
2846 because it takes care of other features when doing so. */
2847 char *title, *p;
2849 if (!SYMBOLP (modes[i]))
2850 emacs_abort ();
2852 USE_SAFE_ALLOCA;
2853 p = title = SAFE_ALLOCA (42 + SBYTES (SYMBOL_NAME (modes[i])));
2854 *p++ = '\f';
2855 *p++ = '\n';
2856 *p++ = '`';
2857 memcpy (p, SDATA (SYMBOL_NAME (modes[i])),
2858 SBYTES (SYMBOL_NAME (modes[i])));
2859 p += SBYTES (SYMBOL_NAME (modes[i]));
2860 *p++ = '\'';
2861 memcpy (p, " Minor Mode Bindings", strlen (" Minor Mode Bindings"));
2862 p += strlen (" Minor Mode Bindings");
2863 *p = 0;
2865 describe_map_tree (maps[i], 1, shadow, prefix,
2866 title, nomenu, 0, 0, 0);
2867 shadow = Fcons (maps[i], shadow);
2868 SAFE_FREE ();
2871 start1 = get_local_map (BUF_PT (XBUFFER (buffer)),
2872 XBUFFER (buffer), Qlocal_map);
2873 if (!NILP (start1))
2875 if (EQ (start1, BVAR (XBUFFER (buffer), keymap)))
2876 describe_map_tree (start1, 1, shadow, prefix,
2877 "\f\nMajor Mode Bindings", nomenu, 0, 0, 0);
2878 else
2879 describe_map_tree (start1, 1, shadow, prefix,
2880 "\f\n`local-map' Property Bindings",
2881 nomenu, 0, 0, 0);
2883 shadow = Fcons (start1, shadow);
2887 describe_map_tree (current_global_map, 1, shadow, prefix,
2888 "\f\nGlobal Bindings", nomenu, 0, 1, 0);
2890 /* Print the function-key-map translations under this prefix. */
2891 if (!NILP (KVAR (current_kboard, Vlocal_function_key_map)))
2892 describe_map_tree (KVAR (current_kboard, Vlocal_function_key_map), 0, Qnil, prefix,
2893 "\f\nFunction key map translations", nomenu, 1, 0, 0);
2895 /* Print the input-decode-map translations under this prefix. */
2896 if (!NILP (KVAR (current_kboard, Vinput_decode_map)))
2897 describe_map_tree (KVAR (current_kboard, Vinput_decode_map), 0, Qnil, prefix,
2898 "\f\nInput decoding map translations", nomenu, 1, 0, 0);
2900 return Qnil;
2903 /* Insert a description of the key bindings in STARTMAP,
2904 followed by those of all maps reachable through STARTMAP.
2905 If PARTIAL, omit certain "uninteresting" commands
2906 (such as `undefined').
2907 If SHADOW is non-nil, it is a list of maps;
2908 don't mention keys which would be shadowed by any of them.
2909 PREFIX, if non-nil, says mention only keys that start with PREFIX.
2910 TITLE, if not 0, is a string to insert at the beginning.
2911 TITLE should not end with a colon or a newline; we supply that.
2912 If NOMENU, then omit menu-bar commands.
2914 If TRANSL, the definitions are actually key translations
2915 so print strings and vectors differently.
2917 If ALWAYS_TITLE, print the title even if there are no maps
2918 to look through.
2920 If MENTION_SHADOW, then when something is shadowed by SHADOW,
2921 don't omit it; instead, mention it but say it is shadowed.
2923 Any inserted text ends in two newlines (used by `help-make-xrefs'). */
2925 void
2926 describe_map_tree (Lisp_Object startmap, bool partial, Lisp_Object shadow,
2927 Lisp_Object prefix, const char *title, bool nomenu,
2928 bool transl, bool always_title, bool mention_shadow)
2930 Lisp_Object maps, orig_maps, seen, sub_shadows;
2931 bool something = 0;
2932 const char *key_heading
2933 = "\
2934 key binding\n\
2935 --- -------\n";
2937 orig_maps = maps = Faccessible_keymaps (startmap, prefix);
2938 seen = Qnil;
2939 sub_shadows = Qnil;
2941 if (nomenu)
2943 Lisp_Object list;
2945 /* Delete from MAPS each element that is for the menu bar. */
2946 for (list = maps; CONSP (list); list = XCDR (list))
2948 Lisp_Object elt, elt_prefix, tem;
2950 elt = XCAR (list);
2951 elt_prefix = Fcar (elt);
2952 if (ASIZE (elt_prefix) >= 1)
2954 tem = Faref (elt_prefix, make_number (0));
2955 if (EQ (tem, Qmenu_bar))
2956 maps = Fdelq (elt, maps);
2961 if (!NILP (maps) || always_title)
2963 if (title)
2965 insert_string (title);
2966 if (!NILP (prefix))
2968 insert_string (" Starting With ");
2969 insert1 (Fkey_description (prefix, Qnil));
2971 insert_string (":\n");
2973 insert_string (key_heading);
2974 something = 1;
2977 for (; CONSP (maps); maps = XCDR (maps))
2979 register Lisp_Object elt, elt_prefix, tail;
2981 elt = XCAR (maps);
2982 elt_prefix = Fcar (elt);
2984 sub_shadows = Qnil;
2986 for (tail = shadow; CONSP (tail); tail = XCDR (tail))
2988 Lisp_Object shmap;
2990 shmap = XCAR (tail);
2992 /* If the sequence by which we reach this keymap is zero-length,
2993 then the shadow map for this keymap is just SHADOW. */
2994 if ((STRINGP (elt_prefix) && SCHARS (elt_prefix) == 0)
2995 || (VECTORP (elt_prefix) && ASIZE (elt_prefix) == 0))
2997 /* If the sequence by which we reach this keymap actually has
2998 some elements, then the sequence's definition in SHADOW is
2999 what we should use. */
3000 else
3002 shmap = Flookup_key (shmap, Fcar (elt), Qt);
3003 if (INTEGERP (shmap))
3004 shmap = Qnil;
3007 /* If shmap is not nil and not a keymap,
3008 it completely shadows this map, so don't
3009 describe this map at all. */
3010 if (!NILP (shmap) && !KEYMAPP (shmap))
3011 goto skip;
3013 if (!NILP (shmap))
3014 sub_shadows = Fcons (shmap, sub_shadows);
3017 /* Maps we have already listed in this loop shadow this map. */
3018 for (tail = orig_maps; !EQ (tail, maps); tail = XCDR (tail))
3020 Lisp_Object tem;
3021 tem = Fequal (Fcar (XCAR (tail)), elt_prefix);
3022 if (!NILP (tem))
3023 sub_shadows = Fcons (XCDR (XCAR (tail)), sub_shadows);
3026 describe_map (Fcdr (elt), elt_prefix,
3027 transl ? describe_translation : describe_command,
3028 partial, sub_shadows, &seen, nomenu, mention_shadow);
3030 skip: ;
3033 if (something)
3034 insert_string ("\n");
3037 static int previous_description_column;
3039 static void
3040 describe_command (Lisp_Object definition, Lisp_Object args)
3042 register Lisp_Object tem1;
3043 ptrdiff_t column = current_column ();
3044 int description_column;
3046 /* If column 16 is no good, go to col 32;
3047 but don't push beyond that--go to next line instead. */
3048 if (column > 30)
3050 insert_char ('\n');
3051 description_column = 32;
3053 else if (column > 14 || (column > 10 && previous_description_column == 32))
3054 description_column = 32;
3055 else
3056 description_column = 16;
3058 Findent_to (make_number (description_column), make_number (1));
3059 previous_description_column = description_column;
3061 if (SYMBOLP (definition))
3063 tem1 = SYMBOL_NAME (definition);
3064 insert1 (tem1);
3065 insert_string ("\n");
3067 else if (STRINGP (definition) || VECTORP (definition))
3068 insert_string ("Keyboard Macro\n");
3069 else if (KEYMAPP (definition))
3070 insert_string ("Prefix Command\n");
3071 else
3072 insert_string ("??\n");
3075 static void
3076 describe_translation (Lisp_Object definition, Lisp_Object args)
3078 register Lisp_Object tem1;
3080 Findent_to (make_number (16), make_number (1));
3082 if (SYMBOLP (definition))
3084 tem1 = SYMBOL_NAME (definition);
3085 insert1 (tem1);
3086 insert_string ("\n");
3088 else if (STRINGP (definition) || VECTORP (definition))
3090 insert1 (Fkey_description (definition, Qnil));
3091 insert_string ("\n");
3093 else if (KEYMAPP (definition))
3094 insert_string ("Prefix Command\n");
3095 else
3096 insert_string ("??\n");
3099 /* describe_map puts all the usable elements of a sparse keymap
3100 into an array of `struct describe_map_elt',
3101 then sorts them by the events. */
3103 struct describe_map_elt
3105 Lisp_Object event;
3106 Lisp_Object definition;
3107 bool shadowed;
3110 /* qsort comparison function for sorting `struct describe_map_elt' by
3111 the event field. */
3113 static int
3114 describe_map_compare (const void *aa, const void *bb)
3116 const struct describe_map_elt *a = aa, *b = bb;
3117 if (INTEGERP (a->event) && INTEGERP (b->event))
3118 return ((XINT (a->event) > XINT (b->event))
3119 - (XINT (a->event) < XINT (b->event)));
3120 if (!INTEGERP (a->event) && INTEGERP (b->event))
3121 return 1;
3122 if (INTEGERP (a->event) && !INTEGERP (b->event))
3123 return -1;
3124 if (SYMBOLP (a->event) && SYMBOLP (b->event))
3125 return (!NILP (Fstring_lessp (a->event, b->event)) ? -1
3126 : !NILP (Fstring_lessp (b->event, a->event)) ? 1
3127 : 0);
3128 return 0;
3131 /* Describe the contents of map MAP, assuming that this map itself is
3132 reached by the sequence of prefix keys PREFIX (a string or vector).
3133 PARTIAL, SHADOW, NOMENU are as in `describe_map_tree' above. */
3135 static void
3136 describe_map (Lisp_Object map, Lisp_Object prefix,
3137 void (*elt_describer) (Lisp_Object, Lisp_Object),
3138 bool partial, Lisp_Object shadow,
3139 Lisp_Object *seen, bool nomenu, bool mention_shadow)
3141 Lisp_Object tail, definition, event;
3142 Lisp_Object tem;
3143 Lisp_Object suppress;
3144 Lisp_Object kludge;
3145 bool first = 1;
3147 /* These accumulate the values from sparse keymap bindings,
3148 so we can sort them and handle them in order. */
3149 ptrdiff_t length_needed = 0;
3150 struct describe_map_elt *vect;
3151 ptrdiff_t slots_used = 0;
3152 ptrdiff_t i;
3154 suppress = Qnil;
3156 if (partial)
3157 suppress = intern ("suppress-keymap");
3159 /* This vector gets used to present single keys to Flookup_key. Since
3160 that is done once per keymap element, we don't want to cons up a
3161 fresh vector every time. */
3162 kludge = Fmake_vector (make_number (1), Qnil);
3163 definition = Qnil;
3165 map = call1 (Qkeymap_canonicalize, map);
3167 for (tail = map; CONSP (tail); tail = XCDR (tail))
3168 length_needed++;
3170 USE_SAFE_ALLOCA;
3171 SAFE_NALLOCA (vect, 1, length_needed);
3173 for (tail = map; CONSP (tail); tail = XCDR (tail))
3175 QUIT;
3177 if (VECTORP (XCAR (tail))
3178 || CHAR_TABLE_P (XCAR (tail)))
3179 describe_vector (XCAR (tail),
3180 prefix, Qnil, elt_describer, partial, shadow, map,
3181 1, mention_shadow);
3182 else if (CONSP (XCAR (tail)))
3184 bool this_shadowed = 0;
3186 event = XCAR (XCAR (tail));
3188 /* Ignore bindings whose "prefix" are not really valid events.
3189 (We get these in the frames and buffers menu.) */
3190 if (!(SYMBOLP (event) || INTEGERP (event)))
3191 continue;
3193 if (nomenu && EQ (event, Qmenu_bar))
3194 continue;
3196 definition = get_keyelt (XCDR (XCAR (tail)), 0);
3198 /* Don't show undefined commands or suppressed commands. */
3199 if (NILP (definition)) continue;
3200 if (SYMBOLP (definition) && partial)
3202 tem = Fget (definition, suppress);
3203 if (!NILP (tem))
3204 continue;
3207 /* Don't show a command that isn't really visible
3208 because a local definition of the same key shadows it. */
3210 ASET (kludge, 0, event);
3211 if (!NILP (shadow))
3213 tem = shadow_lookup (shadow, kludge, Qt, 0);
3214 if (!NILP (tem))
3216 /* If both bindings are keymaps, this key is a prefix key,
3217 so don't say it is shadowed. */
3218 if (KEYMAPP (definition) && KEYMAPP (tem))
3220 /* Avoid generating duplicate entries if the
3221 shadowed binding has the same definition. */
3222 else if (mention_shadow && !EQ (tem, definition))
3223 this_shadowed = 1;
3224 else
3225 continue;
3229 tem = Flookup_key (map, kludge, Qt);
3230 if (!EQ (tem, definition)) continue;
3232 vect[slots_used].event = event;
3233 vect[slots_used].definition = definition;
3234 vect[slots_used].shadowed = this_shadowed;
3235 slots_used++;
3237 else if (EQ (XCAR (tail), Qkeymap))
3239 /* The same keymap might be in the structure twice, if we're
3240 using an inherited keymap. So skip anything we've already
3241 encountered. */
3242 tem = Fassq (tail, *seen);
3243 if (CONSP (tem) && !NILP (Fequal (XCAR (tem), prefix)))
3244 break;
3245 *seen = Fcons (Fcons (tail, prefix), *seen);
3249 /* If we found some sparse map events, sort them. */
3251 qsort (vect, slots_used, sizeof (struct describe_map_elt),
3252 describe_map_compare);
3254 /* Now output them in sorted order. */
3256 for (i = 0; i < slots_used; i++)
3258 Lisp_Object start, end;
3260 if (first)
3262 previous_description_column = 0;
3263 insert ("\n", 1);
3264 first = 0;
3267 ASET (kludge, 0, vect[i].event);
3268 start = vect[i].event;
3269 end = start;
3271 definition = vect[i].definition;
3273 /* Find consecutive chars that are identically defined. */
3274 if (INTEGERP (vect[i].event))
3276 while (i + 1 < slots_used
3277 && EQ (vect[i+1].event, make_number (XINT (vect[i].event) + 1))
3278 && !NILP (Fequal (vect[i + 1].definition, definition))
3279 && vect[i].shadowed == vect[i + 1].shadowed)
3280 i++;
3281 end = vect[i].event;
3284 /* Now START .. END is the range to describe next. */
3286 /* Insert the string to describe the event START. */
3287 insert1 (Fkey_description (kludge, prefix));
3289 if (!EQ (start, end))
3291 insert (" .. ", 4);
3293 ASET (kludge, 0, end);
3294 /* Insert the string to describe the character END. */
3295 insert1 (Fkey_description (kludge, prefix));
3298 /* Print a description of the definition of this character.
3299 elt_describer will take care of spacing out far enough
3300 for alignment purposes. */
3301 (*elt_describer) (vect[i].definition, Qnil);
3303 if (vect[i].shadowed)
3305 ptrdiff_t pt = max (PT - 1, BEG);
3307 SET_PT (pt);
3308 insert_string ("\n (that binding is currently shadowed by another mode)");
3309 pt = min (PT + 1, Z);
3310 SET_PT (pt);
3314 SAFE_FREE ();
3317 static void
3318 describe_vector_princ (Lisp_Object elt, Lisp_Object fun)
3320 Findent_to (make_number (16), make_number (1));
3321 call1 (fun, elt);
3322 Fterpri (Qnil, Qnil);
3325 DEFUN ("describe-vector", Fdescribe_vector, Sdescribe_vector, 1, 2, 0,
3326 doc: /* Insert a description of contents of VECTOR.
3327 This is text showing the elements of vector matched against indices.
3328 DESCRIBER is the output function used; nil means use `princ'. */)
3329 (Lisp_Object vector, Lisp_Object describer)
3331 ptrdiff_t count = SPECPDL_INDEX ();
3332 if (NILP (describer))
3333 describer = intern ("princ");
3334 specbind (Qstandard_output, Fcurrent_buffer ());
3335 CHECK_VECTOR_OR_CHAR_TABLE (vector);
3336 describe_vector (vector, Qnil, describer, describe_vector_princ, 0,
3337 Qnil, Qnil, 0, 0);
3339 return unbind_to (count, Qnil);
3342 /* Insert in the current buffer a description of the contents of VECTOR.
3343 We call ELT_DESCRIBER to insert the description of one value found
3344 in VECTOR.
3346 ELT_PREFIX describes what "comes before" the keys or indices defined
3347 by this vector. This is a human-readable string whose size
3348 is not necessarily related to the situation.
3350 If the vector is in a keymap, ELT_PREFIX is a prefix key which
3351 leads to this keymap.
3353 If the vector is a chartable, ELT_PREFIX is the vector
3354 of bytes that lead to the character set or portion of a character
3355 set described by this chartable.
3357 If PARTIAL, it means do not mention suppressed commands
3358 (that assumes the vector is in a keymap).
3360 SHADOW is a list of keymaps that shadow this map.
3361 If it is non-nil, then we look up the key in those maps
3362 and we don't mention it now if it is defined by any of them.
3364 ENTIRE_MAP is the keymap in which this vector appears.
3365 If the definition in effect in the whole map does not match
3366 the one in this vector, we ignore this one.
3368 ARGS is simply passed as the second argument to ELT_DESCRIBER.
3370 KEYMAP_P is 1 if vector is known to be a keymap, so map ESC to M-.
3372 ARGS is simply passed as the second argument to ELT_DESCRIBER. */
3374 static void
3375 describe_vector (Lisp_Object vector, Lisp_Object prefix, Lisp_Object args,
3376 void (*elt_describer) (Lisp_Object, Lisp_Object),
3377 bool partial, Lisp_Object shadow, Lisp_Object entire_map,
3378 bool keymap_p, bool mention_shadow)
3380 Lisp_Object definition;
3381 Lisp_Object tem2;
3382 Lisp_Object elt_prefix = Qnil;
3383 int i;
3384 Lisp_Object suppress;
3385 Lisp_Object kludge;
3386 bool first = 1;
3387 /* Range of elements to be handled. */
3388 int from, to, stop;
3389 Lisp_Object character;
3390 int starting_i;
3392 suppress = Qnil;
3394 definition = Qnil;
3396 if (!keymap_p)
3398 /* Call Fkey_description first, to avoid GC bug for the other string. */
3399 if (!NILP (prefix) && XFASTINT (Flength (prefix)) > 0)
3401 Lisp_Object tem = Fkey_description (prefix, Qnil);
3402 AUTO_STRING (space, " ");
3403 elt_prefix = concat2 (tem, space);
3405 prefix = Qnil;
3408 /* This vector gets used to present single keys to Flookup_key. Since
3409 that is done once per vector element, we don't want to cons up a
3410 fresh vector every time. */
3411 kludge = Fmake_vector (make_number (1), Qnil);
3413 if (partial)
3414 suppress = intern ("suppress-keymap");
3416 from = 0;
3417 if (CHAR_TABLE_P (vector))
3418 stop = MAX_5_BYTE_CHAR + 1, to = MAX_CHAR + 1;
3419 else
3420 stop = to = ASIZE (vector);
3422 for (i = from; ; i++)
3424 bool this_shadowed = 0;
3425 int range_beg, range_end;
3426 Lisp_Object val;
3428 QUIT;
3430 if (i == stop)
3432 if (i == to)
3433 break;
3434 stop = to;
3437 starting_i = i;
3439 if (CHAR_TABLE_P (vector))
3441 range_beg = i;
3442 i = stop - 1;
3443 val = char_table_ref_and_range (vector, range_beg, &range_beg, &i);
3445 else
3446 val = AREF (vector, i);
3447 definition = get_keyelt (val, 0);
3449 if (NILP (definition)) continue;
3451 /* Don't mention suppressed commands. */
3452 if (SYMBOLP (definition) && partial)
3454 Lisp_Object tem;
3456 tem = Fget (definition, suppress);
3458 if (!NILP (tem)) continue;
3461 character = make_number (starting_i);
3462 ASET (kludge, 0, character);
3464 /* If this binding is shadowed by some other map, ignore it. */
3465 if (!NILP (shadow))
3467 Lisp_Object tem;
3469 tem = shadow_lookup (shadow, kludge, Qt, 0);
3471 if (!NILP (tem))
3473 if (mention_shadow)
3474 this_shadowed = 1;
3475 else
3476 continue;
3480 /* Ignore this definition if it is shadowed by an earlier
3481 one in the same keymap. */
3482 if (!NILP (entire_map))
3484 Lisp_Object tem;
3486 tem = Flookup_key (entire_map, kludge, Qt);
3488 if (!EQ (tem, definition))
3489 continue;
3492 if (first)
3494 insert ("\n", 1);
3495 first = 0;
3498 /* Output the prefix that applies to every entry in this map. */
3499 if (!NILP (elt_prefix))
3500 insert1 (elt_prefix);
3502 insert1 (Fkey_description (kludge, prefix));
3504 /* Find all consecutive characters or rows that have the same
3505 definition. But, VECTOR is a char-table, we had better put a
3506 boundary between normal characters (-#x3FFF7F) and 8-bit
3507 characters (#x3FFF80-). */
3508 if (CHAR_TABLE_P (vector))
3510 while (i + 1 < stop
3511 && (range_beg = i + 1, range_end = stop - 1,
3512 val = char_table_ref_and_range (vector, range_beg,
3513 &range_beg, &range_end),
3514 tem2 = get_keyelt (val, 0),
3515 !NILP (tem2))
3516 && !NILP (Fequal (tem2, definition)))
3517 i = range_end;
3519 else
3520 while (i + 1 < stop
3521 && (tem2 = get_keyelt (AREF (vector, i + 1), 0),
3522 !NILP (tem2))
3523 && !NILP (Fequal (tem2, definition)))
3524 i++;
3526 /* If we have a range of more than one character,
3527 print where the range reaches to. */
3529 if (i != starting_i)
3531 insert (" .. ", 4);
3533 ASET (kludge, 0, make_number (i));
3535 if (!NILP (elt_prefix))
3536 insert1 (elt_prefix);
3538 insert1 (Fkey_description (kludge, prefix));
3541 /* Print a description of the definition of this character.
3542 elt_describer will take care of spacing out far enough
3543 for alignment purposes. */
3544 (*elt_describer) (definition, args);
3546 if (this_shadowed)
3548 SET_PT (PT - 1);
3549 insert_string (" (binding currently shadowed)");
3550 SET_PT (PT + 1);
3554 if (CHAR_TABLE_P (vector) && ! NILP (XCHAR_TABLE (vector)->defalt))
3556 if (!NILP (elt_prefix))
3557 insert1 (elt_prefix);
3558 insert ("default", 7);
3559 (*elt_describer) (XCHAR_TABLE (vector)->defalt, args);
3563 /* Apropos - finding all symbols whose names match a regexp. */
3564 static Lisp_Object apropos_predicate;
3565 static Lisp_Object apropos_accumulate;
3567 static void
3568 apropos_accum (Lisp_Object symbol, Lisp_Object string)
3570 register Lisp_Object tem;
3572 tem = Fstring_match (string, Fsymbol_name (symbol), Qnil);
3573 if (!NILP (tem) && !NILP (apropos_predicate))
3574 tem = call1 (apropos_predicate, symbol);
3575 if (!NILP (tem))
3576 apropos_accumulate = Fcons (symbol, apropos_accumulate);
3579 DEFUN ("apropos-internal", Fapropos_internal, Sapropos_internal, 1, 2, 0,
3580 doc: /* Show all symbols whose names contain match for REGEXP.
3581 If optional 2nd arg PREDICATE is non-nil, (funcall PREDICATE SYMBOL) is done
3582 for each symbol and a symbol is mentioned only if that returns non-nil.
3583 Return list of symbols found. */)
3584 (Lisp_Object regexp, Lisp_Object predicate)
3586 Lisp_Object tem;
3587 CHECK_STRING (regexp);
3588 apropos_predicate = predicate;
3589 apropos_accumulate = Qnil;
3590 map_obarray (Vobarray, apropos_accum, regexp);
3591 tem = Fsort (apropos_accumulate, Qstring_lessp);
3592 apropos_accumulate = Qnil;
3593 apropos_predicate = Qnil;
3594 return tem;
3597 void
3598 syms_of_keymap (void)
3600 DEFSYM (Qkeymap, "keymap");
3601 staticpro (&apropos_predicate);
3602 staticpro (&apropos_accumulate);
3603 apropos_predicate = Qnil;
3604 apropos_accumulate = Qnil;
3606 DEFSYM (Qkeymap_canonicalize, "keymap-canonicalize");
3608 /* Now we are ready to set up this property, so we can
3609 create char tables. */
3610 Fput (Qkeymap, Qchar_table_extra_slots, make_number (0));
3612 /* Initialize the keymaps standardly used.
3613 Each one is the value of a Lisp variable, and is also
3614 pointed to by a C variable */
3616 global_map = Fmake_keymap (Qnil);
3617 Fset (intern_c_string ("global-map"), global_map);
3619 current_global_map = global_map;
3620 staticpro (&global_map);
3621 staticpro (&current_global_map);
3623 meta_map = Fmake_keymap (Qnil);
3624 Fset (intern_c_string ("esc-map"), meta_map);
3625 Ffset (intern_c_string ("ESC-prefix"), meta_map);
3627 control_x_map = Fmake_keymap (Qnil);
3628 Fset (intern_c_string ("ctl-x-map"), control_x_map);
3629 Ffset (intern_c_string ("Control-X-prefix"), control_x_map);
3631 exclude_keys = listn (CONSTYPE_PURE, 5,
3632 pure_cons (build_pure_c_string ("DEL"), build_pure_c_string ("\\d")),
3633 pure_cons (build_pure_c_string ("TAB"), build_pure_c_string ("\\t")),
3634 pure_cons (build_pure_c_string ("RET"), build_pure_c_string ("\\r")),
3635 pure_cons (build_pure_c_string ("ESC"), build_pure_c_string ("\\e")),
3636 pure_cons (build_pure_c_string ("SPC"), build_pure_c_string (" ")));
3637 staticpro (&exclude_keys);
3639 DEFVAR_LISP ("define-key-rebound-commands", Vdefine_key_rebound_commands,
3640 doc: /* List of commands given new key bindings recently.
3641 This is used for internal purposes during Emacs startup;
3642 don't alter it yourself. */);
3643 Vdefine_key_rebound_commands = Qt;
3645 DEFVAR_LISP ("minibuffer-local-map", Vminibuffer_local_map,
3646 doc: /* Default keymap to use when reading from the minibuffer. */);
3647 Vminibuffer_local_map = Fmake_sparse_keymap (Qnil);
3649 DEFVAR_LISP ("minibuffer-local-ns-map", Vminibuffer_local_ns_map,
3650 doc: /* Local keymap for the minibuffer when spaces are not allowed. */);
3651 Vminibuffer_local_ns_map = Fmake_sparse_keymap (Qnil);
3652 Fset_keymap_parent (Vminibuffer_local_ns_map, Vminibuffer_local_map);
3655 DEFVAR_LISP ("minor-mode-map-alist", Vminor_mode_map_alist,
3656 doc: /* Alist of keymaps to use for minor modes.
3657 Each element looks like (VARIABLE . KEYMAP); KEYMAP is used to read
3658 key sequences and look up bindings if VARIABLE's value is non-nil.
3659 If two active keymaps bind the same key, the keymap appearing earlier
3660 in the list takes precedence. */);
3661 Vminor_mode_map_alist = Qnil;
3663 DEFVAR_LISP ("minor-mode-overriding-map-alist", Vminor_mode_overriding_map_alist,
3664 doc: /* Alist of keymaps to use for minor modes, in current major mode.
3665 This variable is an alist just like `minor-mode-map-alist', and it is
3666 used the same way (and before `minor-mode-map-alist'); however,
3667 it is provided for major modes to bind locally. */);
3668 Vminor_mode_overriding_map_alist = Qnil;
3670 DEFVAR_LISP ("emulation-mode-map-alists", Vemulation_mode_map_alists,
3671 doc: /* List of keymap alists to use for emulation modes.
3672 It is intended for modes or packages using multiple minor-mode keymaps.
3673 Each element is a keymap alist just like `minor-mode-map-alist', or a
3674 symbol with a variable binding which is a keymap alist, and it is used
3675 the same way. The "active" keymaps in each alist are used before
3676 `minor-mode-map-alist' and `minor-mode-overriding-map-alist'. */);
3677 Vemulation_mode_map_alists = Qnil;
3679 DEFVAR_LISP ("where-is-preferred-modifier", Vwhere_is_preferred_modifier,
3680 doc: /* Preferred modifier key to use for `where-is'.
3681 When a single binding is requested, `where-is' will return one that
3682 uses this modifier key if possible. If nil, or if no such binding
3683 exists, bindings using keys without modifiers (or only with meta) will
3684 be preferred. */);
3685 Vwhere_is_preferred_modifier = Qnil;
3686 where_is_preferred_modifier = 0;
3688 DEFSYM (Qmenu_bar, "menu-bar");
3689 DEFSYM (Qmode_line, "mode-line");
3691 staticpro (&Vmouse_events);
3692 Vmouse_events = listn (CONSTYPE_PURE, 9,
3693 Qmenu_bar,
3694 Qtool_bar,
3695 Qheader_line,
3696 Qmode_line,
3697 intern_c_string ("mouse-1"),
3698 intern_c_string ("mouse-2"),
3699 intern_c_string ("mouse-3"),
3700 intern_c_string ("mouse-4"),
3701 intern_c_string ("mouse-5"));
3703 /* Keymap used for minibuffers when doing completion. */
3704 /* Keymap used for minibuffers when doing completion and require a match. */
3705 DEFSYM (Qkeymapp, "keymapp");
3706 DEFSYM (Qnon_ascii, "non-ascii");
3707 DEFSYM (Qmenu_item, "menu-item");
3708 DEFSYM (Qremap, "remap");
3709 DEFSYM (QCadvertised_binding, ":advertised-binding");
3711 command_remapping_vector = Fmake_vector (make_number (2), Qremap);
3712 staticpro (&command_remapping_vector);
3714 where_is_cache_keymaps = Qt;
3715 where_is_cache = Qnil;
3716 staticpro (&where_is_cache);
3717 staticpro (&where_is_cache_keymaps);
3719 defsubr (&Skeymapp);
3720 defsubr (&Skeymap_parent);
3721 defsubr (&Skeymap_prompt);
3722 defsubr (&Sset_keymap_parent);
3723 defsubr (&Smake_keymap);
3724 defsubr (&Smake_sparse_keymap);
3725 defsubr (&Smap_keymap_internal);
3726 defsubr (&Smap_keymap);
3727 defsubr (&Scopy_keymap);
3728 defsubr (&Scommand_remapping);
3729 defsubr (&Skey_binding);
3730 defsubr (&Slocal_key_binding);
3731 defsubr (&Sglobal_key_binding);
3732 defsubr (&Sminor_mode_key_binding);
3733 defsubr (&Sdefine_key);
3734 defsubr (&Slookup_key);
3735 defsubr (&Sdefine_prefix_command);
3736 defsubr (&Suse_global_map);
3737 defsubr (&Suse_local_map);
3738 defsubr (&Scurrent_local_map);
3739 defsubr (&Scurrent_global_map);
3740 defsubr (&Scurrent_minor_mode_maps);
3741 defsubr (&Scurrent_active_maps);
3742 defsubr (&Saccessible_keymaps);
3743 defsubr (&Skey_description);
3744 defsubr (&Sdescribe_vector);
3745 defsubr (&Ssingle_key_description);
3746 defsubr (&Stext_char_description);
3747 defsubr (&Swhere_is_internal);
3748 defsubr (&Sdescribe_buffer_bindings);
3749 defsubr (&Sapropos_internal);
3752 void
3753 keys_of_keymap (void)
3755 initial_define_key (global_map, 033, "ESC-prefix");
3756 initial_define_key (global_map, Ctl ('X'), "Control-X-prefix");