]> code.delx.au - gnu-emacs/blob - src/keymap.c
Include-file cleanup for src directory
[gnu-emacs] / src / keymap.c
1 /* Manipulation of keymaps
2 Copyright (C) 1985-1988, 1993-1995, 1998-2015 Free Software
3 Foundation, Inc.
4
5 This file is part of GNU Emacs.
6
7 GNU Emacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
19
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
40 */
41
42 #include <config.h>
43 #include <stdio.h>
44
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"
56
57 /* Actually allocate storage for these variables. */
58
59 Lisp_Object current_global_map; /* Current global keymap. */
60
61 Lisp_Object global_map; /* Default global key bindings. */
62
63 Lisp_Object meta_map; /* The keymap used for globally bound
64 ESC-prefixed default commands. */
65
66 Lisp_Object control_x_map; /* The keymap used for globally bound
67 C-x-prefixed default commands. */
68
69 /* The keymap used by the minibuf for local
70 bindings when spaces are allowed in the
71 minibuf. */
72
73 /* The keymap used by the minibuf for local
74 bindings when spaces are not encouraged
75 in the minibuf. */
76
77 /* Alist of elements like (DEL . "\d"). */
78 static Lisp_Object exclude_keys;
79
80 /* Pre-allocated 2-element vector for Fcommand_remapping to use. */
81 static Lisp_Object command_remapping_vector;
82
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;
87
88 static Lisp_Object store_in_keymap (Lisp_Object, Lisp_Object, Lisp_Object);
89
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);
101
102 static void
103 CHECK_VECTOR_OR_CHAR_TABLE (Lisp_Object x)
104 {
105 CHECK_TYPE (VECTORP (x) || CHAR_TABLE_P (x), Qvector_or_char_table_p, x);
106 }
107 \f
108 /* Keymap object support - constructors and predicates. */
109
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.
117
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)
121 {
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));
129 }
130
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.
137
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)
141 {
142 if (!NILP (string))
143 {
144 if (!NILP (Vpurify_flag))
145 string = Fpurecopy (string);
146 return list2 (Qkeymap, string);
147 }
148 return list1 (Qkeymap);
149 }
150
151 /* This function is used for installing the standard key bindings
152 at initialization time.
153
154 For example:
155
156 initial_define_key (control_x_map, Ctl('X'), "exchange-point-and-mark"); */
157
158 void
159 initial_define_key (Lisp_Object keymap, int key, const char *defname)
160 {
161 store_in_keymap (keymap, make_number (key), intern_c_string (defname));
162 }
163
164 void
165 initial_define_lispy_key (Lisp_Object keymap, const char *keyname, const char *defname)
166 {
167 store_in_keymap (keymap, intern_c_string (keyname), intern_c_string (defname));
168 }
169
170 DEFUN ("keymapp", Fkeymapp, Skeymapp, 1, 1, 0,
171 doc: /* Return t if OBJECT is a keymap.
172
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)
179 {
180 return (KEYMAPP (object) ? Qt : Qnil);
181 }
182
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)
188 {
189 map = get_keymap (map, 0, 0);
190 while (CONSP (map))
191 {
192 Lisp_Object tem = XCAR (map);
193 if (STRINGP (tem))
194 return tem;
195 else if (KEYMAPP (tem))
196 {
197 tem = Fkeymap_prompt (tem);
198 if (!NILP (tem))
199 return tem;
200 }
201 map = XCDR (map);
202 }
203 return Qnil;
204 }
205
206 /* Check that OBJECT is a keymap (after dereferencing through any
207 symbols). If it is, return it.
208
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.
212
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.
216
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.
222
223 This function can GC when AUTOLOAD is true, because it calls
224 Fautoload_do_load which can GC. */
225
226 Lisp_Object
227 get_keymap (Lisp_Object object, bool error_if_not_keymap, bool autoload)
228 {
229 Lisp_Object tem;
230
231 autoload_retry:
232 if (NILP (object))
233 goto end;
234 if (CONSP (object) && EQ (XCAR (object), Qkeymap))
235 return object;
236
237 tem = indirect_function (object);
238 if (CONSP (tem))
239 {
240 if (EQ (XCAR (tem), Qkeymap))
241 return tem;
242
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))
247 {
248 Lisp_Object tail;
249
250 tail = Fnth (make_number (4), tem);
251 if (EQ (tail, Qkeymap))
252 {
253 if (autoload)
254 {
255 Fautoload_do_load (tem, object, Qnil);
256 goto autoload_retry;
257 }
258 else
259 return object;
260 }
261 }
262 }
263
264 end:
265 if (error_if_not_keymap)
266 wrong_type_argument (Qkeymapp, object);
267 return Qnil;
268 }
269 \f
270 /* Return the parent map of KEYMAP, or nil if it has none.
271 We assume that KEYMAP is a valid keymap. */
272
273 static Lisp_Object
274 keymap_parent (Lisp_Object keymap, bool autoload)
275 {
276 Lisp_Object list;
277
278 keymap = get_keymap (keymap, 1, autoload);
279
280 /* Skip past the initial element `keymap'. */
281 list = XCDR (keymap);
282 for (; CONSP (list); list = XCDR (list))
283 {
284 /* See if there is another `keymap'. */
285 if (KEYMAPP (list))
286 return list;
287 }
288
289 return get_keymap (list, 0, autoload);
290 }
291
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)
296 {
297 return keymap_parent (keymap, 1);
298 }
299
300 /* Check whether MAP is one of MAPS parents. */
301 static bool
302 keymap_memberp (Lisp_Object map, Lisp_Object maps)
303 {
304 if (NILP (map)) return 0;
305 while (KEYMAPP (maps) && !EQ (map, maps))
306 maps = keymap_parent (maps, 0);
307 return (EQ (map, maps));
308 }
309
310 /* Set the parent keymap of MAP to PARENT. */
311
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)
316 {
317 Lisp_Object list, prev;
318
319 /* Flush any reverse-map cache. */
320 where_is_cache = Qnil; where_is_cache_keymaps = Qt;
321
322 keymap = get_keymap (keymap, 1, 1);
323
324 if (!NILP (parent))
325 {
326 parent = get_keymap (parent, 1, 0);
327
328 /* Check for cycles. */
329 if (keymap_memberp (keymap, parent))
330 error ("Cyclic keymap inheritance");
331 }
332
333 /* Skip past the initial element `keymap'. */
334 prev = keymap;
335 while (1)
336 {
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))
341 {
342 CHECK_IMPURE (prev, XCONS (prev));
343 XSETCDR (prev, parent);
344 return parent;
345 }
346 prev = list;
347 }
348 }
349 \f
350
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.
354
355 MAP must be a keymap or a list of keymaps.
356
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.
360
361 If not T_OK, bindings for Qt are not treated specially.
362
363 If NOINHERIT, don't accept a subkeymap found in an inherited keymap.
364
365 Return Qunbound if no binding was found (and return Qnil if a nil
366 binding was found). */
367
368 static Lisp_Object
369 access_keymap_1 (Lisp_Object map, Lisp_Object idx,
370 bool t_ok, bool noinherit, bool autoload)
371 {
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);
376
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)));
385
386 /* Handle the special meta -> esc mapping. */
387 if (INTEGERP (idx) && XFASTINT (idx) & meta_modifier)
388 {
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))
400 {
401 map = event_meta_map;
402 idx = make_number (XFASTINT (idx) & ~meta_modifier);
403 }
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;
410 }
411
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. */
415 {
416 Lisp_Object tail;
417 Lisp_Object t_binding = Qunbound;
418 Lisp_Object retval = Qunbound;
419 Lisp_Object retval_tail = Qnil;
420
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))
425 {
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);
430
431 if (EQ (binding, Qkeymap))
432 {
433 if (noinherit || NILP (retval))
434 /* If NOINHERIT, stop here, the rest is inherited. */
435 break;
436 else if (!EQ (retval, Qunbound))
437 {
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))
445 {
446 if (CONSP (retval_tail))
447 XSETCDR (retval_tail, parent_entry);
448 else
449 {
450 retval_tail = Fcons (retval, parent_entry);
451 retval = Fcons (Qkeymap, retval_tail);
452 }
453 }
454 break;
455 }
456 }
457 else if (CONSP (submap))
458 {
459 val = access_keymap_1 (submap, idx, t_ok, noinherit, autoload);
460 }
461 else if (CONSP (binding))
462 {
463 Lisp_Object key = XCAR (binding);
464
465 if (EQ (key, idx))
466 val = XCDR (binding);
467 else if (t_ok && EQ (key, Qt))
468 {
469 t_binding = XCDR (binding);
470 t_ok = 0;
471 }
472 }
473 else if (VECTORP (binding))
474 {
475 if (INTEGERP (idx) && XFASTINT (idx) < ASIZE (binding))
476 val = AREF (binding, XFASTINT (idx));
477 }
478 else if (CHAR_TABLE_P (binding))
479 {
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)
484 {
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;
491 }
492 }
493
494 /* If we found a binding, clean it up and return it. */
495 if (!EQ (val, Qunbound))
496 {
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;
502
503 val = get_keyelt (val, autoload);
504
505 if (!KEYMAPP (val))
506 {
507 if (NILP (retval) || EQ (retval, Qunbound))
508 retval = val;
509 if (!NILP (val))
510 break; /* Shadows everything that follows. */
511 }
512 else if (NILP (retval) || EQ (retval, Qunbound))
513 retval = val;
514 else if (CONSP (retval_tail))
515 {
516 XSETCDR (retval_tail, list1 (val));
517 retval_tail = XCDR (retval_tail);
518 }
519 else
520 {
521 retval_tail = list1 (val);
522 retval = Fcons (Qkeymap, Fcons (retval, retval_tail));
523 }
524 }
525 QUIT;
526 }
527
528 return EQ (Qunbound, retval) ? get_keyelt (t_binding, autoload) : retval;
529 }
530 }
531
532 Lisp_Object
533 access_keymap (Lisp_Object map, Lisp_Object idx,
534 bool t_ok, bool noinherit, bool autoload)
535 {
536 Lisp_Object val = access_keymap_1 (map, idx, t_ok, noinherit, autoload);
537 return EQ (val, Qunbound) ? Qnil : val;
538 }
539
540 static void
541 map_keymap_item (map_keymap_function_t fun, Lisp_Object args, Lisp_Object key, Lisp_Object val, void *data)
542 {
543 if (EQ (val, Qt))
544 val = Qnil;
545 (*fun) (key, val, args, data);
546 }
547
548 static void
549 map_keymap_char_table_item (Lisp_Object args, Lisp_Object key, Lisp_Object val)
550 {
551 if (!NILP (val))
552 {
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));
561 }
562 }
563
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)
571 {
572 Lisp_Object tail
573 = (CONSP (map) && EQ (Qkeymap, XCAR (map))) ? XCDR (map) : map;
574
575 for (; CONSP (tail) && !EQ (Qkeymap, XCAR (tail)); tail = XCDR (tail))
576 {
577 Lisp_Object binding = XCAR (tail);
578
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))
584 {
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++)
589 {
590 Lisp_Object character;
591 XSETFASTINT (character, c);
592 map_keymap_item (fun, args, character, AREF (binding, c), data);
593 }
594 }
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));
599 }
600
601 return tail;
602 }
603
604 static void
605 map_keymap_call (Lisp_Object key, Lisp_Object val, Lisp_Object fun, void *dummy)
606 {
607 call2 (fun, key, val);
608 }
609
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)
615 {
616 map = get_keymap (map, 1, autoload);
617 while (CONSP (map))
618 {
619 if (KEYMAPP (XCAR (map)))
620 {
621 map_keymap (XCAR (map), fun, args, data, autoload);
622 map = XCDR (map);
623 }
624 else
625 map = map_keymap_internal (map, fun, args, data);
626 if (!CONSP (map))
627 map = get_keymap (map, 0, autoload);
628 }
629 }
630
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)
635 {
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);
641 }
642
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)
649 {
650 keymap = get_keymap (keymap, 1, 1);
651 keymap = map_keymap_internal (keymap, map_keymap_call, function, NULL);
652 return keymap;
653 }
654
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.
659
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)
665 {
666 if (! NILP (sort_first))
667 return call2 (intern ("map-keymap-sorted"), function, keymap);
668
669 map_keymap (keymap, map_keymap_call, function, NULL, 1);
670 return Qnil;
671 }
672
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.
678
679 Also if OBJECT has a menu string as the first element,
680 remove that. Also remove a menu help string as second element.
681
682 If AUTOLOAD, load autoloadable keymaps
683 that are referred to with indirection.
684
685 This can GC because menu_item_eval_property calls Feval. */
686
687 static Lisp_Object
688 get_keyelt (Lisp_Object object, bool autoload)
689 {
690 while (1)
691 {
692 if (!(CONSP (object)))
693 /* This is really the value. */
694 return object;
695
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))
700 {
701 if (CONSP (XCDR (object)))
702 {
703 Lisp_Object tem;
704
705 object = XCDR (XCDR (object));
706 tem = object;
707 if (CONSP (object))
708 object = XCAR (object);
709
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)
715 {
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;
721 }
722 }
723 else
724 /* Invalid keymap. */
725 return object;
726 }
727
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);
733
734 else
735 return object;
736 }
737 }
738
739 static Lisp_Object
740 store_in_keymap (Lisp_Object keymap, register Lisp_Object idx, Lisp_Object def)
741 {
742 /* Flush any reverse-map cache. */
743 where_is_cache = Qnil;
744 where_is_cache_keymaps = Qt;
745
746 if (EQ (idx, Qkeymap))
747 error ("`keymap' is reserved for embedded parent maps");
748
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));
754
755 if (!CONSP (keymap) || !EQ (XCAR (keymap), Qkeymap))
756 error ("attempt to define a key in a non-keymap");
757
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);
767
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)));
776
777 /* Scan the keymap for a binding of idx. */
778 {
779 Lisp_Object tail;
780
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;
788
789 insertion_point = keymap;
790 for (tail = XCDR (keymap); CONSP (tail); tail = XCDR (tail))
791 {
792 Lisp_Object elt;
793
794 elt = XCAR (tail);
795 if (VECTORP (elt))
796 {
797 if (NATNUMP (idx) && XFASTINT (idx) < ASIZE (elt))
798 {
799 CHECK_IMPURE (elt, XVECTOR (elt));
800 ASET (elt, XFASTINT (idx), def);
801 return def;
802 }
803 else if (CONSP (idx) && CHARACTERP (XCAR (idx)))
804 {
805 int from = XFASTINT (XCAR (idx));
806 int to = XFASTINT (XCDR (idx));
807
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;
815 }
816 insertion_point = tail;
817 }
818 else if (CHAR_TABLE_P (elt))
819 {
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))
824 {
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;
831 }
832 else if (CONSP (idx) && CHARACTERP (XCAR (idx)))
833 {
834 Fset_char_table_range (elt, idx, NILP (def) ? Qt : def);
835 return def;
836 }
837 insertion_point = tail;
838 }
839 else if (CONSP (elt))
840 {
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;
849 }
850 else if (EQ (idx, XCAR (elt)))
851 {
852 CHECK_IMPURE (elt, XCONS (elt));
853 XSETCDR (elt, def);
854 return def;
855 }
856 else if (CONSP (idx) && CHARACTERP (XCAR (idx)))
857 {
858 int from = XFASTINT (XCAR (idx));
859 int to = XFASTINT (XCDR (idx));
860
861 if (from <= XFASTINT (XCAR (elt))
862 && to >= XFASTINT (XCAR (elt)))
863 {
864 XSETCDR (elt, def);
865 if (from == to)
866 return def;
867 }
868 }
869 }
870 else if (EQ (elt, Qkeymap))
871 /* If we find a 'keymap' symbol in the spine of KEYMAP,
872 then we must have found the start of a second keymap
873 being used as the tail of KEYMAP, and a binding for IDX
874 should be inserted before it. */
875 goto keymap_end;
876
877 QUIT;
878 }
879
880 keymap_end:
881 /* We have scanned the entire keymap, and not found a binding for
882 IDX. Let's add one. */
883 {
884 Lisp_Object elt;
885
886 if (CONSP (idx) && CHARACTERP (XCAR (idx)))
887 {
888 /* IDX specifies a range of characters, and not all of them
889 were handled yet, which means this keymap doesn't have a
890 char-table. So, we insert a char-table now. */
891 elt = Fmake_char_table (Qkeymap, Qnil);
892 Fset_char_table_range (elt, idx, NILP (def) ? Qt : def);
893 }
894 else
895 elt = Fcons (idx, def);
896 CHECK_IMPURE (insertion_point, XCONS (insertion_point));
897 XSETCDR (insertion_point, Fcons (elt, XCDR (insertion_point)));
898 }
899 }
900
901 return def;
902 }
903
904 static Lisp_Object
905 copy_keymap_item (Lisp_Object elt)
906 {
907 Lisp_Object res, tem;
908
909 if (!CONSP (elt))
910 return elt;
911
912 res = tem = elt;
913
914 /* Is this a new format menu item. */
915 if (EQ (XCAR (tem), Qmenu_item))
916 {
917 /* Copy cell with menu-item marker. */
918 res = elt = Fcons (XCAR (tem), XCDR (tem));
919 tem = XCDR (elt);
920 if (CONSP (tem))
921 {
922 /* Copy cell with menu-item name. */
923 XSETCDR (elt, Fcons (XCAR (tem), XCDR (tem)));
924 elt = XCDR (elt);
925 tem = XCDR (elt);
926 }
927 if (CONSP (tem))
928 {
929 /* Copy cell with binding and if the binding is a keymap,
930 copy that. */
931 XSETCDR (elt, Fcons (XCAR (tem), XCDR (tem)));
932 elt = XCDR (elt);
933 tem = XCAR (elt);
934 if (CONSP (tem) && EQ (XCAR (tem), Qkeymap))
935 XSETCAR (elt, Fcopy_keymap (tem));
936 tem = XCDR (elt);
937 }
938 }
939 else
940 {
941 /* It may be an old format menu item.
942 Skip the optional menu string. */
943 if (STRINGP (XCAR (tem)))
944 {
945 /* Copy the cell, since copy-alist didn't go this deep. */
946 res = elt = Fcons (XCAR (tem), XCDR (tem));
947 tem = XCDR (elt);
948 /* Also skip the optional menu help string. */
949 if (CONSP (tem) && STRINGP (XCAR (tem)))
950 {
951 XSETCDR (elt, Fcons (XCAR (tem), XCDR (tem)));
952 elt = XCDR (elt);
953 tem = XCDR (elt);
954 }
955 if (CONSP (tem) && EQ (XCAR (tem), Qkeymap))
956 XSETCDR (elt, Fcopy_keymap (tem));
957 }
958 else if (EQ (XCAR (tem), Qkeymap))
959 res = Fcopy_keymap (elt);
960 }
961 return res;
962 }
963
964 static void
965 copy_keymap_1 (Lisp_Object chartable, Lisp_Object idx, Lisp_Object elt)
966 {
967 Fset_char_table_range (chartable, idx, copy_keymap_item (elt));
968 }
969
970 DEFUN ("copy-keymap", Fcopy_keymap, Scopy_keymap, 1, 1, 0,
971 doc: /* Return a copy of the keymap KEYMAP.
972 The copy starts out with the same definitions of KEYMAP,
973 but changing either the copy or KEYMAP does not affect the other.
974 Any key definitions that are subkeymaps are recursively copied.
975 However, a key definition which is a symbol whose definition is a keymap
976 is not copied. */)
977 (Lisp_Object keymap)
978 {
979 Lisp_Object copy, tail;
980 keymap = get_keymap (keymap, 1, 0);
981 copy = tail = list1 (Qkeymap);
982 keymap = XCDR (keymap); /* Skip the `keymap' symbol. */
983
984 while (CONSP (keymap) && !EQ (XCAR (keymap), Qkeymap))
985 {
986 Lisp_Object elt = XCAR (keymap);
987 if (CHAR_TABLE_P (elt))
988 {
989 elt = Fcopy_sequence (elt);
990 map_char_table (copy_keymap_1, Qnil, elt, elt);
991 }
992 else if (VECTORP (elt))
993 {
994 int i;
995 elt = Fcopy_sequence (elt);
996 for (i = 0; i < ASIZE (elt); i++)
997 ASET (elt, i, copy_keymap_item (AREF (elt, i)));
998 }
999 else if (CONSP (elt))
1000 {
1001 if (EQ (XCAR (elt), Qkeymap))
1002 /* This is a sub keymap. */
1003 elt = Fcopy_keymap (elt);
1004 else
1005 elt = Fcons (XCAR (elt), copy_keymap_item (XCDR (elt)));
1006 }
1007 XSETCDR (tail, list1 (elt));
1008 tail = XCDR (tail);
1009 keymap = XCDR (keymap);
1010 }
1011 XSETCDR (tail, keymap);
1012 return copy;
1013 }
1014 \f
1015 /* Simple Keymap mutators and accessors. */
1016
1017 /* GC is possible in this function if it autoloads a keymap. */
1018
1019 DEFUN ("define-key", Fdefine_key, Sdefine_key, 3, 3, 0,
1020 doc: /* In KEYMAP, define key sequence KEY as DEF.
1021 KEYMAP is a keymap.
1022
1023 KEY is a string or a vector of symbols and characters, representing a
1024 sequence of keystrokes and events. Non-ASCII characters with codes
1025 above 127 (such as ISO Latin-1) can be represented by vectors.
1026 Two types of vector have special meanings:
1027 [remap COMMAND] remaps any key binding for COMMAND.
1028 [t] creates a default definition, which applies to any event with no
1029 other definition in KEYMAP.
1030
1031 DEF is anything that can be a key's definition:
1032 nil (means key is undefined in this keymap),
1033 a command (a Lisp function suitable for interactive calling),
1034 a string (treated as a keyboard macro),
1035 a keymap (to define a prefix key),
1036 a symbol (when the key is looked up, the symbol will stand for its
1037 function definition, which should at that time be one of the above,
1038 or another symbol whose function definition is used, etc.),
1039 a cons (STRING . DEFN), meaning that DEFN is the definition
1040 (DEFN should be a valid definition in its own right),
1041 or a cons (MAP . CHAR), meaning use definition of CHAR in keymap MAP,
1042 or an extended menu item definition.
1043 (See info node `(elisp)Extended Menu Items'.)
1044
1045 If KEYMAP is a sparse keymap with a binding for KEY, the existing
1046 binding is altered. If there is no binding for KEY, the new pair
1047 binding KEY to DEF is added at the front of KEYMAP. */)
1048 (Lisp_Object keymap, Lisp_Object key, Lisp_Object def)
1049 {
1050 ptrdiff_t idx;
1051 Lisp_Object c;
1052 Lisp_Object cmd;
1053 bool metized = 0;
1054 int meta_bit;
1055 ptrdiff_t length;
1056
1057 keymap = get_keymap (keymap, 1, 1);
1058
1059 length = CHECK_VECTOR_OR_STRING (key);
1060 if (length == 0)
1061 return Qnil;
1062
1063 if (SYMBOLP (def) && !EQ (Vdefine_key_rebound_commands, Qt))
1064 Vdefine_key_rebound_commands = Fcons (def, Vdefine_key_rebound_commands);
1065
1066 meta_bit = (VECTORP (key) || (STRINGP (key) && STRING_MULTIBYTE (key))
1067 ? meta_modifier : 0x80);
1068
1069 if (VECTORP (def) && ASIZE (def) > 0 && CONSP (AREF (def, 0)))
1070 { /* DEF is apparently an XEmacs-style keyboard macro. */
1071 Lisp_Object tmp = Fmake_vector (make_number (ASIZE (def)), Qnil);
1072 ptrdiff_t i = ASIZE (def);
1073 while (--i >= 0)
1074 {
1075 Lisp_Object defi = AREF (def, i);
1076 if (CONSP (defi) && lucid_event_type_list_p (defi))
1077 defi = Fevent_convert_list (defi);
1078 ASET (tmp, i, defi);
1079 }
1080 def = tmp;
1081 }
1082
1083 idx = 0;
1084 while (1)
1085 {
1086 c = Faref (key, make_number (idx));
1087
1088 if (CONSP (c))
1089 {
1090 /* C may be a Lucid style event type list or a cons (FROM .
1091 TO) specifying a range of characters. */
1092 if (lucid_event_type_list_p (c))
1093 c = Fevent_convert_list (c);
1094 else if (CHARACTERP (XCAR (c)))
1095 CHECK_CHARACTER_CDR (c);
1096 }
1097
1098 if (SYMBOLP (c))
1099 silly_event_symbol_error (c);
1100
1101 if (INTEGERP (c)
1102 && (XINT (c) & meta_bit)
1103 && !metized)
1104 {
1105 c = meta_prefix_char;
1106 metized = 1;
1107 }
1108 else
1109 {
1110 if (INTEGERP (c))
1111 XSETINT (c, XINT (c) & ~meta_bit);
1112
1113 metized = 0;
1114 idx++;
1115 }
1116
1117 if (!INTEGERP (c) && !SYMBOLP (c)
1118 && (!CONSP (c)
1119 /* If C is a range, it must be a leaf. */
1120 || (INTEGERP (XCAR (c)) && idx != length)))
1121 message_with_string ("Key sequence contains invalid event %s", c, 1);
1122
1123 if (idx == length)
1124 return store_in_keymap (keymap, c, def);
1125
1126 cmd = access_keymap (keymap, c, 0, 1, 1);
1127
1128 /* If this key is undefined, make it a prefix. */
1129 if (NILP (cmd))
1130 cmd = define_as_prefix (keymap, c);
1131
1132 keymap = get_keymap (cmd, 0, 1);
1133 if (!CONSP (keymap))
1134 {
1135 const char *trailing_esc = ((EQ (c, meta_prefix_char) && metized)
1136 ? (idx == 0 ? "ESC" : " ESC")
1137 : "");
1138
1139 /* We must use Fkey_description rather than just passing key to
1140 error; key might be a vector, not a string. */
1141 error ("Key sequence %s starts with non-prefix key %s%s",
1142 SDATA (Fkey_description (key, Qnil)),
1143 SDATA (Fkey_description (Fsubstring (key, make_number (0),
1144 make_number (idx)),
1145 Qnil)),
1146 trailing_esc);
1147 }
1148 }
1149 }
1150
1151 /* This function may GC (it calls Fkey_binding). */
1152
1153 DEFUN ("command-remapping", Fcommand_remapping, Scommand_remapping, 1, 3, 0,
1154 doc: /* Return the remapping for command COMMAND.
1155 Returns nil if COMMAND is not remapped (or not a symbol).
1156
1157 If the optional argument POSITION is non-nil, it specifies a mouse
1158 position as returned by `event-start' and `event-end', and the
1159 remapping occurs in the keymaps associated with it. It can also be a
1160 number or marker, in which case the keymap properties at the specified
1161 buffer position instead of point are used. The KEYMAPS argument is
1162 ignored if POSITION is non-nil.
1163
1164 If the optional argument KEYMAPS is non-nil, it should be a list of
1165 keymaps to search for command remapping. Otherwise, search for the
1166 remapping in all currently active keymaps. */)
1167 (Lisp_Object command, Lisp_Object position, Lisp_Object keymaps)
1168 {
1169 if (!SYMBOLP (command))
1170 return Qnil;
1171
1172 ASET (command_remapping_vector, 1, command);
1173
1174 if (NILP (keymaps))
1175 command = Fkey_binding (command_remapping_vector, Qnil, Qt, position);
1176 else
1177 command = Flookup_key (Fcons (Qkeymap, keymaps),
1178 command_remapping_vector, Qnil);
1179 return INTEGERP (command) ? Qnil : command;
1180 }
1181
1182 /* Value is number if KEY is too long; nil if valid but has no definition. */
1183 /* GC is possible in this function. */
1184
1185 DEFUN ("lookup-key", Flookup_key, Slookup_key, 2, 3, 0,
1186 doc: /* In keymap KEYMAP, look up key sequence KEY. Return the definition.
1187 A value of nil means undefined. See doc of `define-key'
1188 for kinds of definitions.
1189
1190 A number as value means KEY is "too long";
1191 that is, characters or symbols in it except for the last one
1192 fail to be a valid sequence of prefix characters in KEYMAP.
1193 The number is how many characters at the front of KEY
1194 it takes to reach a non-prefix key.
1195
1196 Normally, `lookup-key' ignores bindings for t, which act as default
1197 bindings, used when nothing else in the keymap applies; this makes it
1198 usable as a general function for probing keymaps. However, if the
1199 third optional argument ACCEPT-DEFAULT is non-nil, `lookup-key' will
1200 recognize the default bindings, just as `read-key-sequence' does. */)
1201 (Lisp_Object keymap, Lisp_Object key, Lisp_Object accept_default)
1202 {
1203 ptrdiff_t idx;
1204 Lisp_Object cmd;
1205 Lisp_Object c;
1206 ptrdiff_t length;
1207 bool t_ok = !NILP (accept_default);
1208
1209 keymap = get_keymap (keymap, 1, 1);
1210
1211 length = CHECK_VECTOR_OR_STRING (key);
1212 if (length == 0)
1213 return keymap;
1214
1215 idx = 0;
1216 while (1)
1217 {
1218 c = Faref (key, make_number (idx++));
1219
1220 if (CONSP (c) && lucid_event_type_list_p (c))
1221 c = Fevent_convert_list (c);
1222
1223 /* Turn the 8th bit of string chars into a meta modifier. */
1224 if (STRINGP (key) && XINT (c) & 0x80 && !STRING_MULTIBYTE (key))
1225 XSETINT (c, (XINT (c) | meta_modifier) & ~0x80);
1226
1227 /* Allow string since binding for `menu-bar-select-buffer'
1228 includes the buffer name in the key sequence. */
1229 if (!INTEGERP (c) && !SYMBOLP (c) && !CONSP (c) && !STRINGP (c))
1230 message_with_string ("Key sequence contains invalid event %s", c, 1);
1231
1232 cmd = access_keymap (keymap, c, t_ok, 0, 1);
1233 if (idx == length)
1234 return cmd;
1235
1236 keymap = get_keymap (cmd, 0, 1);
1237 if (!CONSP (keymap))
1238 return make_number (idx);
1239
1240 QUIT;
1241 }
1242 }
1243
1244 /* Make KEYMAP define event C as a keymap (i.e., as a prefix).
1245 Assume that currently it does not define C at all.
1246 Return the keymap. */
1247
1248 static Lisp_Object
1249 define_as_prefix (Lisp_Object keymap, Lisp_Object c)
1250 {
1251 Lisp_Object cmd;
1252
1253 cmd = Fmake_sparse_keymap (Qnil);
1254 store_in_keymap (keymap, c, cmd);
1255
1256 return cmd;
1257 }
1258
1259 /* Append a key to the end of a key sequence. We always make a vector. */
1260
1261 static Lisp_Object
1262 append_key (Lisp_Object key_sequence, Lisp_Object key)
1263 {
1264 AUTO_LIST1 (key_list, key);
1265 return CALLN (Fvconcat, key_sequence, key_list);
1266 }
1267
1268 /* Given a event type C which is a symbol,
1269 signal an error if is a mistake such as RET or M-RET or C-DEL, etc. */
1270
1271 static void
1272 silly_event_symbol_error (Lisp_Object c)
1273 {
1274 Lisp_Object parsed, base, name, assoc;
1275 int modifiers;
1276
1277 parsed = parse_modifiers (c);
1278 modifiers = XFASTINT (XCAR (XCDR (parsed)));
1279 base = XCAR (parsed);
1280 name = Fsymbol_name (base);
1281 /* This alist includes elements such as ("RET" . "\\r"). */
1282 assoc = Fassoc (name, exclude_keys);
1283
1284 if (! NILP (assoc))
1285 {
1286 char new_mods[sizeof ("\\A-\\C-\\H-\\M-\\S-\\s-")];
1287 char *p = new_mods;
1288 Lisp_Object keystring;
1289 if (modifiers & alt_modifier)
1290 { *p++ = '\\'; *p++ = 'A'; *p++ = '-'; }
1291 if (modifiers & ctrl_modifier)
1292 { *p++ = '\\'; *p++ = 'C'; *p++ = '-'; }
1293 if (modifiers & hyper_modifier)
1294 { *p++ = '\\'; *p++ = 'H'; *p++ = '-'; }
1295 if (modifiers & meta_modifier)
1296 { *p++ = '\\'; *p++ = 'M'; *p++ = '-'; }
1297 if (modifiers & shift_modifier)
1298 { *p++ = '\\'; *p++ = 'S'; *p++ = '-'; }
1299 if (modifiers & super_modifier)
1300 { *p++ = '\\'; *p++ = 's'; *p++ = '-'; }
1301 *p = 0;
1302
1303 c = reorder_modifiers (c);
1304 AUTO_STRING (new_mods_string, new_mods);
1305 keystring = concat2 (new_mods_string, XCDR (assoc));
1306
1307 error ("To bind the key %s, use [?%s], not [%s]",
1308 SDATA (SYMBOL_NAME (c)), SDATA (keystring),
1309 SDATA (SYMBOL_NAME (c)));
1310 }
1311 }
1312 \f
1313 /* Global, local, and minor mode keymap stuff. */
1314
1315 /* We can't put these variables inside current_minor_maps, since under
1316 some systems, static gets macro-defined to be the empty string.
1317 Ickypoo. */
1318 static Lisp_Object *cmm_modes = NULL, *cmm_maps = NULL;
1319 static ptrdiff_t cmm_size = 0;
1320
1321 /* Store a pointer to an array of the currently active minor modes in
1322 *modeptr, a pointer to an array of the keymaps of the currently
1323 active minor modes in *mapptr, and return the number of maps
1324 *mapptr contains.
1325
1326 This function always returns a pointer to the same buffer, and may
1327 free or reallocate it, so if you want to keep it for a long time or
1328 hand it out to lisp code, copy it. This procedure will be called
1329 for every key sequence read, so the nice lispy approach (return a
1330 new assoclist, list, what have you) for each invocation would
1331 result in a lot of consing over time.
1332
1333 If we used xrealloc/xmalloc and ran out of memory, they would throw
1334 back to the command loop, which would try to read a key sequence,
1335 which would call this function again, resulting in an infinite
1336 loop. Instead, we'll use realloc/malloc and silently truncate the
1337 list, let the key sequence be read, and hope some other piece of
1338 code signals the error. */
1339 ptrdiff_t
1340 current_minor_maps (Lisp_Object **modeptr, Lisp_Object **mapptr)
1341 {
1342 ptrdiff_t i = 0;
1343 int list_number = 0;
1344 Lisp_Object alist, assoc, var, val;
1345 Lisp_Object emulation_alists;
1346 Lisp_Object lists[2];
1347
1348 emulation_alists = Vemulation_mode_map_alists;
1349 lists[0] = Vminor_mode_overriding_map_alist;
1350 lists[1] = Vminor_mode_map_alist;
1351
1352 for (list_number = 0; list_number < 2; list_number++)
1353 {
1354 if (CONSP (emulation_alists))
1355 {
1356 alist = XCAR (emulation_alists);
1357 emulation_alists = XCDR (emulation_alists);
1358 if (SYMBOLP (alist))
1359 alist = find_symbol_value (alist);
1360 list_number = -1;
1361 }
1362 else
1363 alist = lists[list_number];
1364
1365 for ( ; CONSP (alist); alist = XCDR (alist))
1366 if ((assoc = XCAR (alist), CONSP (assoc))
1367 && (var = XCAR (assoc), SYMBOLP (var))
1368 && (val = find_symbol_value (var), !EQ (val, Qunbound))
1369 && !NILP (val))
1370 {
1371 Lisp_Object temp;
1372
1373 /* If a variable has an entry in Vminor_mode_overriding_map_alist,
1374 and also an entry in Vminor_mode_map_alist,
1375 ignore the latter. */
1376 if (list_number == 1)
1377 {
1378 val = assq_no_quit (var, lists[0]);
1379 if (!NILP (val))
1380 continue;
1381 }
1382
1383 if (i >= cmm_size)
1384 {
1385 ptrdiff_t newsize, allocsize;
1386 Lisp_Object *newmodes, *newmaps;
1387
1388 /* Check for size calculation overflow. Other code
1389 (e.g., read_key_sequence) adds 3 to the count
1390 later, so subtract 3 from the limit here. */
1391 if (min (PTRDIFF_MAX, SIZE_MAX) / (2 * sizeof *newmodes) - 3
1392 < cmm_size)
1393 break;
1394
1395 newsize = cmm_size == 0 ? 30 : cmm_size * 2;
1396 allocsize = newsize * sizeof *newmodes;
1397
1398 /* Use malloc here. See the comment above this function.
1399 Avoid realloc here; it causes spurious traps on GNU/Linux [KFS] */
1400 block_input ();
1401 newmodes = malloc (allocsize);
1402 if (newmodes)
1403 {
1404 if (cmm_modes)
1405 {
1406 memcpy (newmodes, cmm_modes,
1407 cmm_size * sizeof cmm_modes[0]);
1408 free (cmm_modes);
1409 }
1410 cmm_modes = newmodes;
1411 }
1412
1413 newmaps = malloc (allocsize);
1414 if (newmaps)
1415 {
1416 if (cmm_maps)
1417 {
1418 memcpy (newmaps, cmm_maps,
1419 cmm_size * sizeof cmm_maps[0]);
1420 free (cmm_maps);
1421 }
1422 cmm_maps = newmaps;
1423 }
1424 unblock_input ();
1425
1426 if (newmodes == NULL || newmaps == NULL)
1427 break;
1428 cmm_size = newsize;
1429 }
1430
1431 /* Get the keymap definition--or nil if it is not defined. */
1432 temp = Findirect_function (XCDR (assoc), Qt);
1433 if (!NILP (temp))
1434 {
1435 cmm_modes[i] = var;
1436 cmm_maps [i] = temp;
1437 i++;
1438 }
1439 }
1440 }
1441
1442 if (modeptr) *modeptr = cmm_modes;
1443 if (mapptr) *mapptr = cmm_maps;
1444 return i;
1445 }
1446
1447 /* Return the offset of POSITION, a click position, in the style of
1448 the respective argument of Fkey_binding. */
1449 static ptrdiff_t
1450 click_position (Lisp_Object position)
1451 {
1452 EMACS_INT pos = (INTEGERP (position) ? XINT (position)
1453 : MARKERP (position) ? marker_position (position)
1454 : PT);
1455 if (! (BEGV <= pos && pos <= ZV))
1456 args_out_of_range (Fcurrent_buffer (), position);
1457 return pos;
1458 }
1459
1460 DEFUN ("current-active-maps", Fcurrent_active_maps, Scurrent_active_maps,
1461 0, 2, 0,
1462 doc: /* Return a list of the currently active keymaps.
1463 OLP if non-nil indicates that we should obey `overriding-local-map' and
1464 `overriding-terminal-local-map'. POSITION can specify a click position
1465 like in the respective argument of `key-binding'. */)
1466 (Lisp_Object olp, Lisp_Object position)
1467 {
1468 ptrdiff_t count = SPECPDL_INDEX ();
1469
1470 Lisp_Object keymaps = list1 (current_global_map);
1471
1472 /* If a mouse click position is given, our variables are based on
1473 the buffer clicked on, not the current buffer. So we may have to
1474 switch the buffer here. */
1475
1476 if (CONSP (position))
1477 {
1478 Lisp_Object window;
1479
1480 window = POSN_WINDOW (position);
1481
1482 if (WINDOWP (window)
1483 && BUFFERP (XWINDOW (window)->contents)
1484 && XBUFFER (XWINDOW (window)->contents) != current_buffer)
1485 {
1486 /* Arrange to go back to the original buffer once we're done
1487 processing the key sequence. We don't use
1488 save_excursion_{save,restore} here, in analogy to
1489 `read-key-sequence' to avoid saving point. Maybe this
1490 would not be a problem here, but it is easier to keep
1491 things the same.
1492 */
1493 record_unwind_current_buffer ();
1494 set_buffer_internal (XBUFFER (XWINDOW (window)->contents));
1495 }
1496 }
1497
1498 if (!NILP (olp)
1499 /* The doc said that overriding-terminal-local-map should
1500 override overriding-local-map. The code used them both,
1501 but it seems clearer to use just one. rms, jan 2005. */
1502 && NILP (KVAR (current_kboard, Voverriding_terminal_local_map))
1503 && !NILP (Voverriding_local_map))
1504 keymaps = Fcons (Voverriding_local_map, keymaps);
1505
1506 if (NILP (XCDR (keymaps)))
1507 {
1508 Lisp_Object *maps;
1509 int nmaps, i;
1510 ptrdiff_t pt = click_position (position);
1511 /* This usually returns the buffer's local map,
1512 but that can be overridden by a `local-map' property. */
1513 Lisp_Object local_map = get_local_map (pt, current_buffer, Qlocal_map);
1514 /* This returns nil unless there is a `keymap' property. */
1515 Lisp_Object keymap = get_local_map (pt, current_buffer, Qkeymap);
1516 Lisp_Object otlp = KVAR (current_kboard, Voverriding_terminal_local_map);
1517
1518 if (CONSP (position))
1519 {
1520 Lisp_Object string = POSN_STRING (position);
1521
1522 /* For a mouse click, get the local text-property keymap
1523 of the place clicked on, rather than point. */
1524
1525 if (POSN_INBUFFER_P (position))
1526 {
1527 Lisp_Object pos;
1528
1529 pos = POSN_BUFFER_POSN (position);
1530 if (INTEGERP (pos)
1531 && XINT (pos) >= BEG && XINT (pos) <= Z)
1532 {
1533 local_map = get_local_map (XINT (pos),
1534 current_buffer, Qlocal_map);
1535
1536 keymap = get_local_map (XINT (pos),
1537 current_buffer, Qkeymap);
1538 }
1539 }
1540
1541 /* If on a mode line string with a local keymap,
1542 or for a click on a string, i.e. overlay string or a
1543 string displayed via the `display' property,
1544 consider `local-map' and `keymap' properties of
1545 that string. */
1546
1547 if (CONSP (string) && STRINGP (XCAR (string)))
1548 {
1549 Lisp_Object pos, map;
1550
1551 pos = XCDR (string);
1552 string = XCAR (string);
1553 if (INTEGERP (pos)
1554 && XINT (pos) >= 0
1555 && XINT (pos) < SCHARS (string))
1556 {
1557 map = Fget_text_property (pos, Qlocal_map, string);
1558 if (!NILP (map))
1559 local_map = map;
1560
1561 map = Fget_text_property (pos, Qkeymap, string);
1562 if (!NILP (map))
1563 keymap = map;
1564 }
1565 }
1566
1567 }
1568
1569 if (!NILP (local_map))
1570 keymaps = Fcons (local_map, keymaps);
1571
1572 /* Now put all the minor mode keymaps on the list. */
1573 nmaps = current_minor_maps (0, &maps);
1574
1575 for (i = --nmaps; i >= 0; i--)
1576 if (!NILP (maps[i]))
1577 keymaps = Fcons (maps[i], keymaps);
1578
1579 if (!NILP (keymap))
1580 keymaps = Fcons (keymap, keymaps);
1581
1582 if (!NILP (olp) && !NILP (otlp))
1583 keymaps = Fcons (otlp, keymaps);
1584 }
1585
1586 unbind_to (count, Qnil);
1587
1588 return keymaps;
1589 }
1590
1591 /* GC is possible in this function if it autoloads a keymap. */
1592
1593 DEFUN ("key-binding", Fkey_binding, Skey_binding, 1, 4, 0,
1594 doc: /* Return the binding for command KEY in current keymaps.
1595 KEY is a string or vector, a sequence of keystrokes.
1596 The binding is probably a symbol with a function definition.
1597
1598 Normally, `key-binding' ignores bindings for t, which act as default
1599 bindings, used when nothing else in the keymap applies; this makes it
1600 usable as a general function for probing keymaps. However, if the
1601 optional second argument ACCEPT-DEFAULT is non-nil, `key-binding' does
1602 recognize the default bindings, just as `read-key-sequence' does.
1603
1604 Like the normal command loop, `key-binding' will remap the command
1605 resulting from looking up KEY by looking up the command in the
1606 current keymaps. However, if the optional third argument NO-REMAP
1607 is non-nil, `key-binding' returns the unmapped command.
1608
1609 If KEY is a key sequence initiated with the mouse, the used keymaps
1610 will depend on the clicked mouse position with regard to the buffer
1611 and possible local keymaps on strings.
1612
1613 If the optional argument POSITION is non-nil, it specifies a mouse
1614 position as returned by `event-start' and `event-end', and the lookup
1615 occurs in the keymaps associated with it instead of KEY. It can also
1616 be a number or marker, in which case the keymap properties at the
1617 specified buffer position instead of point are used.
1618 */)
1619 (Lisp_Object key, Lisp_Object accept_default, Lisp_Object no_remap, Lisp_Object position)
1620 {
1621 Lisp_Object value;
1622
1623 if (NILP (position) && VECTORP (key))
1624 {
1625 Lisp_Object event;
1626
1627 if (ASIZE (key) == 0)
1628 return Qnil;
1629
1630 /* mouse events may have a symbolic prefix indicating the
1631 scrollbar or mode line */
1632 event = AREF (key, SYMBOLP (AREF (key, 0)) && ASIZE (key) > 1 ? 1 : 0);
1633
1634 /* We are not interested in locations without event data */
1635
1636 if (EVENT_HAS_PARAMETERS (event) && CONSP (XCDR (event)))
1637 {
1638 Lisp_Object kind = EVENT_HEAD_KIND (EVENT_HEAD (event));
1639 if (EQ (kind, Qmouse_click))
1640 position = EVENT_START (event);
1641 }
1642 }
1643
1644 value = Flookup_key (Fcons (Qkeymap, Fcurrent_active_maps (Qt, position)),
1645 key, accept_default);
1646
1647 if (NILP (value) || INTEGERP (value))
1648 return Qnil;
1649
1650 /* If the result of the ordinary keymap lookup is an interactive
1651 command, look for a key binding (ie. remapping) for that command. */
1652
1653 if (NILP (no_remap) && SYMBOLP (value))
1654 {
1655 Lisp_Object value1;
1656 if (value1 = Fcommand_remapping (value, position, Qnil), !NILP (value1))
1657 value = value1;
1658 }
1659
1660 return value;
1661 }
1662
1663 /* GC is possible in this function if it autoloads a keymap. */
1664
1665 DEFUN ("local-key-binding", Flocal_key_binding, Slocal_key_binding, 1, 2, 0,
1666 doc: /* Return the binding for command KEYS in current local keymap only.
1667 KEYS is a string or vector, a sequence of keystrokes.
1668 The binding is probably a symbol with a function definition.
1669
1670 If optional argument ACCEPT-DEFAULT is non-nil, recognize default
1671 bindings; see the description of `lookup-key' for more details about this. */)
1672 (Lisp_Object keys, Lisp_Object accept_default)
1673 {
1674 register Lisp_Object map;
1675 map = BVAR (current_buffer, keymap);
1676 if (NILP (map))
1677 return Qnil;
1678 return Flookup_key (map, keys, accept_default);
1679 }
1680
1681 /* GC is possible in this function if it autoloads a keymap. */
1682
1683 DEFUN ("global-key-binding", Fglobal_key_binding, Sglobal_key_binding, 1, 2, 0,
1684 doc: /* Return the binding for command KEYS in current global keymap only.
1685 KEYS is a string or vector, a sequence of keystrokes.
1686 The binding is probably a symbol with a function definition.
1687 This function's return values are the same as those of `lookup-key'
1688 (which see).
1689
1690 If optional argument ACCEPT-DEFAULT is non-nil, recognize default
1691 bindings; see the description of `lookup-key' for more details about this. */)
1692 (Lisp_Object keys, Lisp_Object accept_default)
1693 {
1694 return Flookup_key (current_global_map, keys, accept_default);
1695 }
1696
1697 /* GC is possible in this function if it autoloads a keymap. */
1698
1699 DEFUN ("minor-mode-key-binding", Fminor_mode_key_binding, Sminor_mode_key_binding, 1, 2, 0,
1700 doc: /* Find the visible minor mode bindings of KEY.
1701 Return an alist of pairs (MODENAME . BINDING), where MODENAME is
1702 the symbol which names the minor mode binding KEY, and BINDING is
1703 KEY's definition in that mode. In particular, if KEY has no
1704 minor-mode bindings, return nil. If the first binding is a
1705 non-prefix, all subsequent bindings will be omitted, since they would
1706 be ignored. Similarly, the list doesn't include non-prefix bindings
1707 that come after prefix bindings.
1708
1709 If optional argument ACCEPT-DEFAULT is non-nil, recognize default
1710 bindings; see the description of `lookup-key' for more details about this. */)
1711 (Lisp_Object key, Lisp_Object accept_default)
1712 {
1713 Lisp_Object *modes, *maps;
1714 int nmaps;
1715 Lisp_Object binding;
1716 int i, j;
1717
1718 nmaps = current_minor_maps (&modes, &maps);
1719
1720 binding = Qnil;
1721
1722 for (i = j = 0; i < nmaps; i++)
1723 if (!NILP (maps[i])
1724 && !NILP (binding = Flookup_key (maps[i], key, accept_default))
1725 && !INTEGERP (binding))
1726 {
1727 if (KEYMAPP (binding))
1728 maps[j++] = Fcons (modes[i], binding);
1729 else if (j == 0)
1730 return list1 (Fcons (modes[i], binding));
1731 }
1732
1733 return Flist (j, maps);
1734 }
1735
1736 DEFUN ("define-prefix-command", Fdefine_prefix_command, Sdefine_prefix_command, 1, 3, 0,
1737 doc: /* Define COMMAND as a prefix command. COMMAND should be a symbol.
1738 A new sparse keymap is stored as COMMAND's function definition and its value.
1739 If a second optional argument MAPVAR is given, the map is stored as
1740 its value instead of as COMMAND's value; but COMMAND is still defined
1741 as a function.
1742 The third optional argument NAME, if given, supplies a menu name
1743 string for the map. This is required to use the keymap as a menu.
1744 This function returns COMMAND. */)
1745 (Lisp_Object command, Lisp_Object mapvar, Lisp_Object name)
1746 {
1747 Lisp_Object map;
1748 map = Fmake_sparse_keymap (name);
1749 Ffset (command, map);
1750 if (!NILP (mapvar))
1751 Fset (mapvar, map);
1752 else
1753 Fset (command, map);
1754 return command;
1755 }
1756
1757 DEFUN ("use-global-map", Fuse_global_map, Suse_global_map, 1, 1, 0,
1758 doc: /* Select KEYMAP as the global keymap. */)
1759 (Lisp_Object keymap)
1760 {
1761 keymap = get_keymap (keymap, 1, 1);
1762 current_global_map = keymap;
1763
1764 return Qnil;
1765 }
1766
1767 DEFUN ("use-local-map", Fuse_local_map, Suse_local_map, 1, 1, 0,
1768 doc: /* Select KEYMAP as the local keymap.
1769 If KEYMAP is nil, that means no local keymap. */)
1770 (Lisp_Object keymap)
1771 {
1772 if (!NILP (keymap))
1773 keymap = get_keymap (keymap, 1, 1);
1774
1775 bset_keymap (current_buffer, keymap);
1776
1777 return Qnil;
1778 }
1779
1780 DEFUN ("current-local-map", Fcurrent_local_map, Scurrent_local_map, 0, 0, 0,
1781 doc: /* Return current buffer's local keymap, or nil if it has none.
1782 Normally the local keymap is set by the major mode with `use-local-map'. */)
1783 (void)
1784 {
1785 return BVAR (current_buffer, keymap);
1786 }
1787
1788 DEFUN ("current-global-map", Fcurrent_global_map, Scurrent_global_map, 0, 0, 0,
1789 doc: /* Return the current global keymap. */)
1790 (void)
1791 {
1792 return current_global_map;
1793 }
1794
1795 DEFUN ("current-minor-mode-maps", Fcurrent_minor_mode_maps, Scurrent_minor_mode_maps, 0, 0, 0,
1796 doc: /* Return a list of keymaps for the minor modes of the current buffer. */)
1797 (void)
1798 {
1799 Lisp_Object *maps;
1800 int nmaps = current_minor_maps (0, &maps);
1801
1802 return Flist (nmaps, maps);
1803 }
1804 \f
1805 /* Help functions for describing and documenting keymaps. */
1806
1807 struct accessible_keymaps_data {
1808 Lisp_Object maps, tail, thisseq;
1809 /* Does the current sequence end in the meta-prefix-char? */
1810 bool is_metized;
1811 };
1812
1813 static void
1814 accessible_keymaps_1 (Lisp_Object key, Lisp_Object cmd, Lisp_Object args, void *data)
1815 /* Use void * data to be compatible with map_keymap_function_t. */
1816 {
1817 struct accessible_keymaps_data *d = data; /* Cast! */
1818 Lisp_Object maps = d->maps;
1819 Lisp_Object tail = d->tail;
1820 Lisp_Object thisseq = d->thisseq;
1821 bool is_metized = d->is_metized && INTEGERP (key);
1822 Lisp_Object tem;
1823
1824 cmd = get_keymap (get_keyelt (cmd, 0), 0, 0);
1825 if (NILP (cmd))
1826 return;
1827
1828 /* Look for and break cycles. */
1829 while (!NILP (tem = Frassq (cmd, maps)))
1830 {
1831 Lisp_Object prefix = XCAR (tem);
1832 ptrdiff_t lim = XINT (Flength (XCAR (tem)));
1833 if (lim <= XINT (Flength (thisseq)))
1834 { /* This keymap was already seen with a smaller prefix. */
1835 ptrdiff_t i = 0;
1836 while (i < lim && EQ (Faref (prefix, make_number (i)),
1837 Faref (thisseq, make_number (i))))
1838 i++;
1839 if (i >= lim)
1840 /* `prefix' is a prefix of `thisseq' => there's a cycle. */
1841 return;
1842 }
1843 /* This occurrence of `cmd' in `maps' does not correspond to a cycle,
1844 but maybe `cmd' occurs again further down in `maps', so keep
1845 looking. */
1846 maps = XCDR (Fmemq (tem, maps));
1847 }
1848
1849 /* If the last key in thisseq is meta-prefix-char,
1850 turn it into a meta-ized keystroke. We know
1851 that the event we're about to append is an
1852 ascii keystroke since we're processing a
1853 keymap table. */
1854 if (is_metized)
1855 {
1856 int meta_bit = meta_modifier;
1857 Lisp_Object last = make_number (XINT (Flength (thisseq)) - 1);
1858 tem = Fcopy_sequence (thisseq);
1859
1860 Faset (tem, last, make_number (XINT (key) | meta_bit));
1861
1862 /* This new sequence is the same length as
1863 thisseq, so stick it in the list right
1864 after this one. */
1865 XSETCDR (tail,
1866 Fcons (Fcons (tem, cmd), XCDR (tail)));
1867 }
1868 else
1869 {
1870 tem = append_key (thisseq, key);
1871 nconc2 (tail, list1 (Fcons (tem, cmd)));
1872 }
1873 }
1874
1875 /* This function cannot GC. */
1876
1877 DEFUN ("accessible-keymaps", Faccessible_keymaps, Saccessible_keymaps,
1878 1, 2, 0,
1879 doc: /* Find all keymaps accessible via prefix characters from KEYMAP.
1880 Returns a list of elements of the form (KEYS . MAP), where the sequence
1881 KEYS starting from KEYMAP gets you to MAP. These elements are ordered
1882 so that the KEYS increase in length. The first element is ([] . KEYMAP).
1883 An optional argument PREFIX, if non-nil, should be a key sequence;
1884 then the value includes only maps for prefixes that start with PREFIX. */)
1885 (Lisp_Object keymap, Lisp_Object prefix)
1886 {
1887 Lisp_Object maps, tail;
1888 EMACS_INT prefixlen = XFASTINT (Flength (prefix));
1889
1890 if (!NILP (prefix))
1891 {
1892 /* If a prefix was specified, start with the keymap (if any) for
1893 that prefix, so we don't waste time considering other prefixes. */
1894 Lisp_Object tem;
1895 tem = Flookup_key (keymap, prefix, Qt);
1896 /* Flookup_key may give us nil, or a number,
1897 if the prefix is not defined in this particular map.
1898 It might even give us a list that isn't a keymap. */
1899 tem = get_keymap (tem, 0, 0);
1900 /* If the keymap is autoloaded `tem' is not a cons-cell, but we still
1901 want to return it. */
1902 if (!NILP (tem))
1903 {
1904 /* Convert PREFIX to a vector now, so that later on
1905 we don't have to deal with the possibility of a string. */
1906 if (STRINGP (prefix))
1907 {
1908 int i, i_byte, c;
1909 Lisp_Object copy;
1910
1911 copy = Fmake_vector (make_number (SCHARS (prefix)), Qnil);
1912 for (i = 0, i_byte = 0; i < SCHARS (prefix);)
1913 {
1914 int i_before = i;
1915
1916 FETCH_STRING_CHAR_ADVANCE (c, prefix, i, i_byte);
1917 if (SINGLE_BYTE_CHAR_P (c) && (c & 0200))
1918 c ^= 0200 | meta_modifier;
1919 ASET (copy, i_before, make_number (c));
1920 }
1921 prefix = copy;
1922 }
1923 maps = list1 (Fcons (prefix, tem));
1924 }
1925 else
1926 return Qnil;
1927 }
1928 else
1929 maps = list1 (Fcons (zero_vector, get_keymap (keymap, 1, 0)));
1930
1931 /* For each map in the list maps,
1932 look at any other maps it points to,
1933 and stick them at the end if they are not already in the list.
1934
1935 This is a breadth-first traversal, where tail is the queue of
1936 nodes, and maps accumulates a list of all nodes visited. */
1937
1938 for (tail = maps; CONSP (tail); tail = XCDR (tail))
1939 {
1940 struct accessible_keymaps_data data;
1941 register Lisp_Object thismap = Fcdr (XCAR (tail));
1942 Lisp_Object last;
1943
1944 data.thisseq = Fcar (XCAR (tail));
1945 data.maps = maps;
1946 data.tail = tail;
1947 last = make_number (XINT (Flength (data.thisseq)) - 1);
1948 /* Does the current sequence end in the meta-prefix-char? */
1949 data.is_metized = (XINT (last) >= 0
1950 /* Don't metize the last char of PREFIX. */
1951 && XINT (last) >= prefixlen
1952 && EQ (Faref (data.thisseq, last), meta_prefix_char));
1953
1954 /* Since we can't run lisp code, we can't scan autoloaded maps. */
1955 if (CONSP (thismap))
1956 map_keymap (thismap, accessible_keymaps_1, Qnil, &data, 0);
1957 }
1958 return maps;
1959 }
1960
1961 /* This function cannot GC. */
1962
1963 DEFUN ("key-description", Fkey_description, Skey_description, 1, 2, 0,
1964 doc: /* Return a pretty description of key-sequence KEYS.
1965 Optional arg PREFIX is the sequence of keys leading up to KEYS.
1966 For example, [?\C-x ?l] is converted into the string \"C-x l\".
1967
1968 For an approximate inverse of this, see `kbd'. */)
1969 (Lisp_Object keys, Lisp_Object prefix)
1970 {
1971 ptrdiff_t len = 0;
1972 EMACS_INT i;
1973 ptrdiff_t i_byte;
1974 Lisp_Object *args;
1975 EMACS_INT size = XINT (Flength (keys));
1976 Lisp_Object list;
1977 Lisp_Object sep = build_string (" ");
1978 Lisp_Object key;
1979 Lisp_Object result;
1980 bool add_meta = 0;
1981 USE_SAFE_ALLOCA;
1982
1983 if (!NILP (prefix))
1984 size += XINT (Flength (prefix));
1985
1986 /* This has one extra element at the end that we don't pass to Fconcat. */
1987 if (min (PTRDIFF_MAX, SIZE_MAX) / word_size / 4 < size)
1988 memory_full (SIZE_MAX);
1989 SAFE_ALLOCA_LISP (args, size * 4);
1990
1991 /* In effect, this computes
1992 (mapconcat 'single-key-description keys " ")
1993 but we shouldn't use mapconcat because it can do GC. */
1994
1995 next_list:
1996 if (!NILP (prefix))
1997 list = prefix, prefix = Qnil;
1998 else if (!NILP (keys))
1999 list = keys, keys = Qnil;
2000 else
2001 {
2002 if (add_meta)
2003 {
2004 args[len] = Fsingle_key_description (meta_prefix_char, Qnil);
2005 result = Fconcat (len + 1, args);
2006 }
2007 else if (len == 0)
2008 result = empty_unibyte_string;
2009 else
2010 result = Fconcat (len - 1, args);
2011 SAFE_FREE ();
2012 return result;
2013 }
2014
2015 if (STRINGP (list))
2016 size = SCHARS (list);
2017 else if (VECTORP (list))
2018 size = ASIZE (list);
2019 else if (CONSP (list))
2020 size = XINT (Flength (list));
2021 else
2022 wrong_type_argument (Qarrayp, list);
2023
2024 i = i_byte = 0;
2025
2026 while (i < size)
2027 {
2028 if (STRINGP (list))
2029 {
2030 int c;
2031 FETCH_STRING_CHAR_ADVANCE (c, list, i, i_byte);
2032 if (SINGLE_BYTE_CHAR_P (c) && (c & 0200))
2033 c ^= 0200 | meta_modifier;
2034 XSETFASTINT (key, c);
2035 }
2036 else if (VECTORP (list))
2037 {
2038 key = AREF (list, i); i++;
2039 }
2040 else
2041 {
2042 key = XCAR (list);
2043 list = XCDR (list);
2044 i++;
2045 }
2046
2047 if (add_meta)
2048 {
2049 if (!INTEGERP (key)
2050 || EQ (key, meta_prefix_char)
2051 || (XINT (key) & meta_modifier))
2052 {
2053 args[len++] = Fsingle_key_description (meta_prefix_char, Qnil);
2054 args[len++] = sep;
2055 if (EQ (key, meta_prefix_char))
2056 continue;
2057 }
2058 else
2059 XSETINT (key, XINT (key) | meta_modifier);
2060 add_meta = 0;
2061 }
2062 else if (EQ (key, meta_prefix_char))
2063 {
2064 add_meta = 1;
2065 continue;
2066 }
2067 args[len++] = Fsingle_key_description (key, Qnil);
2068 args[len++] = sep;
2069 }
2070 goto next_list;
2071 }
2072
2073
2074 char *
2075 push_key_description (EMACS_INT ch, char *p)
2076 {
2077 int c, c2;
2078 bool tab_as_ci;
2079
2080 /* Clear all the meaningless bits above the meta bit. */
2081 c = ch & (meta_modifier | ~ - meta_modifier);
2082 c2 = c & ~(alt_modifier | ctrl_modifier | hyper_modifier
2083 | meta_modifier | shift_modifier | super_modifier);
2084
2085 if (! CHARACTERP (make_number (c2)))
2086 {
2087 /* KEY_DESCRIPTION_SIZE is large enough for this. */
2088 p += sprintf (p, "[%d]", c);
2089 return p;
2090 }
2091
2092 tab_as_ci = (c2 == '\t' && (c & meta_modifier));
2093
2094 if (c & alt_modifier)
2095 {
2096 *p++ = 'A';
2097 *p++ = '-';
2098 c -= alt_modifier;
2099 }
2100 if ((c & ctrl_modifier) != 0
2101 || (c2 < ' ' && c2 != 27 && c2 != '\t' && c2 != Ctl ('M'))
2102 || tab_as_ci)
2103 {
2104 *p++ = 'C';
2105 *p++ = '-';
2106 c &= ~ctrl_modifier;
2107 }
2108 if (c & hyper_modifier)
2109 {
2110 *p++ = 'H';
2111 *p++ = '-';
2112 c -= hyper_modifier;
2113 }
2114 if (c & meta_modifier)
2115 {
2116 *p++ = 'M';
2117 *p++ = '-';
2118 c -= meta_modifier;
2119 }
2120 if (c & shift_modifier)
2121 {
2122 *p++ = 'S';
2123 *p++ = '-';
2124 c -= shift_modifier;
2125 }
2126 if (c & super_modifier)
2127 {
2128 *p++ = 's';
2129 *p++ = '-';
2130 c -= super_modifier;
2131 }
2132 if (c < 040)
2133 {
2134 if (c == 033)
2135 {
2136 *p++ = 'E';
2137 *p++ = 'S';
2138 *p++ = 'C';
2139 }
2140 else if (tab_as_ci)
2141 {
2142 *p++ = 'i';
2143 }
2144 else if (c == '\t')
2145 {
2146 *p++ = 'T';
2147 *p++ = 'A';
2148 *p++ = 'B';
2149 }
2150 else if (c == Ctl ('M'))
2151 {
2152 *p++ = 'R';
2153 *p++ = 'E';
2154 *p++ = 'T';
2155 }
2156 else
2157 {
2158 /* `C-' already added above. */
2159 if (c > 0 && c <= Ctl ('Z'))
2160 *p++ = c + 0140;
2161 else
2162 *p++ = c + 0100;
2163 }
2164 }
2165 else if (c == 0177)
2166 {
2167 *p++ = 'D';
2168 *p++ = 'E';
2169 *p++ = 'L';
2170 }
2171 else if (c == ' ')
2172 {
2173 *p++ = 'S';
2174 *p++ = 'P';
2175 *p++ = 'C';
2176 }
2177 else if (c < 128)
2178 *p++ = c;
2179 else
2180 {
2181 /* Now we are sure that C is a valid character code. */
2182 p += CHAR_STRING (c, (unsigned char *) p);
2183 }
2184
2185 return p;
2186 }
2187
2188 /* This function cannot GC. */
2189
2190 DEFUN ("single-key-description", Fsingle_key_description,
2191 Ssingle_key_description, 1, 2, 0,
2192 doc: /* Return a pretty description of command character KEY.
2193 Control characters turn into C-whatever, etc.
2194 Optional argument NO-ANGLES non-nil means don't put angle brackets
2195 around function keys and event symbols. */)
2196 (Lisp_Object key, Lisp_Object no_angles)
2197 {
2198 USE_SAFE_ALLOCA;
2199
2200 if (CONSP (key) && lucid_event_type_list_p (key))
2201 key = Fevent_convert_list (key);
2202
2203 if (CONSP (key) && INTEGERP (XCAR (key)) && INTEGERP (XCDR (key)))
2204 /* An interval from a map-char-table. */
2205 {
2206 AUTO_STRING (dot_dot, "..");
2207 return concat3 (Fsingle_key_description (XCAR (key), no_angles),
2208 dot_dot,
2209 Fsingle_key_description (XCDR (key), no_angles));
2210 }
2211
2212 key = EVENT_HEAD (key);
2213
2214 if (INTEGERP (key)) /* Normal character. */
2215 {
2216 char tem[KEY_DESCRIPTION_SIZE];
2217 char *p = push_key_description (XINT (key), tem);
2218 *p = 0;
2219 return make_specified_string (tem, -1, p - tem, 1);
2220 }
2221 else if (SYMBOLP (key)) /* Function key or event-symbol. */
2222 {
2223 if (NILP (no_angles))
2224 {
2225 Lisp_Object result;
2226 char *buffer = SAFE_ALLOCA (sizeof "<>"
2227 + SBYTES (SYMBOL_NAME (key)));
2228 esprintf (buffer, "<%s>", SDATA (SYMBOL_NAME (key)));
2229 result = build_string (buffer);
2230 SAFE_FREE ();
2231 return result;
2232 }
2233 else
2234 return Fsymbol_name (key);
2235 }
2236 else if (STRINGP (key)) /* Buffer names in the menubar. */
2237 return Fcopy_sequence (key);
2238 else
2239 error ("KEY must be an integer, cons, symbol, or string");
2240 }
2241
2242 static char *
2243 push_text_char_description (register unsigned int c, register char *p)
2244 {
2245 if (c >= 0200)
2246 {
2247 *p++ = 'M';
2248 *p++ = '-';
2249 c -= 0200;
2250 }
2251 if (c < 040)
2252 {
2253 *p++ = '^';
2254 *p++ = c + 64; /* 'A' - 1 */
2255 }
2256 else if (c == 0177)
2257 {
2258 *p++ = '^';
2259 *p++ = '?';
2260 }
2261 else
2262 *p++ = c;
2263 return p;
2264 }
2265
2266 /* This function cannot GC. */
2267
2268 DEFUN ("text-char-description", Ftext_char_description, Stext_char_description, 1, 1, 0,
2269 doc: /* Return a pretty description of file-character CHARACTER.
2270 Control characters turn into "^char", etc. This differs from
2271 `single-key-description' which turns them into "C-char".
2272 Also, this function recognizes the 2**7 bit as the Meta character,
2273 whereas `single-key-description' uses the 2**27 bit for Meta.
2274 See Info node `(elisp)Describing Characters' for examples. */)
2275 (Lisp_Object character)
2276 {
2277 /* Currently MAX_MULTIBYTE_LENGTH is 4 (< 6). */
2278 char str[6];
2279 int c;
2280
2281 CHECK_CHARACTER (character);
2282
2283 c = XINT (character);
2284 if (!ASCII_CHAR_P (c))
2285 {
2286 int len = CHAR_STRING (c, (unsigned char *) str);
2287
2288 return make_multibyte_string (str, 1, len);
2289 }
2290
2291 *push_text_char_description (c & 0377, str) = 0;
2292
2293 return build_string (str);
2294 }
2295
2296 static int where_is_preferred_modifier;
2297
2298 /* Return 0 if SEQ uses non-preferred modifiers or non-char events.
2299 Else, return 2 if SEQ uses the where_is_preferred_modifier,
2300 and 1 otherwise. */
2301 static int
2302 preferred_sequence_p (Lisp_Object seq)
2303 {
2304 EMACS_INT i;
2305 EMACS_INT len = XFASTINT (Flength (seq));
2306 int result = 1;
2307
2308 for (i = 0; i < len; i++)
2309 {
2310 Lisp_Object ii, elt;
2311
2312 XSETFASTINT (ii, i);
2313 elt = Faref (seq, ii);
2314
2315 if (!INTEGERP (elt))
2316 return 0;
2317 else
2318 {
2319 int modifiers = XINT (elt) & (CHAR_MODIFIER_MASK & ~CHAR_META);
2320 if (modifiers == where_is_preferred_modifier)
2321 result = 2;
2322 else if (modifiers)
2323 return 0;
2324 }
2325 }
2326
2327 return result;
2328 }
2329
2330 \f
2331 /* where-is - finding a command in a set of keymaps. */
2332
2333 static void where_is_internal_1 (Lisp_Object key, Lisp_Object binding,
2334 Lisp_Object args, void *data);
2335
2336 /* Like Flookup_key, but uses a list of keymaps SHADOW instead of a single map.
2337 Returns the first non-nil binding found in any of those maps.
2338 If REMAP is true, pass the result of the lookup through command
2339 remapping before returning it. */
2340
2341 static Lisp_Object
2342 shadow_lookup (Lisp_Object shadow, Lisp_Object key, Lisp_Object flag,
2343 bool remap)
2344 {
2345 Lisp_Object tail, value;
2346
2347 for (tail = shadow; CONSP (tail); tail = XCDR (tail))
2348 {
2349 value = Flookup_key (XCAR (tail), key, flag);
2350 if (NATNUMP (value))
2351 {
2352 value = Flookup_key (XCAR (tail),
2353 Fsubstring (key, make_number (0), value), flag);
2354 if (!NILP (value))
2355 return Qnil;
2356 }
2357 else if (!NILP (value))
2358 {
2359 Lisp_Object remapping;
2360 if (remap && SYMBOLP (value)
2361 && (remapping = Fcommand_remapping (value, Qnil, shadow),
2362 !NILP (remapping)))
2363 return remapping;
2364 else
2365 return value;
2366 }
2367 }
2368 return Qnil;
2369 }
2370
2371 static Lisp_Object Vmouse_events;
2372
2373 struct where_is_internal_data {
2374 Lisp_Object definition, this, last;
2375 bool last_is_meta, noindirect;
2376 Lisp_Object sequences;
2377 };
2378
2379 /* This function can't GC, AFAIK. */
2380 /* Return the list of bindings found. This list is ordered "longest
2381 to shortest". It may include bindings that are actually shadowed
2382 by others, as well as duplicate bindings and remapping bindings.
2383 The list returned is potentially shared with where_is_cache, so
2384 be careful not to modify it via side-effects. */
2385
2386 static Lisp_Object
2387 where_is_internal (Lisp_Object definition, Lisp_Object keymaps,
2388 bool noindirect, bool nomenus)
2389 {
2390 Lisp_Object maps = Qnil;
2391 Lisp_Object found;
2392 struct where_is_internal_data data;
2393
2394 /* Only important use of caching is for the menubar
2395 (i.e. where-is-internal called with (def nil t nil nil)). */
2396 if (nomenus && !noindirect)
2397 {
2398 /* Check heuristic-consistency of the cache. */
2399 if (NILP (Fequal (keymaps, where_is_cache_keymaps)))
2400 where_is_cache = Qnil;
2401
2402 if (NILP (where_is_cache))
2403 {
2404 /* We need to create the cache. */
2405 where_is_cache = Fmake_hash_table (0, NULL);
2406 where_is_cache_keymaps = Qt;
2407 }
2408 else
2409 /* We can reuse the cache. */
2410 return Fgethash (definition, where_is_cache, Qnil);
2411 }
2412 else
2413 /* Kill the cache so that where_is_internal_1 doesn't think
2414 we're filling it up. */
2415 where_is_cache = Qnil;
2416
2417 found = keymaps;
2418 while (CONSP (found))
2419 {
2420 maps =
2421 nconc2 (maps,
2422 Faccessible_keymaps (get_keymap (XCAR (found), 1, 0), Qnil));
2423 found = XCDR (found);
2424 }
2425
2426 data.sequences = Qnil;
2427 for (; CONSP (maps); maps = XCDR (maps))
2428 {
2429 /* Key sequence to reach map, and the map that it reaches */
2430 register Lisp_Object this, map, tem;
2431
2432 /* In order to fold [META-PREFIX-CHAR CHAR] sequences into
2433 [M-CHAR] sequences, check if last character of the sequence
2434 is the meta-prefix char. */
2435 Lisp_Object last;
2436 bool last_is_meta;
2437
2438 this = Fcar (XCAR (maps));
2439 map = Fcdr (XCAR (maps));
2440 last = make_number (XINT (Flength (this)) - 1);
2441 last_is_meta = (XINT (last) >= 0
2442 && EQ (Faref (this, last), meta_prefix_char));
2443
2444 /* if (nomenus && !preferred_sequence_p (this)) */
2445 if (nomenus && XINT (last) >= 0
2446 && SYMBOLP (tem = Faref (this, make_number (0)))
2447 && !NILP (Fmemq (XCAR (parse_modifiers (tem)), Vmouse_events)))
2448 /* If no menu entries should be returned, skip over the
2449 keymaps bound to `menu-bar' and `tool-bar' and other
2450 non-ascii prefixes like `C-down-mouse-2'. */
2451 continue;
2452
2453 QUIT;
2454
2455 data.definition = definition;
2456 data.noindirect = noindirect;
2457 data.this = this;
2458 data.last = last;
2459 data.last_is_meta = last_is_meta;
2460
2461 if (CONSP (map))
2462 map_keymap (map, where_is_internal_1, Qnil, &data, 0);
2463 }
2464
2465 if (nomenus && !noindirect)
2466 { /* Remember for which keymaps this cache was built.
2467 We do it here (late) because we want to keep where_is_cache_keymaps
2468 set to t while the cache isn't fully filled. */
2469 where_is_cache_keymaps = keymaps;
2470 /* During cache-filling, data.sequences is not filled by
2471 where_is_internal_1. */
2472 return Fgethash (definition, where_is_cache, Qnil);
2473 }
2474 else
2475 return data.sequences;
2476 }
2477
2478 /* This function can GC if Flookup_key autoloads any keymaps. */
2479
2480 DEFUN ("where-is-internal", Fwhere_is_internal, Swhere_is_internal, 1, 5, 0,
2481 doc: /* Return list of keys that invoke DEFINITION.
2482 If KEYMAP is a keymap, search only KEYMAP and the global keymap.
2483 If KEYMAP is nil, search all the currently active keymaps, except
2484 for `overriding-local-map' (which is ignored).
2485 If KEYMAP is a list of keymaps, search only those keymaps.
2486
2487 If optional 3rd arg FIRSTONLY is non-nil, return the first key sequence found,
2488 rather than a list of all possible key sequences.
2489 If FIRSTONLY is the symbol `non-ascii', return the first binding found,
2490 no matter what it is.
2491 If FIRSTONLY has another non-nil value, prefer bindings
2492 that use the modifier key specified in `where-is-preferred-modifier'
2493 (or their meta variants) and entirely reject menu bindings.
2494
2495 If optional 4th arg NOINDIRECT is non-nil, don't extract the commands inside
2496 menu-items. This makes it possible to search for a menu-item itself.
2497
2498 The optional 5th arg NO-REMAP alters how command remapping is handled:
2499
2500 - If another command OTHER-COMMAND is remapped to DEFINITION, normally
2501 search for the bindings of OTHER-COMMAND and include them in the
2502 returned list. But if NO-REMAP is non-nil, include the vector
2503 [remap OTHER-COMMAND] in the returned list instead, without
2504 searching for those other bindings.
2505
2506 - If DEFINITION is remapped to OTHER-COMMAND, normally return the
2507 bindings for OTHER-COMMAND. But if NO-REMAP is non-nil, return the
2508 bindings for DEFINITION instead, ignoring its remapping. */)
2509 (Lisp_Object definition, Lisp_Object keymap, Lisp_Object firstonly, Lisp_Object noindirect, Lisp_Object no_remap)
2510 {
2511 /* The keymaps in which to search. */
2512 Lisp_Object keymaps;
2513 /* Potentially relevant bindings in "shortest to longest" order. */
2514 Lisp_Object sequences = Qnil;
2515 /* Actually relevant bindings. */
2516 Lisp_Object found = Qnil;
2517 /* 1 means ignore all menu bindings entirely. */
2518 bool nomenus = !NILP (firstonly) && !EQ (firstonly, Qnon_ascii);
2519 /* List of sequences found via remapping. Keep them in a separate
2520 variable, so as to push them later, since we prefer
2521 non-remapped binding. */
2522 Lisp_Object remapped_sequences = Qnil;
2523 /* Whether or not we're handling remapped sequences. This is needed
2524 because remapping is not done recursively by Fcommand_remapping: you
2525 can't remap a remapped command. */
2526 bool remapped = 0;
2527 Lisp_Object tem = Qnil;
2528
2529 /* Refresh the C version of the modifier preference. */
2530 where_is_preferred_modifier
2531 = parse_solitary_modifier (Vwhere_is_preferred_modifier);
2532
2533 /* Find the relevant keymaps. */
2534 if (CONSP (keymap) && KEYMAPP (XCAR (keymap)))
2535 keymaps = keymap;
2536 else if (!NILP (keymap))
2537 keymaps = list2 (keymap, current_global_map);
2538 else
2539 keymaps = Fcurrent_active_maps (Qnil, Qnil);
2540
2541 tem = Fcommand_remapping (definition, Qnil, keymaps);
2542 /* If `definition' is remapped to tem', then OT1H no key will run
2543 that command (since they will run `tem' instead), so we should
2544 return nil; but OTOH all keys bound to `definition' (or to `tem')
2545 will run the same command.
2546 So for menu-shortcut purposes, we want to find all the keys bound (maybe
2547 via remapping) to `tem'. But for the purpose of finding the keys that
2548 run `definition', then we'd want to just return nil.
2549 We choose to make it work right for menu-shortcuts, since it's the most
2550 common use.
2551 Known bugs: if you remap switch-to-buffer to toto, C-h f switch-to-buffer
2552 will tell you that switch-to-buffer is bound to C-x b even though C-x b
2553 will run toto instead. And if `toto' is itself remapped to forward-char,
2554 then C-h f toto will tell you that it's bound to C-f even though C-f does
2555 not run toto and it won't tell you that C-x b does run toto. */
2556 if (NILP (no_remap) && !NILP (tem))
2557 definition = tem;
2558
2559 if (SYMBOLP (definition)
2560 && !NILP (firstonly)
2561 && !NILP (tem = Fget (definition, QCadvertised_binding)))
2562 {
2563 /* We have a list of advertised bindings. */
2564 while (CONSP (tem))
2565 if (EQ (shadow_lookup (keymaps, XCAR (tem), Qnil, 0), definition))
2566 return XCAR (tem);
2567 else
2568 tem = XCDR (tem);
2569 if (EQ (shadow_lookup (keymaps, tem, Qnil, 0), definition))
2570 return tem;
2571 }
2572
2573 sequences = Freverse (where_is_internal (definition, keymaps,
2574 !NILP (noindirect), nomenus));
2575
2576 while (CONSP (sequences)
2577 /* If we're at the end of the `sequences' list and we haven't
2578 considered remapped sequences yet, copy them over and
2579 process them. */
2580 || (!remapped && (sequences = remapped_sequences,
2581 remapped = 1,
2582 CONSP (sequences))))
2583 {
2584 Lisp_Object sequence, function;
2585
2586 sequence = XCAR (sequences);
2587 sequences = XCDR (sequences);
2588
2589 /* Verify that this key binding is not shadowed by another
2590 binding for the same key, before we say it exists.
2591
2592 Mechanism: look for local definition of this key and if
2593 it is defined and does not match what we found then
2594 ignore this key.
2595
2596 Either nil or number as value from Flookup_key
2597 means undefined. */
2598 if (NILP (Fequal (shadow_lookup (keymaps, sequence, Qnil, remapped),
2599 definition)))
2600 continue;
2601
2602 /* If the current sequence is a command remapping with
2603 format [remap COMMAND], find the key sequences
2604 which run COMMAND, and use those sequences instead. */
2605 if (NILP (no_remap) && !remapped
2606 && VECTORP (sequence) && ASIZE (sequence) == 2
2607 && EQ (AREF (sequence, 0), Qremap)
2608 && (function = AREF (sequence, 1), SYMBOLP (function)))
2609 {
2610 Lisp_Object seqs = where_is_internal (function, keymaps,
2611 !NILP (noindirect), nomenus);
2612 remapped_sequences = nconc2 (Freverse (seqs), remapped_sequences);
2613 continue;
2614 }
2615
2616 /* Don't annoy user with strings from a menu such as the
2617 entries from the "Edit => Paste from Kill Menu".
2618 Change them all to "(any string)", so that there
2619 seems to be only one menu item to report. */
2620 if (! NILP (sequence))
2621 {
2622 Lisp_Object tem1;
2623 tem1 = Faref (sequence, make_number (ASIZE (sequence) - 1));
2624 if (STRINGP (tem1))
2625 Faset (sequence, make_number (ASIZE (sequence) - 1),
2626 build_string ("(any string)"));
2627 }
2628
2629 /* It is a true unshadowed match. Record it, unless it's already
2630 been seen (as could happen when inheriting keymaps). */
2631 if (NILP (Fmember (sequence, found)))
2632 found = Fcons (sequence, found);
2633
2634 /* If firstonly is Qnon_ascii, then we can return the first
2635 binding we find. If firstonly is not Qnon_ascii but not
2636 nil, then we should return the first ascii-only binding
2637 we find. */
2638 if (EQ (firstonly, Qnon_ascii))
2639 return sequence;
2640 else if (!NILP (firstonly)
2641 && 2 == preferred_sequence_p (sequence))
2642 return sequence;
2643 }
2644
2645 found = Fnreverse (found);
2646
2647 /* firstonly may have been t, but we may have gone all the way through
2648 the keymaps without finding an all-ASCII key sequence. So just
2649 return the best we could find. */
2650 if (NILP (firstonly))
2651 return found;
2652 else if (where_is_preferred_modifier == 0)
2653 return Fcar (found);
2654 else
2655 { /* Maybe we did not find a preferred_modifier binding, but we did find
2656 some ASCII binding. */
2657 Lisp_Object bindings = found;
2658 while (CONSP (bindings))
2659 if (preferred_sequence_p (XCAR (bindings)))
2660 return XCAR (bindings);
2661 else
2662 bindings = XCDR (bindings);
2663 return Fcar (found);
2664 }
2665 }
2666
2667 /* This function can GC because get_keyelt can. */
2668
2669 static void
2670 where_is_internal_1 (Lisp_Object key, Lisp_Object binding, Lisp_Object args, void *data)
2671 {
2672 struct where_is_internal_data *d = data; /* Cast! */
2673 Lisp_Object definition = d->definition;
2674 bool noindirect = d->noindirect;
2675 Lisp_Object this = d->this;
2676 Lisp_Object last = d->last;
2677 bool last_is_meta = d->last_is_meta;
2678 Lisp_Object sequence;
2679
2680 /* Search through indirections unless that's not wanted. */
2681 if (!noindirect)
2682 binding = get_keyelt (binding, 0);
2683
2684 /* End this iteration if this element does not match
2685 the target. */
2686
2687 if (!(!NILP (where_is_cache) /* everything "matches" during cache-fill. */
2688 || EQ (binding, definition)
2689 || (CONSP (definition) && !NILP (Fequal (binding, definition)))))
2690 /* Doesn't match. */
2691 return;
2692
2693 /* We have found a match. Construct the key sequence where we found it. */
2694 if (INTEGERP (key) && last_is_meta)
2695 {
2696 sequence = Fcopy_sequence (this);
2697 Faset (sequence, last, make_number (XINT (key) | meta_modifier));
2698 }
2699 else
2700 {
2701 if (CONSP (key))
2702 key = Fcons (XCAR (key), XCDR (key));
2703 sequence = append_key (this, key);
2704 }
2705
2706 if (!NILP (where_is_cache))
2707 {
2708 Lisp_Object sequences = Fgethash (binding, where_is_cache, Qnil);
2709 Fputhash (binding, Fcons (sequence, sequences), where_is_cache);
2710 }
2711 else
2712 d->sequences = Fcons (sequence, d->sequences);
2713 }
2714 \f
2715 /* describe-bindings - summarizing all the bindings in a set of keymaps. */
2716
2717 DEFUN ("describe-buffer-bindings", Fdescribe_buffer_bindings, Sdescribe_buffer_bindings, 1, 3, 0,
2718 doc: /* Insert the list of all defined keys and their definitions.
2719 The list is inserted in the current buffer, while the bindings are
2720 looked up in BUFFER.
2721 The optional argument PREFIX, if non-nil, should be a key sequence;
2722 then we display only bindings that start with that prefix.
2723 The optional argument MENUS, if non-nil, says to mention menu bindings.
2724 (Ordinarily these are omitted from the output.) */)
2725 (Lisp_Object buffer, Lisp_Object prefix, Lisp_Object menus)
2726 {
2727 Lisp_Object outbuf, shadow;
2728 bool nomenu = NILP (menus);
2729 Lisp_Object start1;
2730
2731 const char *alternate_heading
2732 = "\
2733 Keyboard translations:\n\n\
2734 You type Translation\n\
2735 -------- -----------\n";
2736
2737 CHECK_BUFFER (buffer);
2738
2739 shadow = Qnil;
2740 outbuf = Fcurrent_buffer ();
2741
2742 /* Report on alternates for keys. */
2743 if (STRINGP (KVAR (current_kboard, Vkeyboard_translate_table)) && !NILP (prefix))
2744 {
2745 int c;
2746 const unsigned char *translate = SDATA (KVAR (current_kboard, Vkeyboard_translate_table));
2747 int translate_len = SCHARS (KVAR (current_kboard, Vkeyboard_translate_table));
2748
2749 for (c = 0; c < translate_len; c++)
2750 if (translate[c] != c)
2751 {
2752 char buf[KEY_DESCRIPTION_SIZE];
2753 char *bufend;
2754
2755 if (alternate_heading)
2756 {
2757 insert_string (alternate_heading);
2758 alternate_heading = 0;
2759 }
2760
2761 bufend = push_key_description (translate[c], buf);
2762 insert (buf, bufend - buf);
2763 Findent_to (make_number (16), make_number (1));
2764 bufend = push_key_description (c, buf);
2765 insert (buf, bufend - buf);
2766
2767 insert ("\n", 1);
2768
2769 /* Insert calls signal_after_change which may GC. */
2770 translate = SDATA (KVAR (current_kboard, Vkeyboard_translate_table));
2771 }
2772
2773 insert ("\n", 1);
2774 }
2775
2776 if (!NILP (Vkey_translation_map))
2777 describe_map_tree (Vkey_translation_map, 0, Qnil, prefix,
2778 "Key translations", nomenu, 1, 0, 0);
2779
2780
2781 /* Print the (major mode) local map. */
2782 start1 = Qnil;
2783 if (!NILP (KVAR (current_kboard, Voverriding_terminal_local_map)))
2784 start1 = KVAR (current_kboard, Voverriding_terminal_local_map);
2785
2786 if (!NILP (start1))
2787 {
2788 describe_map_tree (start1, 1, shadow, prefix,
2789 "\f\nOverriding Bindings", nomenu, 0, 0, 0);
2790 shadow = Fcons (start1, shadow);
2791 start1 = Qnil;
2792 }
2793 else if (!NILP (Voverriding_local_map))
2794 start1 = Voverriding_local_map;
2795
2796 if (!NILP (start1))
2797 {
2798 describe_map_tree (start1, 1, shadow, prefix,
2799 "\f\nOverriding Bindings", nomenu, 0, 0, 0);
2800 shadow = Fcons (start1, shadow);
2801 }
2802 else
2803 {
2804 /* Print the minor mode and major mode keymaps. */
2805 int i, nmaps;
2806 Lisp_Object *modes, *maps;
2807
2808 /* Temporarily switch to `buffer', so that we can get that buffer's
2809 minor modes correctly. */
2810 Fset_buffer (buffer);
2811
2812 nmaps = current_minor_maps (&modes, &maps);
2813 Fset_buffer (outbuf);
2814
2815 start1 = get_local_map (BUF_PT (XBUFFER (buffer)),
2816 XBUFFER (buffer), Qkeymap);
2817 if (!NILP (start1))
2818 {
2819 describe_map_tree (start1, 1, shadow, prefix,
2820 "\f\n`keymap' Property Bindings", nomenu,
2821 0, 0, 0);
2822 shadow = Fcons (start1, shadow);
2823 }
2824
2825 /* Print the minor mode maps. */
2826 for (i = 0; i < nmaps; i++)
2827 {
2828 /* The title for a minor mode keymap
2829 is constructed at run time.
2830 We let describe_map_tree do the actual insertion
2831 because it takes care of other features when doing so. */
2832 char *title, *p;
2833
2834 if (!SYMBOLP (modes[i]))
2835 emacs_abort ();
2836
2837 USE_SAFE_ALLOCA;
2838 p = title = SAFE_ALLOCA (42 + SBYTES (SYMBOL_NAME (modes[i])));
2839 *p++ = '\f';
2840 *p++ = '\n';
2841 *p++ = '`';
2842 memcpy (p, SDATA (SYMBOL_NAME (modes[i])),
2843 SBYTES (SYMBOL_NAME (modes[i])));
2844 p += SBYTES (SYMBOL_NAME (modes[i]));
2845 *p++ = '\'';
2846 memcpy (p, " Minor Mode Bindings", strlen (" Minor Mode Bindings"));
2847 p += strlen (" Minor Mode Bindings");
2848 *p = 0;
2849
2850 describe_map_tree (maps[i], 1, shadow, prefix,
2851 title, nomenu, 0, 0, 0);
2852 shadow = Fcons (maps[i], shadow);
2853 SAFE_FREE ();
2854 }
2855
2856 start1 = get_local_map (BUF_PT (XBUFFER (buffer)),
2857 XBUFFER (buffer), Qlocal_map);
2858 if (!NILP (start1))
2859 {
2860 if (EQ (start1, BVAR (XBUFFER (buffer), keymap)))
2861 describe_map_tree (start1, 1, shadow, prefix,
2862 "\f\nMajor Mode Bindings", nomenu, 0, 0, 0);
2863 else
2864 describe_map_tree (start1, 1, shadow, prefix,
2865 "\f\n`local-map' Property Bindings",
2866 nomenu, 0, 0, 0);
2867
2868 shadow = Fcons (start1, shadow);
2869 }
2870 }
2871
2872 describe_map_tree (current_global_map, 1, shadow, prefix,
2873 "\f\nGlobal Bindings", nomenu, 0, 1, 0);
2874
2875 /* Print the function-key-map translations under this prefix. */
2876 if (!NILP (KVAR (current_kboard, Vlocal_function_key_map)))
2877 describe_map_tree (KVAR (current_kboard, Vlocal_function_key_map), 0, Qnil, prefix,
2878 "\f\nFunction key map translations", nomenu, 1, 0, 0);
2879
2880 /* Print the input-decode-map translations under this prefix. */
2881 if (!NILP (KVAR (current_kboard, Vinput_decode_map)))
2882 describe_map_tree (KVAR (current_kboard, Vinput_decode_map), 0, Qnil, prefix,
2883 "\f\nInput decoding map translations", nomenu, 1, 0, 0);
2884
2885 return Qnil;
2886 }
2887
2888 /* Insert a description of the key bindings in STARTMAP,
2889 followed by those of all maps reachable through STARTMAP.
2890 If PARTIAL, omit certain "uninteresting" commands
2891 (such as `undefined').
2892 If SHADOW is non-nil, it is a list of maps;
2893 don't mention keys which would be shadowed by any of them.
2894 PREFIX, if non-nil, says mention only keys that start with PREFIX.
2895 TITLE, if not 0, is a string to insert at the beginning.
2896 TITLE should not end with a colon or a newline; we supply that.
2897 If NOMENU, then omit menu-bar commands.
2898
2899 If TRANSL, the definitions are actually key translations
2900 so print strings and vectors differently.
2901
2902 If ALWAYS_TITLE, print the title even if there are no maps
2903 to look through.
2904
2905 If MENTION_SHADOW, then when something is shadowed by SHADOW,
2906 don't omit it; instead, mention it but say it is shadowed.
2907
2908 Any inserted text ends in two newlines (used by `help-make-xrefs'). */
2909
2910 void
2911 describe_map_tree (Lisp_Object startmap, bool partial, Lisp_Object shadow,
2912 Lisp_Object prefix, const char *title, bool nomenu,
2913 bool transl, bool always_title, bool mention_shadow)
2914 {
2915 Lisp_Object maps, orig_maps, seen, sub_shadows;
2916 bool something = 0;
2917 const char *key_heading
2918 = "\
2919 key binding\n\
2920 --- -------\n";
2921
2922 orig_maps = maps = Faccessible_keymaps (startmap, prefix);
2923 seen = Qnil;
2924 sub_shadows = Qnil;
2925
2926 if (nomenu)
2927 {
2928 Lisp_Object list;
2929
2930 /* Delete from MAPS each element that is for the menu bar. */
2931 for (list = maps; CONSP (list); list = XCDR (list))
2932 {
2933 Lisp_Object elt, elt_prefix, tem;
2934
2935 elt = XCAR (list);
2936 elt_prefix = Fcar (elt);
2937 if (ASIZE (elt_prefix) >= 1)
2938 {
2939 tem = Faref (elt_prefix, make_number (0));
2940 if (EQ (tem, Qmenu_bar))
2941 maps = Fdelq (elt, maps);
2942 }
2943 }
2944 }
2945
2946 if (!NILP (maps) || always_title)
2947 {
2948 if (title)
2949 {
2950 insert_string (title);
2951 if (!NILP (prefix))
2952 {
2953 insert_string (" Starting With ");
2954 insert1 (Fkey_description (prefix, Qnil));
2955 }
2956 insert_string (":\n");
2957 }
2958 insert_string (key_heading);
2959 something = 1;
2960 }
2961
2962 for (; CONSP (maps); maps = XCDR (maps))
2963 {
2964 register Lisp_Object elt, elt_prefix, tail;
2965
2966 elt = XCAR (maps);
2967 elt_prefix = Fcar (elt);
2968
2969 sub_shadows = Qnil;
2970
2971 for (tail = shadow; CONSP (tail); tail = XCDR (tail))
2972 {
2973 Lisp_Object shmap;
2974
2975 shmap = XCAR (tail);
2976
2977 /* If the sequence by which we reach this keymap is zero-length,
2978 then the shadow map for this keymap is just SHADOW. */
2979 if ((STRINGP (elt_prefix) && SCHARS (elt_prefix) == 0)
2980 || (VECTORP (elt_prefix) && ASIZE (elt_prefix) == 0))
2981 ;
2982 /* If the sequence by which we reach this keymap actually has
2983 some elements, then the sequence's definition in SHADOW is
2984 what we should use. */
2985 else
2986 {
2987 shmap = Flookup_key (shmap, Fcar (elt), Qt);
2988 if (INTEGERP (shmap))
2989 shmap = Qnil;
2990 }
2991
2992 /* If shmap is not nil and not a keymap,
2993 it completely shadows this map, so don't
2994 describe this map at all. */
2995 if (!NILP (shmap) && !KEYMAPP (shmap))
2996 goto skip;
2997
2998 if (!NILP (shmap))
2999 sub_shadows = Fcons (shmap, sub_shadows);
3000 }
3001
3002 /* Maps we have already listed in this loop shadow this map. */
3003 for (tail = orig_maps; !EQ (tail, maps); tail = XCDR (tail))
3004 {
3005 Lisp_Object tem;
3006 tem = Fequal (Fcar (XCAR (tail)), elt_prefix);
3007 if (!NILP (tem))
3008 sub_shadows = Fcons (XCDR (XCAR (tail)), sub_shadows);
3009 }
3010
3011 describe_map (Fcdr (elt), elt_prefix,
3012 transl ? describe_translation : describe_command,
3013 partial, sub_shadows, &seen, nomenu, mention_shadow);
3014
3015 skip: ;
3016 }
3017
3018 if (something)
3019 insert_string ("\n");
3020 }
3021
3022 static int previous_description_column;
3023
3024 static void
3025 describe_command (Lisp_Object definition, Lisp_Object args)
3026 {
3027 register Lisp_Object tem1;
3028 ptrdiff_t column = current_column ();
3029 int description_column;
3030
3031 /* If column 16 is no good, go to col 32;
3032 but don't push beyond that--go to next line instead. */
3033 if (column > 30)
3034 {
3035 insert_char ('\n');
3036 description_column = 32;
3037 }
3038 else if (column > 14 || (column > 10 && previous_description_column == 32))
3039 description_column = 32;
3040 else
3041 description_column = 16;
3042
3043 Findent_to (make_number (description_column), make_number (1));
3044 previous_description_column = description_column;
3045
3046 if (SYMBOLP (definition))
3047 {
3048 tem1 = SYMBOL_NAME (definition);
3049 insert1 (tem1);
3050 insert_string ("\n");
3051 }
3052 else if (STRINGP (definition) || VECTORP (definition))
3053 insert_string ("Keyboard Macro\n");
3054 else if (KEYMAPP (definition))
3055 insert_string ("Prefix Command\n");
3056 else
3057 insert_string ("??\n");
3058 }
3059
3060 static void
3061 describe_translation (Lisp_Object definition, Lisp_Object args)
3062 {
3063 register Lisp_Object tem1;
3064
3065 Findent_to (make_number (16), make_number (1));
3066
3067 if (SYMBOLP (definition))
3068 {
3069 tem1 = SYMBOL_NAME (definition);
3070 insert1 (tem1);
3071 insert_string ("\n");
3072 }
3073 else if (STRINGP (definition) || VECTORP (definition))
3074 {
3075 insert1 (Fkey_description (definition, Qnil));
3076 insert_string ("\n");
3077 }
3078 else if (KEYMAPP (definition))
3079 insert_string ("Prefix Command\n");
3080 else
3081 insert_string ("??\n");
3082 }
3083
3084 /* describe_map puts all the usable elements of a sparse keymap
3085 into an array of `struct describe_map_elt',
3086 then sorts them by the events. */
3087
3088 struct describe_map_elt
3089 {
3090 Lisp_Object event;
3091 Lisp_Object definition;
3092 bool shadowed;
3093 };
3094
3095 /* qsort comparison function for sorting `struct describe_map_elt' by
3096 the event field. */
3097
3098 static int
3099 describe_map_compare (const void *aa, const void *bb)
3100 {
3101 const struct describe_map_elt *a = aa, *b = bb;
3102 if (INTEGERP (a->event) && INTEGERP (b->event))
3103 return ((XINT (a->event) > XINT (b->event))
3104 - (XINT (a->event) < XINT (b->event)));
3105 if (!INTEGERP (a->event) && INTEGERP (b->event))
3106 return 1;
3107 if (INTEGERP (a->event) && !INTEGERP (b->event))
3108 return -1;
3109 if (SYMBOLP (a->event) && SYMBOLP (b->event))
3110 return (!NILP (Fstring_lessp (a->event, b->event)) ? -1
3111 : !NILP (Fstring_lessp (b->event, a->event)) ? 1
3112 : 0);
3113 return 0;
3114 }
3115
3116 /* Describe the contents of map MAP, assuming that this map itself is
3117 reached by the sequence of prefix keys PREFIX (a string or vector).
3118 PARTIAL, SHADOW, NOMENU are as in `describe_map_tree' above. */
3119
3120 static void
3121 describe_map (Lisp_Object map, Lisp_Object prefix,
3122 void (*elt_describer) (Lisp_Object, Lisp_Object),
3123 bool partial, Lisp_Object shadow,
3124 Lisp_Object *seen, bool nomenu, bool mention_shadow)
3125 {
3126 Lisp_Object tail, definition, event;
3127 Lisp_Object tem;
3128 Lisp_Object suppress;
3129 Lisp_Object kludge;
3130 bool first = 1;
3131
3132 /* These accumulate the values from sparse keymap bindings,
3133 so we can sort them and handle them in order. */
3134 ptrdiff_t length_needed = 0;
3135 struct describe_map_elt *vect;
3136 ptrdiff_t slots_used = 0;
3137 ptrdiff_t i;
3138
3139 suppress = Qnil;
3140
3141 if (partial)
3142 suppress = intern ("suppress-keymap");
3143
3144 /* This vector gets used to present single keys to Flookup_key. Since
3145 that is done once per keymap element, we don't want to cons up a
3146 fresh vector every time. */
3147 kludge = Fmake_vector (make_number (1), Qnil);
3148 definition = Qnil;
3149
3150 map = call1 (Qkeymap_canonicalize, map);
3151
3152 for (tail = map; CONSP (tail); tail = XCDR (tail))
3153 length_needed++;
3154
3155 USE_SAFE_ALLOCA;
3156 SAFE_NALLOCA (vect, 1, length_needed);
3157
3158 for (tail = map; CONSP (tail); tail = XCDR (tail))
3159 {
3160 QUIT;
3161
3162 if (VECTORP (XCAR (tail))
3163 || CHAR_TABLE_P (XCAR (tail)))
3164 describe_vector (XCAR (tail),
3165 prefix, Qnil, elt_describer, partial, shadow, map,
3166 1, mention_shadow);
3167 else if (CONSP (XCAR (tail)))
3168 {
3169 bool this_shadowed = 0;
3170
3171 event = XCAR (XCAR (tail));
3172
3173 /* Ignore bindings whose "prefix" are not really valid events.
3174 (We get these in the frames and buffers menu.) */
3175 if (!(SYMBOLP (event) || INTEGERP (event)))
3176 continue;
3177
3178 if (nomenu && EQ (event, Qmenu_bar))
3179 continue;
3180
3181 definition = get_keyelt (XCDR (XCAR (tail)), 0);
3182
3183 /* Don't show undefined commands or suppressed commands. */
3184 if (NILP (definition)) continue;
3185 if (SYMBOLP (definition) && partial)
3186 {
3187 tem = Fget (definition, suppress);
3188 if (!NILP (tem))
3189 continue;
3190 }
3191
3192 /* Don't show a command that isn't really visible
3193 because a local definition of the same key shadows it. */
3194
3195 ASET (kludge, 0, event);
3196 if (!NILP (shadow))
3197 {
3198 tem = shadow_lookup (shadow, kludge, Qt, 0);
3199 if (!NILP (tem))
3200 {
3201 /* If both bindings are keymaps, this key is a prefix key,
3202 so don't say it is shadowed. */
3203 if (KEYMAPP (definition) && KEYMAPP (tem))
3204 ;
3205 /* Avoid generating duplicate entries if the
3206 shadowed binding has the same definition. */
3207 else if (mention_shadow && !EQ (tem, definition))
3208 this_shadowed = 1;
3209 else
3210 continue;
3211 }
3212 }
3213
3214 tem = Flookup_key (map, kludge, Qt);
3215 if (!EQ (tem, definition)) continue;
3216
3217 vect[slots_used].event = event;
3218 vect[slots_used].definition = definition;
3219 vect[slots_used].shadowed = this_shadowed;
3220 slots_used++;
3221 }
3222 else if (EQ (XCAR (tail), Qkeymap))
3223 {
3224 /* The same keymap might be in the structure twice, if we're
3225 using an inherited keymap. So skip anything we've already
3226 encountered. */
3227 tem = Fassq (tail, *seen);
3228 if (CONSP (tem) && !NILP (Fequal (XCAR (tem), prefix)))
3229 break;
3230 *seen = Fcons (Fcons (tail, prefix), *seen);
3231 }
3232 }
3233
3234 /* If we found some sparse map events, sort them. */
3235
3236 qsort (vect, slots_used, sizeof (struct describe_map_elt),
3237 describe_map_compare);
3238
3239 /* Now output them in sorted order. */
3240
3241 for (i = 0; i < slots_used; i++)
3242 {
3243 Lisp_Object start, end;
3244
3245 if (first)
3246 {
3247 previous_description_column = 0;
3248 insert ("\n", 1);
3249 first = 0;
3250 }
3251
3252 ASET (kludge, 0, vect[i].event);
3253 start = vect[i].event;
3254 end = start;
3255
3256 definition = vect[i].definition;
3257
3258 /* Find consecutive chars that are identically defined. */
3259 if (INTEGERP (vect[i].event))
3260 {
3261 while (i + 1 < slots_used
3262 && EQ (vect[i+1].event, make_number (XINT (vect[i].event) + 1))
3263 && !NILP (Fequal (vect[i + 1].definition, definition))
3264 && vect[i].shadowed == vect[i + 1].shadowed)
3265 i++;
3266 end = vect[i].event;
3267 }
3268
3269 /* Now START .. END is the range to describe next. */
3270
3271 /* Insert the string to describe the event START. */
3272 insert1 (Fkey_description (kludge, prefix));
3273
3274 if (!EQ (start, end))
3275 {
3276 insert (" .. ", 4);
3277
3278 ASET (kludge, 0, end);
3279 /* Insert the string to describe the character END. */
3280 insert1 (Fkey_description (kludge, prefix));
3281 }
3282
3283 /* Print a description of the definition of this character.
3284 elt_describer will take care of spacing out far enough
3285 for alignment purposes. */
3286 (*elt_describer) (vect[i].definition, Qnil);
3287
3288 if (vect[i].shadowed)
3289 {
3290 ptrdiff_t pt = max (PT - 1, BEG);
3291
3292 SET_PT (pt);
3293 insert_string ("\n (that binding is currently shadowed by another mode)");
3294 pt = min (PT + 1, Z);
3295 SET_PT (pt);
3296 }
3297 }
3298
3299 SAFE_FREE ();
3300 }
3301
3302 static void
3303 describe_vector_princ (Lisp_Object elt, Lisp_Object fun)
3304 {
3305 Findent_to (make_number (16), make_number (1));
3306 call1 (fun, elt);
3307 Fterpri (Qnil, Qnil);
3308 }
3309
3310 DEFUN ("describe-vector", Fdescribe_vector, Sdescribe_vector, 1, 2, 0,
3311 doc: /* Insert a description of contents of VECTOR.
3312 This is text showing the elements of vector matched against indices.
3313 DESCRIBER is the output function used; nil means use `princ'. */)
3314 (Lisp_Object vector, Lisp_Object describer)
3315 {
3316 ptrdiff_t count = SPECPDL_INDEX ();
3317 if (NILP (describer))
3318 describer = intern ("princ");
3319 specbind (Qstandard_output, Fcurrent_buffer ());
3320 CHECK_VECTOR_OR_CHAR_TABLE (vector);
3321 describe_vector (vector, Qnil, describer, describe_vector_princ, 0,
3322 Qnil, Qnil, 0, 0);
3323
3324 return unbind_to (count, Qnil);
3325 }
3326
3327 /* Insert in the current buffer a description of the contents of VECTOR.
3328 We call ELT_DESCRIBER to insert the description of one value found
3329 in VECTOR.
3330
3331 ELT_PREFIX describes what "comes before" the keys or indices defined
3332 by this vector. This is a human-readable string whose size
3333 is not necessarily related to the situation.
3334
3335 If the vector is in a keymap, ELT_PREFIX is a prefix key which
3336 leads to this keymap.
3337
3338 If the vector is a chartable, ELT_PREFIX is the vector
3339 of bytes that lead to the character set or portion of a character
3340 set described by this chartable.
3341
3342 If PARTIAL, it means do not mention suppressed commands
3343 (that assumes the vector is in a keymap).
3344
3345 SHADOW is a list of keymaps that shadow this map.
3346 If it is non-nil, then we look up the key in those maps
3347 and we don't mention it now if it is defined by any of them.
3348
3349 ENTIRE_MAP is the keymap in which this vector appears.
3350 If the definition in effect in the whole map does not match
3351 the one in this vector, we ignore this one.
3352
3353 ARGS is simply passed as the second argument to ELT_DESCRIBER.
3354
3355 KEYMAP_P is 1 if vector is known to be a keymap, so map ESC to M-.
3356
3357 ARGS is simply passed as the second argument to ELT_DESCRIBER. */
3358
3359 static void
3360 describe_vector (Lisp_Object vector, Lisp_Object prefix, Lisp_Object args,
3361 void (*elt_describer) (Lisp_Object, Lisp_Object),
3362 bool partial, Lisp_Object shadow, Lisp_Object entire_map,
3363 bool keymap_p, bool mention_shadow)
3364 {
3365 Lisp_Object definition;
3366 Lisp_Object tem2;
3367 Lisp_Object elt_prefix = Qnil;
3368 int i;
3369 Lisp_Object suppress;
3370 Lisp_Object kludge;
3371 bool first = 1;
3372 /* Range of elements to be handled. */
3373 int from, to, stop;
3374 Lisp_Object character;
3375 int starting_i;
3376
3377 suppress = Qnil;
3378
3379 definition = Qnil;
3380
3381 if (!keymap_p)
3382 {
3383 /* Call Fkey_description first, to avoid GC bug for the other string. */
3384 if (!NILP (prefix) && XFASTINT (Flength (prefix)) > 0)
3385 {
3386 Lisp_Object tem = Fkey_description (prefix, Qnil);
3387 AUTO_STRING (space, " ");
3388 elt_prefix = concat2 (tem, space);
3389 }
3390 prefix = Qnil;
3391 }
3392
3393 /* This vector gets used to present single keys to Flookup_key. Since
3394 that is done once per vector element, we don't want to cons up a
3395 fresh vector every time. */
3396 kludge = Fmake_vector (make_number (1), Qnil);
3397
3398 if (partial)
3399 suppress = intern ("suppress-keymap");
3400
3401 from = 0;
3402 if (CHAR_TABLE_P (vector))
3403 stop = MAX_5_BYTE_CHAR + 1, to = MAX_CHAR + 1;
3404 else
3405 stop = to = ASIZE (vector);
3406
3407 for (i = from; ; i++)
3408 {
3409 bool this_shadowed = 0;
3410 int range_beg, range_end;
3411 Lisp_Object val;
3412
3413 QUIT;
3414
3415 if (i == stop)
3416 {
3417 if (i == to)
3418 break;
3419 stop = to;
3420 }
3421
3422 starting_i = i;
3423
3424 if (CHAR_TABLE_P (vector))
3425 {
3426 range_beg = i;
3427 i = stop - 1;
3428 val = char_table_ref_and_range (vector, range_beg, &range_beg, &i);
3429 }
3430 else
3431 val = AREF (vector, i);
3432 definition = get_keyelt (val, 0);
3433
3434 if (NILP (definition)) continue;
3435
3436 /* Don't mention suppressed commands. */
3437 if (SYMBOLP (definition) && partial)
3438 {
3439 Lisp_Object tem;
3440
3441 tem = Fget (definition, suppress);
3442
3443 if (!NILP (tem)) continue;
3444 }
3445
3446 character = make_number (starting_i);
3447 ASET (kludge, 0, character);
3448
3449 /* If this binding is shadowed by some other map, ignore it. */
3450 if (!NILP (shadow))
3451 {
3452 Lisp_Object tem;
3453
3454 tem = shadow_lookup (shadow, kludge, Qt, 0);
3455
3456 if (!NILP (tem))
3457 {
3458 if (mention_shadow)
3459 this_shadowed = 1;
3460 else
3461 continue;
3462 }
3463 }
3464
3465 /* Ignore this definition if it is shadowed by an earlier
3466 one in the same keymap. */
3467 if (!NILP (entire_map))
3468 {
3469 Lisp_Object tem;
3470
3471 tem = Flookup_key (entire_map, kludge, Qt);
3472
3473 if (!EQ (tem, definition))
3474 continue;
3475 }
3476
3477 if (first)
3478 {
3479 insert ("\n", 1);
3480 first = 0;
3481 }
3482
3483 /* Output the prefix that applies to every entry in this map. */
3484 if (!NILP (elt_prefix))
3485 insert1 (elt_prefix);
3486
3487 insert1 (Fkey_description (kludge, prefix));
3488
3489 /* Find all consecutive characters or rows that have the same
3490 definition. But, VECTOR is a char-table, we had better put a
3491 boundary between normal characters (-#x3FFF7F) and 8-bit
3492 characters (#x3FFF80-). */
3493 if (CHAR_TABLE_P (vector))
3494 {
3495 while (i + 1 < stop
3496 && (range_beg = i + 1, range_end = stop - 1,
3497 val = char_table_ref_and_range (vector, range_beg,
3498 &range_beg, &range_end),
3499 tem2 = get_keyelt (val, 0),
3500 !NILP (tem2))
3501 && !NILP (Fequal (tem2, definition)))
3502 i = range_end;
3503 }
3504 else
3505 while (i + 1 < stop
3506 && (tem2 = get_keyelt (AREF (vector, i + 1), 0),
3507 !NILP (tem2))
3508 && !NILP (Fequal (tem2, definition)))
3509 i++;
3510
3511 /* If we have a range of more than one character,
3512 print where the range reaches to. */
3513
3514 if (i != starting_i)
3515 {
3516 insert (" .. ", 4);
3517
3518 ASET (kludge, 0, make_number (i));
3519
3520 if (!NILP (elt_prefix))
3521 insert1 (elt_prefix);
3522
3523 insert1 (Fkey_description (kludge, prefix));
3524 }
3525
3526 /* Print a description of the definition of this character.
3527 elt_describer will take care of spacing out far enough
3528 for alignment purposes. */
3529 (*elt_describer) (definition, args);
3530
3531 if (this_shadowed)
3532 {
3533 SET_PT (PT - 1);
3534 insert_string (" (binding currently shadowed)");
3535 SET_PT (PT + 1);
3536 }
3537 }
3538
3539 if (CHAR_TABLE_P (vector) && ! NILP (XCHAR_TABLE (vector)->defalt))
3540 {
3541 if (!NILP (elt_prefix))
3542 insert1 (elt_prefix);
3543 insert ("default", 7);
3544 (*elt_describer) (XCHAR_TABLE (vector)->defalt, args);
3545 }
3546 }
3547 \f
3548 /* Apropos - finding all symbols whose names match a regexp. */
3549 static Lisp_Object apropos_predicate;
3550 static Lisp_Object apropos_accumulate;
3551
3552 static void
3553 apropos_accum (Lisp_Object symbol, Lisp_Object string)
3554 {
3555 register Lisp_Object tem;
3556
3557 tem = Fstring_match (string, Fsymbol_name (symbol), Qnil);
3558 if (!NILP (tem) && !NILP (apropos_predicate))
3559 tem = call1 (apropos_predicate, symbol);
3560 if (!NILP (tem))
3561 apropos_accumulate = Fcons (symbol, apropos_accumulate);
3562 }
3563
3564 DEFUN ("apropos-internal", Fapropos_internal, Sapropos_internal, 1, 2, 0,
3565 doc: /* Show all symbols whose names contain match for REGEXP.
3566 If optional 2nd arg PREDICATE is non-nil, (funcall PREDICATE SYMBOL) is done
3567 for each symbol and a symbol is mentioned only if that returns non-nil.
3568 Return list of symbols found. */)
3569 (Lisp_Object regexp, Lisp_Object predicate)
3570 {
3571 Lisp_Object tem;
3572 CHECK_STRING (regexp);
3573 apropos_predicate = predicate;
3574 apropos_accumulate = Qnil;
3575 map_obarray (Vobarray, apropos_accum, regexp);
3576 tem = Fsort (apropos_accumulate, Qstring_lessp);
3577 apropos_accumulate = Qnil;
3578 apropos_predicate = Qnil;
3579 return tem;
3580 }
3581 \f
3582 void
3583 syms_of_keymap (void)
3584 {
3585 DEFSYM (Qkeymap, "keymap");
3586 staticpro (&apropos_predicate);
3587 staticpro (&apropos_accumulate);
3588 apropos_predicate = Qnil;
3589 apropos_accumulate = Qnil;
3590
3591 DEFSYM (Qkeymap_canonicalize, "keymap-canonicalize");
3592
3593 /* Now we are ready to set up this property, so we can
3594 create char tables. */
3595 Fput (Qkeymap, Qchar_table_extra_slots, make_number (0));
3596
3597 /* Initialize the keymaps standardly used.
3598 Each one is the value of a Lisp variable, and is also
3599 pointed to by a C variable */
3600
3601 global_map = Fmake_keymap (Qnil);
3602 Fset (intern_c_string ("global-map"), global_map);
3603
3604 current_global_map = global_map;
3605 staticpro (&global_map);
3606 staticpro (&current_global_map);
3607
3608 meta_map = Fmake_keymap (Qnil);
3609 Fset (intern_c_string ("esc-map"), meta_map);
3610 Ffset (intern_c_string ("ESC-prefix"), meta_map);
3611
3612 control_x_map = Fmake_keymap (Qnil);
3613 Fset (intern_c_string ("ctl-x-map"), control_x_map);
3614 Ffset (intern_c_string ("Control-X-prefix"), control_x_map);
3615
3616 exclude_keys = listn (CONSTYPE_PURE, 5,
3617 pure_cons (build_pure_c_string ("DEL"), build_pure_c_string ("\\d")),
3618 pure_cons (build_pure_c_string ("TAB"), build_pure_c_string ("\\t")),
3619 pure_cons (build_pure_c_string ("RET"), build_pure_c_string ("\\r")),
3620 pure_cons (build_pure_c_string ("ESC"), build_pure_c_string ("\\e")),
3621 pure_cons (build_pure_c_string ("SPC"), build_pure_c_string (" ")));
3622 staticpro (&exclude_keys);
3623
3624 DEFVAR_LISP ("define-key-rebound-commands", Vdefine_key_rebound_commands,
3625 doc: /* List of commands given new key bindings recently.
3626 This is used for internal purposes during Emacs startup;
3627 don't alter it yourself. */);
3628 Vdefine_key_rebound_commands = Qt;
3629
3630 DEFVAR_LISP ("minibuffer-local-map", Vminibuffer_local_map,
3631 doc: /* Default keymap to use when reading from the minibuffer. */);
3632 Vminibuffer_local_map = Fmake_sparse_keymap (Qnil);
3633
3634 DEFVAR_LISP ("minibuffer-local-ns-map", Vminibuffer_local_ns_map,
3635 doc: /* Local keymap for the minibuffer when spaces are not allowed. */);
3636 Vminibuffer_local_ns_map = Fmake_sparse_keymap (Qnil);
3637 Fset_keymap_parent (Vminibuffer_local_ns_map, Vminibuffer_local_map);
3638
3639
3640 DEFVAR_LISP ("minor-mode-map-alist", Vminor_mode_map_alist,
3641 doc: /* Alist of keymaps to use for minor modes.
3642 Each element looks like (VARIABLE . KEYMAP); KEYMAP is used to read
3643 key sequences and look up bindings if VARIABLE's value is non-nil.
3644 If two active keymaps bind the same key, the keymap appearing earlier
3645 in the list takes precedence. */);
3646 Vminor_mode_map_alist = Qnil;
3647
3648 DEFVAR_LISP ("minor-mode-overriding-map-alist", Vminor_mode_overriding_map_alist,
3649 doc: /* Alist of keymaps to use for minor modes, in current major mode.
3650 This variable is an alist just like `minor-mode-map-alist', and it is
3651 used the same way (and before `minor-mode-map-alist'); however,
3652 it is provided for major modes to bind locally. */);
3653 Vminor_mode_overriding_map_alist = Qnil;
3654
3655 DEFVAR_LISP ("emulation-mode-map-alists", Vemulation_mode_map_alists,
3656 doc: /* List of keymap alists to use for emulation modes.
3657 It is intended for modes or packages using multiple minor-mode keymaps.
3658 Each element is a keymap alist just like `minor-mode-map-alist', or a
3659 symbol with a variable binding which is a keymap alist, and it is used
3660 the same way. The "active" keymaps in each alist are used before
3661 `minor-mode-map-alist' and `minor-mode-overriding-map-alist'. */);
3662 Vemulation_mode_map_alists = Qnil;
3663
3664 DEFVAR_LISP ("where-is-preferred-modifier", Vwhere_is_preferred_modifier,
3665 doc: /* Preferred modifier key to use for `where-is'.
3666 When a single binding is requested, `where-is' will return one that
3667 uses this modifier key if possible. If nil, or if no such binding
3668 exists, bindings using keys without modifiers (or only with meta) will
3669 be preferred. */);
3670 Vwhere_is_preferred_modifier = Qnil;
3671 where_is_preferred_modifier = 0;
3672
3673 DEFSYM (Qmenu_bar, "menu-bar");
3674 DEFSYM (Qmode_line, "mode-line");
3675
3676 staticpro (&Vmouse_events);
3677 Vmouse_events = listn (CONSTYPE_PURE, 9,
3678 Qmenu_bar,
3679 Qtool_bar,
3680 Qheader_line,
3681 Qmode_line,
3682 intern_c_string ("mouse-1"),
3683 intern_c_string ("mouse-2"),
3684 intern_c_string ("mouse-3"),
3685 intern_c_string ("mouse-4"),
3686 intern_c_string ("mouse-5"));
3687
3688 /* Keymap used for minibuffers when doing completion. */
3689 /* Keymap used for minibuffers when doing completion and require a match. */
3690 DEFSYM (Qkeymapp, "keymapp");
3691 DEFSYM (Qnon_ascii, "non-ascii");
3692 DEFSYM (Qmenu_item, "menu-item");
3693 DEFSYM (Qremap, "remap");
3694 DEFSYM (QCadvertised_binding, ":advertised-binding");
3695
3696 command_remapping_vector = Fmake_vector (make_number (2), Qremap);
3697 staticpro (&command_remapping_vector);
3698
3699 where_is_cache_keymaps = Qt;
3700 where_is_cache = Qnil;
3701 staticpro (&where_is_cache);
3702 staticpro (&where_is_cache_keymaps);
3703
3704 defsubr (&Skeymapp);
3705 defsubr (&Skeymap_parent);
3706 defsubr (&Skeymap_prompt);
3707 defsubr (&Sset_keymap_parent);
3708 defsubr (&Smake_keymap);
3709 defsubr (&Smake_sparse_keymap);
3710 defsubr (&Smap_keymap_internal);
3711 defsubr (&Smap_keymap);
3712 defsubr (&Scopy_keymap);
3713 defsubr (&Scommand_remapping);
3714 defsubr (&Skey_binding);
3715 defsubr (&Slocal_key_binding);
3716 defsubr (&Sglobal_key_binding);
3717 defsubr (&Sminor_mode_key_binding);
3718 defsubr (&Sdefine_key);
3719 defsubr (&Slookup_key);
3720 defsubr (&Sdefine_prefix_command);
3721 defsubr (&Suse_global_map);
3722 defsubr (&Suse_local_map);
3723 defsubr (&Scurrent_local_map);
3724 defsubr (&Scurrent_global_map);
3725 defsubr (&Scurrent_minor_mode_maps);
3726 defsubr (&Scurrent_active_maps);
3727 defsubr (&Saccessible_keymaps);
3728 defsubr (&Skey_description);
3729 defsubr (&Sdescribe_vector);
3730 defsubr (&Ssingle_key_description);
3731 defsubr (&Stext_char_description);
3732 defsubr (&Swhere_is_internal);
3733 defsubr (&Sdescribe_buffer_bindings);
3734 defsubr (&Sapropos_internal);
3735 }
3736
3737 void
3738 keys_of_keymap (void)
3739 {
3740 initial_define_key (global_map, 033, "ESC-prefix");
3741 initial_define_key (global_map, Ctl ('X'), "Control-X-prefix");
3742 }