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