1 /* Manipulation of keymaps
2 Copyright (C) 1985, 86, 87, 88, 93, 94 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
28 #include "termhooks.h"
29 #include "blockinput.h"
31 #define min(a, b) ((a) < (b) ? (a) : (b))
33 /* The number of elements in keymap vectors. */
34 #define DENSE_TABLE_SIZE (0200)
36 /* Actually allocate storage for these variables */
38 Lisp_Object current_global_map
; /* Current global keymap */
40 Lisp_Object global_map
; /* default global key bindings */
42 Lisp_Object meta_map
; /* The keymap used for globally bound
43 ESC-prefixed default commands */
45 Lisp_Object control_x_map
; /* The keymap used for globally bound
46 C-x-prefixed default commands */
48 /* was MinibufLocalMap */
49 Lisp_Object Vminibuffer_local_map
;
50 /* The keymap used by the minibuf for local
51 bindings when spaces are allowed in the
54 /* was MinibufLocalNSMap */
55 Lisp_Object Vminibuffer_local_ns_map
;
56 /* The keymap used by the minibuf for local
57 bindings when spaces are not encouraged
60 /* keymap used for minibuffers when doing completion */
61 /* was MinibufLocalCompletionMap */
62 Lisp_Object Vminibuffer_local_completion_map
;
64 /* keymap used for minibuffers when doing completion and require a match */
65 /* was MinibufLocalMustMatchMap */
66 Lisp_Object Vminibuffer_local_must_match_map
;
68 /* Alist of minor mode variables and keymaps. */
69 Lisp_Object Vminor_mode_map_alist
;
71 /* Keymap mapping ASCII function key sequences onto their preferred forms.
72 Initialized by the terminal-specific lisp files. See DEFVAR for more
74 Lisp_Object Vfunction_key_map
;
76 Lisp_Object Qkeymapp
, Qkeymap
, Qnon_ascii
;
78 /* A char with the CHAR_META bit set in a vector or the 0200 bit set
79 in a string key sequence is equivalent to prefixing with this
81 extern Lisp_Object meta_prefix_char
;
83 extern Lisp_Object Voverriding_local_map
;
85 void describe_map_tree ();
86 static Lisp_Object
define_as_prefix ();
87 static Lisp_Object
describe_buffer_bindings ();
88 static void describe_command ();
89 static void describe_map ();
91 /* Keymap object support - constructors and predicates. */
93 DEFUN ("make-keymap", Fmake_keymap
, Smake_keymap
, 0, 1, 0,
94 "Construct and return a new keymap, of the form (keymap VECTOR . ALIST).\n\
95 VECTOR is a vector which holds the bindings for the ASCII\n\
96 characters. ALIST is an assoc-list which holds bindings for function keys,\n\
97 mouse events, and any other things that appear in the input stream.\n\
98 All entries in it are initially nil, meaning \"command undefined\".\n\n\
99 The optional arg STRING supplies a menu name for the keymap\n\
100 in case you use it as a menu with `x-popup-menu'.")
106 tail
= Fcons (string
, Qnil
);
109 return Fcons (Qkeymap
,
110 Fcons (Fmake_vector (make_number (DENSE_TABLE_SIZE
), Qnil
),
114 DEFUN ("make-sparse-keymap", Fmake_sparse_keymap
, Smake_sparse_keymap
, 0, 1, 0,
115 "Construct and return a new sparse-keymap list.\n\
116 Its car is `keymap' and its cdr is an alist of (CHAR . DEFINITION),\n\
117 which binds the character CHAR to DEFINITION, or (SYMBOL . DEFINITION),\n\
118 which binds the function key or mouse event SYMBOL to DEFINITION.\n\
119 Initially the alist is nil.\n\n\
120 The optional arg STRING supplies a menu name for the keymap\n\
121 in case you use it as a menu with `x-popup-menu'.")
126 return Fcons (Qkeymap
, Fcons (string
, Qnil
));
127 return Fcons (Qkeymap
, Qnil
);
130 /* This function is used for installing the standard key bindings
131 at initialization time.
135 initial_define_key (control_x_map, Ctl('X'), "exchange-point-and-mark"); */
138 initial_define_key (keymap
, key
, defname
)
143 store_in_keymap (keymap
, make_number (key
), intern (defname
));
147 initial_define_lispy_key (keymap
, keyname
, defname
)
152 store_in_keymap (keymap
, intern (keyname
), intern (defname
));
155 /* Define character fromchar in map frommap as an alias for character
156 tochar in map tomap. Subsequent redefinitions of the latter WILL
157 affect the former. */
161 synkey (frommap
, fromchar
, tomap
, tochar
)
162 struct Lisp_Vector
*frommap
, *tomap
;
163 int fromchar
, tochar
;
166 XSETVECTOR (v
, tomap
);
167 XSETFASTINT (c
, tochar
);
168 frommap
->contents
[fromchar
] = Fcons (v
, c
);
172 DEFUN ("keymapp", Fkeymapp
, Skeymapp
, 1, 1, 0,
173 "Return t if ARG is a keymap.\n\
175 A keymap is a list (keymap . ALIST),\n\
176 or a symbol whose function definition is itself a keymap.\n\
177 ALIST elements look like (CHAR . DEFN) or (SYMBOL . DEFN);\n\
178 a vector of densely packed bindings for small character codes\n\
179 is also allowed as an element.")
183 return (NILP (get_keymap_1 (object
, 0, 0)) ? Qnil
: Qt
);
186 /* Check that OBJECT is a keymap (after dereferencing through any
187 symbols). If it is, return it.
189 If AUTOLOAD is non-zero and OBJECT is a symbol whose function value
190 is an autoload form, do the autoload and try again.
191 If AUTOLOAD is nonzero, callers must assume GC is possible.
193 ERROR controls how we respond if OBJECT isn't a keymap.
194 If ERROR is non-zero, signal an error; otherwise, just return Qnil.
196 Note that most of the time, we don't want to pursue autoloads.
197 Functions like Faccessible_keymaps which scan entire keymap trees
198 shouldn't load every autoloaded keymap. I'm not sure about this,
199 but it seems to me that only read_key_sequence, Flookup_key, and
200 Fdefine_key should cause keymaps to be autoloaded. */
203 get_keymap_1 (object
, error
, autoload
)
210 tem
= indirect_function (object
);
211 if (CONSP (tem
) && EQ (XCONS (tem
)->car
, Qkeymap
))
214 /* Should we do an autoload? Autoload forms for keymaps have
215 Qkeymap as their fifth element. */
219 && EQ (XCONS (tem
)->car
, Qautoload
))
223 tail
= Fnth (make_number (4), tem
);
224 if (EQ (tail
, Qkeymap
))
226 struct gcpro gcpro1
, gcpro2
;
228 GCPRO2 (tem
, object
);
229 do_autoload (tem
, object
);
237 wrong_type_argument (Qkeymapp
, object
);
243 /* Follow any symbol chaining, and return the keymap denoted by OBJECT.
244 If OBJECT doesn't denote a keymap at all, signal an error. */
249 return get_keymap_1 (object
, 1, 0);
253 /* Look up IDX in MAP. IDX may be any sort of event.
254 Note that this does only one level of lookup; IDX must be a single
255 event, not a sequence.
257 If T_OK is non-zero, bindings for Qt are treated as default
258 bindings; any key left unmentioned by other tables and bindings is
259 given the binding of Qt.
261 If T_OK is zero, bindings for Qt are not treated specially.
263 If NOINHERIT, don't accept a subkeymap found in an inherited keymap. */
266 access_keymap (map
, idx
, t_ok
, noinherit
)
275 /* If idx is a list (some sort of mouse click, perhaps?),
276 the index we want to use is the car of the list, which
277 ought to be a symbol. */
278 idx
= EVENT_HEAD (idx
);
280 /* If idx is a symbol, it might have modifiers, which need to
281 be put in the canonical order. */
283 idx
= reorder_modifiers (idx
);
284 else if (INTEGERP (idx
))
285 /* Clobber the high bits that can be present on a machine
286 with more than 24 bits of integer. */
287 XSETFASTINT (idx
, XINT (idx
) & (CHAR_META
| (CHAR_META
- 1)));
291 Lisp_Object t_binding
;
294 for (tail
= map
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
298 binding
= XCONS (tail
)->car
;
299 if (SYMBOLP (binding
))
301 /* If NOINHERIT, stop finding prefix definitions
302 after we pass a second occurrence of the `keymap' symbol. */
303 if (noinherit
&& EQ (binding
, Qkeymap
) && ! EQ (tail
, map
))
306 else if (CONSP (binding
))
308 if (EQ (XCONS (binding
)->car
, idx
))
310 val
= XCONS (binding
)->cdr
;
311 if (noprefix
&& CONSP (val
) && EQ (XCONS (val
)->car
, Qkeymap
))
315 if (t_ok
&& EQ (XCONS (binding
)->car
, Qt
))
316 t_binding
= XCONS (binding
)->cdr
;
318 else if (VECTORP (binding
))
320 if (NATNUMP (idx
) && XFASTINT (idx
) < XVECTOR (binding
)->size
)
322 val
= XVECTOR (binding
)->contents
[XFASTINT (idx
)];
323 if (noprefix
&& CONSP (val
) && EQ (XCONS (val
)->car
, Qkeymap
))
336 /* Given OBJECT which was found in a slot in a keymap,
337 trace indirect definitions to get the actual definition of that slot.
338 An indirect definition is a list of the form
339 (KEYMAP . INDEX), where KEYMAP is a keymap or a symbol defined as one
340 and INDEX is the object to look up in KEYMAP to yield the definition.
342 Also if OBJECT has a menu string as the first element,
343 remove that. Also remove a menu help string as second element.
345 If AUTOLOAD is nonzero, load autoloadable keymaps
346 that are referred to with indirection. */
349 get_keyelt (object
, autoload
)
350 register Lisp_Object object
;
355 register Lisp_Object map
, tem
;
357 /* If the contents are (KEYMAP . ELEMENT), go indirect. */
358 map
= get_keymap_1 (Fcar_safe (object
), 0, autoload
);
359 tem
= Fkeymapp (map
);
361 object
= access_keymap (map
, Fcdr (object
), 0, 0);
363 /* If the keymap contents looks like (STRING . DEFN),
365 Keymap alist elements like (CHAR MENUSTRING . DEFN)
366 will be used by HierarKey menus. */
367 else if (CONSP (object
)
368 && STRINGP (XCONS (object
)->car
))
370 object
= XCONS (object
)->cdr
;
371 /* Also remove a menu help string, if any,
372 following the menu item name. */
373 if (CONSP (object
) && STRINGP (XCONS (object
)->car
))
374 object
= XCONS (object
)->cdr
;
375 /* Also remove the sublist that caches key equivalences, if any. */
377 && CONSP (XCONS (object
)->car
))
380 carcar
= XCONS (XCONS (object
)->car
)->car
;
381 if (NILP (carcar
) || VECTORP (carcar
))
382 object
= XCONS (object
)->cdr
;
387 /* Anything else is really the value. */
393 store_in_keymap (keymap
, idx
, def
)
395 register Lisp_Object idx
;
396 register Lisp_Object def
;
398 /* If we are preparing to dump, and DEF is a menu element
399 with a menu item string, copy it to ensure it is not pure. */
400 if (!NILP (Vpurify_flag
) && CONSP (def
)
401 && STRINGP (XCONS (def
)->car
))
402 def
= Fcons (XCONS (def
)->car
, XCONS (def
)->cdr
);
404 if (!CONSP (keymap
) || ! EQ (XCONS (keymap
)->car
, Qkeymap
))
405 error ("attempt to define a key in a non-keymap");
407 /* If idx is a list (some sort of mouse click, perhaps?),
408 the index we want to use is the car of the list, which
409 ought to be a symbol. */
410 idx
= EVENT_HEAD (idx
);
412 /* If idx is a symbol, it might have modifiers, which need to
413 be put in the canonical order. */
415 idx
= reorder_modifiers (idx
);
416 else if (INTEGERP (idx
))
417 /* Clobber the high bits that can be present on a machine
418 with more than 24 bits of integer. */
419 XSETFASTINT (idx
, XINT (idx
) & (CHAR_META
| (CHAR_META
- 1)));
421 /* Scan the keymap for a binding of idx. */
425 /* The cons after which we should insert new bindings. If the
426 keymap has a table element, we record its position here, so new
427 bindings will go after it; this way, the table will stay
428 towards the front of the alist and character lookups in dense
429 keymaps will remain fast. Otherwise, this just points at the
430 front of the keymap. */
431 Lisp_Object insertion_point
;
433 insertion_point
= keymap
;
434 for (tail
= XCONS (keymap
)->cdr
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
438 elt
= XCONS (tail
)->car
;
441 if (NATNUMP (idx
) && XFASTINT (idx
) < XVECTOR (elt
)->size
)
443 XVECTOR (elt
)->contents
[XFASTINT (idx
)] = def
;
446 insertion_point
= tail
;
448 else if (CONSP (elt
))
450 if (EQ (idx
, XCONS (elt
)->car
))
452 XCONS (elt
)->cdr
= def
;
456 else if (SYMBOLP (elt
))
458 /* If we find a 'keymap' symbol in the spine of KEYMAP,
459 then we must have found the start of a second keymap
460 being used as the tail of KEYMAP, and a binding for IDX
461 should be inserted before it. */
462 if (EQ (elt
, Qkeymap
))
470 /* We have scanned the entire keymap, and not found a binding for
471 IDX. Let's add one. */
472 XCONS (insertion_point
)->cdr
473 = Fcons (Fcons (idx
, def
), XCONS (insertion_point
)->cdr
);
480 DEFUN ("copy-keymap", Fcopy_keymap
, Scopy_keymap
, 1, 1, 0,
481 "Return a copy of the keymap KEYMAP.\n\
482 The copy starts out with the same definitions of KEYMAP,\n\
483 but changing either the copy or KEYMAP does not affect the other.\n\
484 Any key definitions that are subkeymaps are recursively copied.\n\
485 However, a key definition which is a symbol whose definition is a keymap\n\
490 register Lisp_Object copy
, tail
;
492 copy
= Fcopy_alist (get_keymap (keymap
));
494 for (tail
= copy
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
498 elt
= XCONS (tail
)->car
;
503 elt
= Fcopy_sequence (elt
);
504 XCONS (tail
)->car
= elt
;
506 for (i
= 0; i
< XVECTOR (elt
)->size
; i
++)
507 if (!SYMBOLP (XVECTOR (elt
)->contents
[i
])
508 && ! NILP (Fkeymapp (XVECTOR (elt
)->contents
[i
])))
509 XVECTOR (elt
)->contents
[i
] =
510 Fcopy_keymap (XVECTOR (elt
)->contents
[i
]);
512 else if (CONSP (elt
))
514 /* Skip the optional menu string. */
515 if (CONSP (XCONS (elt
)->cdr
)
516 && STRINGP (XCONS (XCONS (elt
)->cdr
)->car
))
520 /* Copy the cell, since copy-alist didn't go this deep. */
521 XCONS (elt
)->cdr
= Fcons (XCONS (XCONS (elt
)->cdr
)->car
,
522 XCONS (XCONS (elt
)->cdr
)->cdr
);
523 elt
= XCONS (elt
)->cdr
;
525 /* Also skip the optional menu help string. */
526 if (CONSP (XCONS (elt
)->cdr
)
527 && STRINGP (XCONS (XCONS (elt
)->cdr
)->car
))
529 XCONS (elt
)->cdr
= Fcons (XCONS (XCONS (elt
)->cdr
)->car
,
530 XCONS (XCONS (elt
)->cdr
)->cdr
);
531 elt
= XCONS (elt
)->cdr
;
533 /* There may also be a list that caches key equivalences.
534 Just delete it for the new keymap. */
535 if (CONSP (XCONS (elt
)->cdr
)
536 && CONSP (XCONS (XCONS (elt
)->cdr
)->car
)
537 && (NILP (tem
= XCONS (XCONS (XCONS (elt
)->cdr
)->car
)->car
)
539 XCONS (elt
)->cdr
= XCONS (XCONS (elt
)->cdr
)->cdr
;
542 && ! SYMBOLP (XCONS (elt
)->cdr
)
543 && ! NILP (Fkeymapp (XCONS (elt
)->cdr
)))
544 XCONS (elt
)->cdr
= Fcopy_keymap (XCONS (elt
)->cdr
);
551 /* Simple Keymap mutators and accessors. */
553 /* GC is possible in this function if it autoloads a keymap. */
555 DEFUN ("define-key", Fdefine_key
, Sdefine_key
, 3, 3, 0,
556 "Args KEYMAP, KEY, DEF. Define key sequence KEY, in KEYMAP, as DEF.\n\
557 KEYMAP is a keymap. KEY is a string or a vector of symbols and characters\n\
558 meaning a sequence of keystrokes and events.\n\
559 Non-ASCII characters with codes above 127 (such as ISO Latin-1)\n\
560 can be included if you use a vector.\n\
561 DEF is anything that can be a key's definition:\n\
562 nil (means key is undefined in this keymap),\n\
563 a command (a Lisp function suitable for interactive calling)\n\
564 a string (treated as a keyboard macro),\n\
565 a keymap (to define a prefix key),\n\
566 a symbol. When the key is looked up, the symbol will stand for its\n\
567 function definition, which should at that time be one of the above,\n\
568 or another symbol whose function definition is used, etc.\n\
569 a cons (STRING . DEFN), meaning that DEFN is the definition\n\
570 (DEFN should be a valid definition in its own right),\n\
571 or a cons (KEYMAP . CHAR), meaning use definition of CHAR in map KEYMAP.\n\
573 If KEYMAP is a sparse keymap, the pair binding KEY to DEF is added at\n\
574 the front of KEYMAP.")
581 register Lisp_Object c
;
582 register Lisp_Object tem
;
583 register Lisp_Object cmd
;
587 struct gcpro gcpro1
, gcpro2
, gcpro3
;
589 keymap
= get_keymap_1 (keymap
, 1, 1);
591 if (!VECTORP (key
) && !STRINGP (key
))
592 key
= wrong_type_argument (Qarrayp
, key
);
594 length
= XFASTINT (Flength (key
));
598 GCPRO3 (keymap
, key
, def
);
601 meta_bit
= meta_modifier
;
608 c
= Faref (key
, make_number (idx
));
611 && (XINT (c
) & meta_bit
)
614 c
= meta_prefix_char
;
620 XSETINT (c
, XINT (c
) & ~meta_bit
);
626 if (! INTEGERP (c
) && ! SYMBOLP (c
) && ! CONSP (c
))
627 error ("Key sequence contains invalid events");
630 RETURN_UNGCPRO (store_in_keymap (keymap
, c
, def
));
632 cmd
= get_keyelt (access_keymap (keymap
, c
, 0, 1), 1);
634 /* If this key is undefined, make it a prefix. */
636 cmd
= define_as_prefix (keymap
, c
);
638 keymap
= get_keymap_1 (cmd
, 0, 1);
640 /* We must use Fkey_description rather than just passing key to
641 error; key might be a vector, not a string. */
642 error ("Key sequence %s uses invalid prefix characters",
643 XSTRING (Fkey_description (key
))->data
);
647 /* Value is number if KEY is too long; NIL if valid but has no definition. */
648 /* GC is possible in this function if it autoloads a keymap. */
650 DEFUN ("lookup-key", Flookup_key
, Slookup_key
, 2, 3, 0,
651 "In keymap KEYMAP, look up key sequence KEY. Return the definition.\n\
652 nil means undefined. See doc of `define-key' for kinds of definitions.\n\
654 A number as value means KEY is \"too long\";\n\
655 that is, characters or symbols in it except for the last one\n\
656 fail to be a valid sequence of prefix characters in KEYMAP.\n\
657 The number is how many characters at the front of KEY\n\
658 it takes to reach a non-prefix command.\n\
660 Normally, `lookup-key' ignores bindings for t, which act as default\n\
661 bindings, used when nothing else in the keymap applies; this makes it\n\
662 useable as a general function for probing keymaps. However, if the\n\
663 third optional argument ACCEPT-DEFAULT is non-nil, `lookup-key' will\n\
664 recognize the default bindings, just as `read-key-sequence' does.")
665 (keymap
, key
, accept_default
)
666 register Lisp_Object keymap
;
668 Lisp_Object accept_default
;
671 register Lisp_Object tem
;
672 register Lisp_Object cmd
;
673 register Lisp_Object c
;
676 int t_ok
= ! NILP (accept_default
);
680 keymap
= get_keymap_1 (keymap
, 1, 1);
682 if (!VECTORP (key
) && !STRINGP (key
))
683 key
= wrong_type_argument (Qarrayp
, key
);
685 length
= XFASTINT (Flength (key
));
690 meta_bit
= meta_modifier
;
699 c
= Faref (key
, make_number (idx
));
702 && (XINT (c
) & meta_bit
)
705 c
= meta_prefix_char
;
711 XSETINT (c
, XINT (c
) & ~meta_bit
);
717 cmd
= get_keyelt (access_keymap (keymap
, c
, t_ok
, 0), 1);
719 RETURN_UNGCPRO (cmd
);
721 keymap
= get_keymap_1 (cmd
, 0, 1);
723 RETURN_UNGCPRO (make_number (idx
));
729 /* Make KEYMAP define event C as a keymap (i.e., as a prefix).
730 Assume that currently it does not define C at all.
731 Return the keymap. */
734 define_as_prefix (keymap
, c
)
735 Lisp_Object keymap
, c
;
737 Lisp_Object inherit
, cmd
;
739 cmd
= Fmake_sparse_keymap (Qnil
);
740 /* If this key is defined as a prefix in an inherited keymap,
741 make it a prefix in this map, and make its definition
742 inherit the other prefix definition. */
743 inherit
= access_keymap (keymap
, c
, 0, 0);
746 /* If there's an inherited keymap
747 and it doesn't define this key,
748 make it define this key. */
751 for (tail
= Fcdr (keymap
); CONSP (tail
); tail
= XCONS (tail
)->cdr
)
752 if (EQ (XCONS (tail
)->car
, Qkeymap
))
756 inherit
= define_as_prefix (tail
, c
);
759 cmd
= nconc2 (cmd
, inherit
);
760 store_in_keymap (keymap
, c
, cmd
);
765 /* Append a key to the end of a key sequence. We always make a vector. */
768 append_key (key_sequence
, key
)
769 Lisp_Object key_sequence
, key
;
773 args
[0] = key_sequence
;
775 args
[1] = Fcons (key
, Qnil
);
776 return Fvconcat (2, args
);
780 /* Global, local, and minor mode keymap stuff. */
782 /* We can't put these variables inside current_minor_maps, since under
783 some systems, static gets macro-defined to be the empty string.
785 static Lisp_Object
*cmm_modes
, *cmm_maps
;
788 /* Store a pointer to an array of the keymaps of the currently active
789 minor modes in *buf, and return the number of maps it contains.
791 This function always returns a pointer to the same buffer, and may
792 free or reallocate it, so if you want to keep it for a long time or
793 hand it out to lisp code, copy it. This procedure will be called
794 for every key sequence read, so the nice lispy approach (return a
795 new assoclist, list, what have you) for each invocation would
796 result in a lot of consing over time.
798 If we used xrealloc/xmalloc and ran out of memory, they would throw
799 back to the command loop, which would try to read a key sequence,
800 which would call this function again, resulting in an infinite
801 loop. Instead, we'll use realloc/malloc and silently truncate the
802 list, let the key sequence be read, and hope some other piece of
803 code signals the error. */
805 current_minor_maps (modeptr
, mapptr
)
806 Lisp_Object
**modeptr
, **mapptr
;
809 Lisp_Object alist
, assoc
, var
, val
;
811 for (alist
= Vminor_mode_map_alist
;
813 alist
= XCONS (alist
)->cdr
)
814 if ((assoc
= XCONS (alist
)->car
, CONSP (assoc
))
815 && (var
= XCONS (assoc
)->car
, SYMBOLP (var
))
816 && (val
= find_symbol_value (var
), ! EQ (val
, Qunbound
))
821 Lisp_Object
*newmodes
, *newmaps
;
828 = (Lisp_Object
*) realloc (cmm_modes
,
829 cmm_size
* sizeof (Lisp_Object
));
831 = (Lisp_Object
*) realloc (cmm_maps
,
832 cmm_size
* sizeof (Lisp_Object
));
840 = (Lisp_Object
*) malloc (cmm_size
* sizeof (Lisp_Object
));
842 = (Lisp_Object
*) malloc (cmm_size
* sizeof (Lisp_Object
));
846 if (newmaps
&& newmodes
)
848 cmm_modes
= newmodes
;
855 cmm_maps
[i
] = Findirect_function (XCONS (assoc
)->cdr
);
859 if (modeptr
) *modeptr
= cmm_modes
;
860 if (mapptr
) *mapptr
= cmm_maps
;
864 /* GC is possible in this function if it autoloads a keymap. */
866 DEFUN ("key-binding", Fkey_binding
, Skey_binding
, 1, 2, 0,
867 "Return the binding for command KEY in current keymaps.\n\
868 KEY is a string or vector, a sequence of keystrokes.\n\
869 The binding is probably a symbol with a function definition.\n\
871 Normally, `key-binding' ignores bindings for t, which act as default\n\
872 bindings, used when nothing else in the keymap applies; this makes it\n\
873 usable as a general function for probing keymaps. However, if the\n\
874 optional second argument ACCEPT-DEFAULT is non-nil, `key-binding' does\n\
875 recognize the default bindings, just as `read-key-sequence' does.")
876 (key
, accept_default
)
877 Lisp_Object key
, accept_default
;
879 Lisp_Object
*maps
, value
;
885 if (!NILP (Voverriding_local_map
))
887 value
= Flookup_key (Voverriding_local_map
, key
, accept_default
);
888 if (! NILP (value
) && !INTEGERP (value
))
889 RETURN_UNGCPRO (value
);
893 nmaps
= current_minor_maps (0, &maps
);
894 /* Note that all these maps are GCPRO'd
895 in the places where we found them. */
897 for (i
= 0; i
< nmaps
; i
++)
898 if (! NILP (maps
[i
]))
900 value
= Flookup_key (maps
[i
], key
, accept_default
);
901 if (! NILP (value
) && !INTEGERP (value
))
902 RETURN_UNGCPRO (value
);
905 if (! NILP (current_buffer
->keymap
))
907 value
= Flookup_key (current_buffer
->keymap
, key
, accept_default
);
908 if (! NILP (value
) && !INTEGERP (value
))
909 RETURN_UNGCPRO (value
);
913 value
= Flookup_key (current_global_map
, key
, accept_default
);
915 if (! NILP (value
) && !INTEGERP (value
))
921 /* GC is possible in this function if it autoloads a keymap. */
923 DEFUN ("local-key-binding", Flocal_key_binding
, Slocal_key_binding
, 1, 2, 0,
924 "Return the binding for command KEYS in current local keymap only.\n\
925 KEYS is a string, a sequence of keystrokes.\n\
926 The binding is probably a symbol with a function definition.\n\
928 If optional argument ACCEPT-DEFAULT is non-nil, recognize default\n\
929 bindings; see the description of `lookup-key' for more details about this.")
930 (keys
, accept_default
)
931 Lisp_Object keys
, accept_default
;
933 register Lisp_Object map
;
934 map
= current_buffer
->keymap
;
937 return Flookup_key (map
, keys
, accept_default
);
940 /* GC is possible in this function if it autoloads a keymap. */
942 DEFUN ("global-key-binding", Fglobal_key_binding
, Sglobal_key_binding
, 1, 2, 0,
943 "Return the binding for command KEYS in current global keymap only.\n\
944 KEYS is a string, a sequence of keystrokes.\n\
945 The binding is probably a symbol with a function definition.\n\
946 This function's return values are the same as those of lookup-key\n\
949 If optional argument ACCEPT-DEFAULT is non-nil, recognize default\n\
950 bindings; see the description of `lookup-key' for more details about this.")
951 (keys
, accept_default
)
952 Lisp_Object keys
, accept_default
;
954 return Flookup_key (current_global_map
, keys
, accept_default
);
957 /* GC is possible in this function if it autoloads a keymap. */
959 DEFUN ("minor-mode-key-binding", Fminor_mode_key_binding
, Sminor_mode_key_binding
, 1, 2, 0,
960 "Find the visible minor mode bindings of KEY.\n\
961 Return an alist of pairs (MODENAME . BINDING), where MODENAME is the\n\
962 the symbol which names the minor mode binding KEY, and BINDING is\n\
963 KEY's definition in that mode. In particular, if KEY has no\n\
964 minor-mode bindings, return nil. If the first binding is a\n\
965 non-prefix, all subsequent bindings will be omitted, since they would\n\
966 be ignored. Similarly, the list doesn't include non-prefix bindings\n\
967 that come after prefix bindings.\n\
969 If optional argument ACCEPT-DEFAULT is non-nil, recognize default\n\
970 bindings; see the description of `lookup-key' for more details about this.")
971 (key
, accept_default
)
972 Lisp_Object key
, accept_default
;
974 Lisp_Object
*modes
, *maps
;
978 struct gcpro gcpro1
, gcpro2
;
980 nmaps
= current_minor_maps (&modes
, &maps
);
981 /* Note that all these maps are GCPRO'd
982 in the places where we found them. */
985 GCPRO2 (key
, binding
);
987 for (i
= j
= 0; i
< nmaps
; i
++)
989 && ! NILP (binding
= Flookup_key (maps
[i
], key
, accept_default
))
990 && !INTEGERP (binding
))
992 if (! NILP (get_keymap (binding
)))
993 maps
[j
++] = Fcons (modes
[i
], binding
);
995 RETURN_UNGCPRO (Fcons (Fcons (modes
[i
], binding
), Qnil
));
999 return Flist (j
, maps
);
1002 DEFUN ("global-set-key", Fglobal_set_key
, Sglobal_set_key
, 2, 2,
1003 "KSet key globally: \nCSet key %s to command: ",
1004 "Give KEY a global binding as COMMAND.\n\
1005 COMMAND is a symbol naming an interactively-callable function.\n\
1006 KEY is a key sequence (a string or vector of characters or event types).\n\
1007 Non-ASCII characters with codes above 127 (such as ISO Latin-1)\n\
1008 can be included if you use a vector.\n\
1009 Note that if KEY has a local binding in the current buffer\n\
1010 that local binding will continue to shadow any global binding.")
1012 Lisp_Object keys
, function
;
1014 if (!VECTORP (keys
) && !STRINGP (keys
))
1015 keys
= wrong_type_argument (Qarrayp
, keys
);
1017 Fdefine_key (current_global_map
, keys
, function
);
1021 DEFUN ("local-set-key", Flocal_set_key
, Slocal_set_key
, 2, 2,
1022 "KSet key locally: \nCSet key %s locally to command: ",
1023 "Give KEY a local binding as COMMAND.\n\
1024 COMMAND is a symbol naming an interactively-callable function.\n\
1025 KEY is a key sequence (a string or vector of characters or event types).\n\
1026 Non-ASCII characters with codes above 127 (such as ISO Latin-1)\n\
1027 can be included if you use a vector.\n\
1028 The binding goes in the current buffer's local map,\n\
1029 which in most cases is shared with all other buffers in the same major mode.")
1031 Lisp_Object keys
, function
;
1033 register Lisp_Object map
;
1034 map
= current_buffer
->keymap
;
1037 map
= Fmake_sparse_keymap (Qnil
);
1038 current_buffer
->keymap
= map
;
1041 if (!VECTORP (keys
) && !STRINGP (keys
))
1042 keys
= wrong_type_argument (Qarrayp
, keys
);
1044 Fdefine_key (map
, keys
, function
);
1048 DEFUN ("global-unset-key", Fglobal_unset_key
, Sglobal_unset_key
,
1049 1, 1, "kUnset key globally: ",
1050 "Remove global binding of KEY.\n\
1051 KEY is a string representing a sequence of keystrokes.")
1055 return Fglobal_set_key (keys
, Qnil
);
1058 DEFUN ("local-unset-key", Flocal_unset_key
, Slocal_unset_key
, 1, 1,
1059 "kUnset key locally: ",
1060 "Remove local binding of KEY.\n\
1061 KEY is a string representing a sequence of keystrokes.")
1065 if (!NILP (current_buffer
->keymap
))
1066 Flocal_set_key (keys
, Qnil
);
1070 DEFUN ("define-prefix-command", Fdefine_prefix_command
, Sdefine_prefix_command
, 1, 2, 0,
1071 "Define COMMAND as a prefix command. COMMAND should be a symbol.\n\
1072 A new sparse keymap is stored as COMMAND's function definition and its value.\n\
1073 If a second optional argument MAPVAR is given, the map is stored as\n\
1074 its value instead of as COMMAND's value; but COMMAND is still defined\n\
1077 Lisp_Object name
, mapvar
;
1080 map
= Fmake_sparse_keymap (Qnil
);
1089 DEFUN ("use-global-map", Fuse_global_map
, Suse_global_map
, 1, 1, 0,
1090 "Select KEYMAP as the global keymap.")
1094 keymap
= get_keymap (keymap
);
1095 current_global_map
= keymap
;
1096 record_asynch_buffer_change ();
1101 DEFUN ("use-local-map", Fuse_local_map
, Suse_local_map
, 1, 1, 0,
1102 "Select KEYMAP as the local keymap.\n\
1103 If KEYMAP is nil, that means no local keymap.")
1108 keymap
= get_keymap (keymap
);
1110 current_buffer
->keymap
= keymap
;
1111 record_asynch_buffer_change ();
1116 DEFUN ("current-local-map", Fcurrent_local_map
, Scurrent_local_map
, 0, 0, 0,
1117 "Return current buffer's local keymap, or nil if it has none.")
1120 return current_buffer
->keymap
;
1123 DEFUN ("current-global-map", Fcurrent_global_map
, Scurrent_global_map
, 0, 0, 0,
1124 "Return the current global keymap.")
1127 return current_global_map
;
1130 DEFUN ("current-minor-mode-maps", Fcurrent_minor_mode_maps
, Scurrent_minor_mode_maps
, 0, 0, 0,
1131 "Return a list of keymaps for the minor modes of the current buffer.")
1135 int nmaps
= current_minor_maps (0, &maps
);
1137 return Flist (nmaps
, maps
);
1140 /* Help functions for describing and documenting keymaps. */
1142 /* This function cannot GC. */
1144 DEFUN ("accessible-keymaps", Faccessible_keymaps
, Saccessible_keymaps
,
1146 "Find all keymaps accessible via prefix characters from KEYMAP.\n\
1147 Returns a list of elements of the form (KEYS . MAP), where the sequence\n\
1148 KEYS starting from KEYMAP gets you to MAP. These elements are ordered\n\
1149 so that the KEYS increase in length. The first element is (\"\" . KEYMAP).\n\
1150 An optional argument PREFIX, if non-nil, should be a key sequence;\n\
1151 then the value includes only maps for prefixes that start with PREFIX.")
1153 Lisp_Object startmap
, prefix
;
1155 Lisp_Object maps
, good_maps
, tail
;
1158 /* no need for gcpro because we don't autoload any keymaps. */
1161 prefixlen
= XINT (Flength (prefix
));
1165 /* If a prefix was specified, start with the keymap (if any) for
1166 that prefix, so we don't waste time considering other prefixes. */
1168 tem
= Flookup_key (startmap
, prefix
, Qt
);
1169 /* Flookup_key may give us nil, or a number,
1170 if the prefix is not defined in this particular map.
1171 It might even give us a list that isn't a keymap. */
1172 tem
= get_keymap_1 (tem
, 0, 0);
1174 maps
= Fcons (Fcons (prefix
, tem
), Qnil
);
1179 maps
= Fcons (Fcons (Fmake_vector (make_number (0), Qnil
),
1180 get_keymap (startmap
)),
1183 /* For each map in the list maps,
1184 look at any other maps it points to,
1185 and stick them at the end if they are not already in the list.
1187 This is a breadth-first traversal, where tail is the queue of
1188 nodes, and maps accumulates a list of all nodes visited. */
1190 for (tail
= maps
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
1192 register Lisp_Object thisseq
, thismap
;
1194 /* Does the current sequence end in the meta-prefix-char? */
1197 thisseq
= Fcar (Fcar (tail
));
1198 thismap
= Fcdr (Fcar (tail
));
1199 last
= make_number (XINT (Flength (thisseq
)) - 1);
1200 is_metized
= (XINT (last
) >= 0
1201 && EQ (Faref (thisseq
, last
), meta_prefix_char
));
1203 for (; CONSP (thismap
); thismap
= XCONS (thismap
)->cdr
)
1207 elt
= XCONS (thismap
)->car
;
1215 /* Vector keymap. Scan all the elements. */
1216 for (i
= 0; i
< XVECTOR (elt
)->size
; i
++)
1218 register Lisp_Object tem
;
1219 register Lisp_Object cmd
;
1221 cmd
= get_keyelt (XVECTOR (elt
)->contents
[i
], 0);
1222 if (NILP (cmd
)) continue;
1223 tem
= Fkeymapp (cmd
);
1226 cmd
= get_keymap (cmd
);
1227 /* Ignore keymaps that are already added to maps. */
1228 tem
= Frassq (cmd
, maps
);
1231 /* If the last key in thisseq is meta-prefix-char,
1232 turn it into a meta-ized keystroke. We know
1233 that the event we're about to append is an
1234 ascii keystroke since we're processing a
1238 int meta_bit
= meta_modifier
;
1239 tem
= Fcopy_sequence (thisseq
);
1241 Faset (tem
, last
, make_number (i
| meta_bit
));
1243 /* This new sequence is the same length as
1244 thisseq, so stick it in the list right
1247 = Fcons (Fcons (tem
, cmd
), XCONS (tail
)->cdr
);
1251 tem
= append_key (thisseq
, make_number (i
));
1252 nconc2 (tail
, Fcons (Fcons (tem
, cmd
), Qnil
));
1258 else if (CONSP (elt
))
1260 register Lisp_Object cmd
, tem
, filter
;
1262 cmd
= get_keyelt (XCONS (elt
)->cdr
, 0);
1263 /* Ignore definitions that aren't keymaps themselves. */
1264 tem
= Fkeymapp (cmd
);
1267 /* Ignore keymaps that have been seen already. */
1268 cmd
= get_keymap (cmd
);
1269 tem
= Frassq (cmd
, maps
);
1272 /* Let elt be the event defined by this map entry. */
1273 elt
= XCONS (elt
)->car
;
1275 /* If the last key in thisseq is meta-prefix-char, and
1276 this entry is a binding for an ascii keystroke,
1277 turn it into a meta-ized keystroke. */
1278 if (is_metized
&& INTEGERP (elt
))
1280 tem
= Fcopy_sequence (thisseq
);
1282 make_number (XINT (elt
) | meta_modifier
));
1284 /* This new sequence is the same length as
1285 thisseq, so stick it in the list right
1288 = Fcons (Fcons (tem
, cmd
), XCONS (tail
)->cdr
);
1292 Fcons (Fcons (append_key (thisseq
, elt
), cmd
),
1303 /* Now find just the maps whose access prefixes start with PREFIX. */
1306 for (; CONSP (maps
); maps
= XCONS (maps
)->cdr
)
1308 Lisp_Object elt
, thisseq
;
1309 elt
= XCONS (maps
)->car
;
1310 thisseq
= XCONS (elt
)->car
;
1311 /* The access prefix must be at least as long as PREFIX,
1312 and the first elements must match those of PREFIX. */
1313 if (XINT (Flength (thisseq
)) >= prefixlen
)
1316 for (i
= 0; i
< prefixlen
; i
++)
1319 XSETFASTINT (i1
, i
);
1320 if (!EQ (Faref (thisseq
, i1
), Faref (prefix
, i1
)))
1324 good_maps
= Fcons (elt
, good_maps
);
1328 return Fnreverse (good_maps
);
1331 Lisp_Object Qsingle_key_description
, Qkey_description
;
1333 /* This function cannot GC. */
1335 DEFUN ("key-description", Fkey_description
, Skey_description
, 1, 1, 0,
1336 "Return a pretty description of key-sequence KEYS.\n\
1337 Control characters turn into \"C-foo\" sequences, meta into \"M-foo\"\n\
1338 spaces are put between sequence elements, etc.")
1350 vector
= Fmake_vector (Flength (keys
), Qnil
);
1351 for (i
= 0; i
< XSTRING (keys
)->size
; i
++)
1353 if (XSTRING (keys
)->data
[i
] & 0x80)
1354 XSETFASTINT (XVECTOR (vector
)->contents
[i
],
1355 meta_modifier
| (XSTRING (keys
)->data
[i
] & ~0x80));
1357 XSETFASTINT (XVECTOR (vector
)->contents
[i
],
1358 XSTRING (keys
)->data
[i
]);
1362 else if (!VECTORP (keys
))
1363 keys
= wrong_type_argument (Qarrayp
, keys
);
1365 /* In effect, this computes
1366 (mapconcat 'single-key-description keys " ")
1367 but we shouldn't use mapconcat because it can do GC. */
1369 len
= XVECTOR (keys
)->size
;
1370 sep
= build_string (" ");
1371 /* This has one extra element at the end that we don't pass to Fconcat. */
1372 args
= (Lisp_Object
*) alloca (len
* 2 * sizeof (Lisp_Object
));
1374 for (i
= 0; i
< len
; i
++)
1376 args
[i
* 2] = Fsingle_key_description (XVECTOR (keys
)->contents
[i
]);
1377 args
[i
* 2 + 1] = sep
;
1380 return Fconcat (len
* 2 - 1, args
);
1384 push_key_description (c
, p
)
1385 register unsigned int c
;
1388 /* Clear all the meaningless bits above the meta bit. */
1389 c
&= meta_modifier
| ~ - meta_modifier
;
1391 if (c
& alt_modifier
)
1397 if (c
& ctrl_modifier
)
1403 if (c
& hyper_modifier
)
1407 c
-= hyper_modifier
;
1409 if (c
& meta_modifier
)
1415 if (c
& shift_modifier
)
1419 c
-= shift_modifier
;
1421 if (c
& super_modifier
)
1425 c
-= super_modifier
;
1441 else if (c
== Ctl('J'))
1447 else if (c
== Ctl('M'))
1457 if (c
> 0 && c
<= Ctl ('Z'))
1480 *p
++ = (7 & (c
>> 15)) + '0';
1481 *p
++ = (7 & (c
>> 12)) + '0';
1482 *p
++ = (7 & (c
>> 9)) + '0';
1483 *p
++ = (7 & (c
>> 6)) + '0';
1484 *p
++ = (7 & (c
>> 3)) + '0';
1485 *p
++ = (7 & (c
>> 0)) + '0';
1491 /* This function cannot GC. */
1493 DEFUN ("single-key-description", Fsingle_key_description
, Ssingle_key_description
, 1, 1, 0,
1494 "Return a pretty description of command character KEY.\n\
1495 Control characters turn into C-whatever, etc.")
1501 key
= EVENT_HEAD (key
);
1503 if (INTEGERP (key
)) /* Normal character */
1505 *push_key_description (XUINT (key
), tem
) = 0;
1506 return build_string (tem
);
1508 else if (SYMBOLP (key
)) /* Function key or event-symbol */
1509 return Fsymbol_name (key
);
1510 else if (STRINGP (key
)) /* Buffer names in the menubar. */
1511 return Fcopy_sequence (key
);
1513 error ("KEY must be an integer, cons, symbol, or string");
1517 push_text_char_description (c
, p
)
1518 register unsigned int c
;
1530 *p
++ = c
+ 64; /* 'A' - 1 */
1542 /* This function cannot GC. */
1544 DEFUN ("text-char-description", Ftext_char_description
, Stext_char_description
, 1, 1, 0,
1545 "Return a pretty description of file-character CHAR.\n\
1546 Control characters turn into \"^char\", etc.")
1552 CHECK_NUMBER (chr
, 0);
1554 *push_text_char_description (XINT (chr
) & 0377, tem
) = 0;
1556 return build_string (tem
);
1559 /* Return non-zero if SEQ contains only ASCII characters, perhaps with
1562 ascii_sequence_p (seq
)
1566 int len
= XINT (Flength (seq
));
1568 for (i
= 0; i
< len
; i
++)
1570 Lisp_Object ii
, elt
;
1572 XSETFASTINT (ii
, i
);
1573 elt
= Faref (seq
, ii
);
1576 || (XUINT (elt
) & ~CHAR_META
) >= 0x80)
1584 /* where-is - finding a command in a set of keymaps. */
1586 /* This function can GC if Flookup_key autoloads any keymaps. */
1588 DEFUN ("where-is-internal", Fwhere_is_internal
, Swhere_is_internal
, 1, 4, 0,
1589 "Return list of keys that invoke DEFINITION.\n\
1590 If KEYMAP is non-nil, search only KEYMAP and the global keymap.\n\
1591 If KEYMAP is nil, search all the currently active keymaps.\n\
1593 If optional 3rd arg FIRSTONLY is non-nil, return the first key sequence found,\n\
1594 rather than a list of all possible key sequences.\n\
1595 If FIRSTONLY is t, avoid key sequences which use non-ASCII\n\
1596 keys and therefore may not be usable on ASCII terminals. If FIRSTONLY\n\
1597 is the symbol `non-ascii', return the first binding found, no matter\n\
1598 what its components.\n\
1600 If optional 4th arg NOINDIRECT is non-nil, don't follow indirections\n\
1601 to other keymaps or slots. This makes it possible to search for an\n\
1602 indirect definition itself.")
1603 (definition
, keymap
, firstonly
, noindirect
)
1604 Lisp_Object definition
, keymap
;
1605 Lisp_Object firstonly
, noindirect
;
1608 Lisp_Object found
, sequence
;
1609 int keymap_specified
= !NILP (keymap
);
1610 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
;
1612 if (! keymap_specified
)
1614 #ifdef USE_TEXT_PROPERTIES
1615 keymap
= get_local_map (PT
, current_buffer
);
1617 keymap
= current_buffer
->keymap
;
1622 maps
= nconc2 (Faccessible_keymaps (get_keymap (keymap
), Qnil
),
1623 Faccessible_keymaps (get_keymap (current_global_map
),
1626 maps
= Faccessible_keymaps (get_keymap (current_global_map
), Qnil
);
1628 /* Put the minor mode keymaps on the front. */
1629 if (! keymap_specified
)
1632 minors
= Fnreverse (Fcurrent_minor_mode_maps ());
1633 while (!NILP (minors
))
1635 maps
= nconc2 (Faccessible_keymaps (get_keymap (XCONS (minors
)->car
),
1638 minors
= XCONS (minors
)->cdr
;
1642 GCPRO5 (definition
, keymap
, maps
, found
, sequence
);
1646 for (; !NILP (maps
); maps
= Fcdr (maps
))
1648 /* Key sequence to reach map, and the map that it reaches */
1649 register Lisp_Object
this, map
;
1651 /* If Fcar (map) is a VECTOR, the current element within that vector. */
1654 /* In order to fold [META-PREFIX-CHAR CHAR] sequences into
1655 [M-CHAR] sequences, check if last character of the sequence
1656 is the meta-prefix char. */
1660 this = Fcar (Fcar (maps
));
1661 map
= Fcdr (Fcar (maps
));
1662 last
= make_number (XINT (Flength (this)) - 1);
1663 last_is_meta
= (XINT (last
) >= 0
1664 && EQ (Faref (this, last
), meta_prefix_char
));
1670 /* Because the code we want to run on each binding is rather
1671 large, we don't want to have two separate loop bodies for
1672 sparse keymap bindings and tables; we want to iterate one
1673 loop body over both keymap and vector bindings.
1675 For this reason, if Fcar (map) is a vector, we don't
1676 advance map to the next element until i indicates that we
1677 have finished off the vector. */
1679 Lisp_Object elt
, key
, binding
;
1680 elt
= XCONS (map
)->car
;
1684 /* Set key and binding to the current key and binding, and
1685 advance map and i to the next binding. */
1688 /* In a vector, look at each element. */
1689 binding
= XVECTOR (elt
)->contents
[i
];
1690 XSETFASTINT (key
, i
);
1693 /* If we've just finished scanning a vector, advance map
1694 to the next element, and reset i in anticipation of the
1695 next vector we may find. */
1696 if (i
>= XVECTOR (elt
)->size
)
1698 map
= XCONS (map
)->cdr
;
1702 else if (CONSP (elt
))
1704 key
= Fcar (Fcar (map
));
1705 binding
= Fcdr (Fcar (map
));
1707 map
= XCONS (map
)->cdr
;
1710 /* We want to ignore keymap elements that are neither
1711 vectors nor conses. */
1713 map
= XCONS (map
)->cdr
;
1717 /* Search through indirections unless that's not wanted. */
1718 if (NILP (noindirect
))
1719 binding
= get_keyelt (binding
, 0);
1721 /* End this iteration if this element does not match
1724 if (CONSP (definition
))
1727 tem
= Fequal (binding
, definition
);
1732 if (!EQ (binding
, definition
))
1735 /* We have found a match.
1736 Construct the key sequence where we found it. */
1737 if (INTEGERP (key
) && last_is_meta
)
1739 sequence
= Fcopy_sequence (this);
1740 Faset (sequence
, last
, make_number (XINT (key
) | meta_modifier
));
1743 sequence
= append_key (this, key
);
1745 /* Verify that this key binding is not shadowed by another
1746 binding for the same key, before we say it exists.
1748 Mechanism: look for local definition of this key and if
1749 it is defined and does not match what we found then
1752 Either nil or number as value from Flookup_key
1754 if (keymap_specified
)
1756 binding
= Flookup_key (keymap
, sequence
, Qnil
);
1757 if (!NILP (binding
) && !INTEGERP (binding
))
1759 if (CONSP (definition
))
1762 tem
= Fequal (binding
, definition
);
1767 if (!EQ (binding
, definition
))
1773 binding
= Fkey_binding (sequence
, Qnil
);
1774 if (!EQ (binding
, definition
))
1778 /* It is a true unshadowed match. Record it, unless it's already
1779 been seen (as could happen when inheriting keymaps). */
1780 if (NILP (Fmember (sequence
, found
)))
1781 found
= Fcons (sequence
, found
);
1783 /* If firstonly is Qnon_ascii, then we can return the first
1784 binding we find. If firstonly is not Qnon_ascii but not
1785 nil, then we should return the first ascii-only binding
1787 if (EQ (firstonly
, Qnon_ascii
))
1788 RETURN_UNGCPRO (sequence
);
1789 else if (! NILP (firstonly
) && ascii_sequence_p (sequence
))
1790 RETURN_UNGCPRO (sequence
);
1796 found
= Fnreverse (found
);
1798 /* firstonly may have been t, but we may have gone all the way through
1799 the keymaps without finding an all-ASCII key sequence. So just
1800 return the best we could find. */
1801 if (! NILP (firstonly
))
1802 return Fcar (found
);
1807 /* describe-bindings - summarizing all the bindings in a set of keymaps. */
1809 DEFUN ("describe-bindings", Fdescribe_bindings
, Sdescribe_bindings
, 0, 1, "",
1810 "Show a list of all defined keys, and their definitions.\n\
1811 The list is put in a buffer, which is displayed.\n\
1812 An optional argument PREFIX, if non-nil, should be a key sequence;\n\
1813 then we display only bindings that start with that prefix.")
1817 register Lisp_Object thisbuf
;
1818 XSETBUFFER (thisbuf
, current_buffer
);
1819 internal_with_output_to_temp_buffer ("*Help*",
1820 describe_buffer_bindings
,
1821 Fcons (thisbuf
, prefix
));
1825 /* ARG is (BUFFER . PREFIX). */
1828 describe_buffer_bindings (arg
)
1831 Lisp_Object descbuf
, prefix
, shadow
;
1832 register Lisp_Object start1
;
1833 struct gcpro gcpro1
;
1835 char *alternate_heading
1837 Alternate Characters (use anywhere the nominal character is listed):\n\
1838 nominal alternate\n\
1839 ------- ---------\n";
1841 descbuf
= XCONS (arg
)->car
;
1842 prefix
= XCONS (arg
)->cdr
;
1846 Fset_buffer (Vstandard_output
);
1848 /* Report on alternates for keys. */
1849 if (STRINGP (Vkeyboard_translate_table
))
1852 unsigned char *translate
= XSTRING (Vkeyboard_translate_table
)->data
;
1853 int translate_len
= XSTRING (Vkeyboard_translate_table
)->size
;
1855 for (c
= 0; c
< translate_len
; c
++)
1856 if (translate
[c
] != c
)
1861 if (alternate_heading
)
1863 insert_string (alternate_heading
);
1864 alternate_heading
= 0;
1867 bufend
= push_key_description (translate
[c
], buf
);
1868 insert (buf
, bufend
- buf
);
1869 Findent_to (make_number (16), make_number (1));
1870 bufend
= push_key_description (c
, buf
);
1871 insert (buf
, bufend
- buf
);
1881 Lisp_Object
*modes
, *maps
;
1883 /* Temporarily switch to descbuf, so that we can get that buffer's
1884 minor modes correctly. */
1885 Fset_buffer (descbuf
);
1886 if (!NILP (Voverriding_local_map
))
1889 nmaps
= current_minor_maps (&modes
, &maps
);
1890 Fset_buffer (Vstandard_output
);
1892 /* Print the minor mode maps. */
1893 for (i
= 0; i
< nmaps
; i
++)
1895 /* The title for a minor mode keymap
1896 is constructed at run time.
1897 We let describe_map_tree do the actual insertion
1898 because it takes care of other features when doing so. */
1901 if (!SYMBOLP (modes
[i
]))
1904 p
= title
= (char *) alloca (40 + XSYMBOL (modes
[i
])->name
->size
);
1906 bcopy (XSYMBOL (modes
[i
])->name
->data
, p
,
1907 XSYMBOL (modes
[i
])->name
->size
);
1908 p
+= XSYMBOL (modes
[i
])->name
->size
;
1910 bcopy (" Minor Mode Bindings", p
, sizeof (" Minor Mode Bindings") - 1);
1911 p
+= sizeof (" Minor Mode Bindings") - 1;
1914 describe_map_tree (maps
[i
], 0, shadow
, prefix
, title
, 0);
1915 shadow
= Fcons (maps
[i
], shadow
);
1919 /* Print the (major mode) local map. */
1920 if (!NILP (Voverriding_local_map
))
1921 start1
= Voverriding_local_map
;
1923 start1
= XBUFFER (descbuf
)->keymap
;
1927 describe_map_tree (start1
, 0, shadow
, prefix
,
1928 "Major Mode Bindings", 0);
1929 shadow
= Fcons (start1
, shadow
);
1932 describe_map_tree (current_global_map
, 0, shadow
, prefix
,
1933 "Global Bindings", 0);
1935 call0 (intern ("help-mode"));
1936 Fset_buffer (descbuf
);
1941 /* Insert a desription of the key bindings in STARTMAP,
1942 followed by those of all maps reachable through STARTMAP.
1943 If PARTIAL is nonzero, omit certain "uninteresting" commands
1944 (such as `undefined').
1945 If SHADOW is non-nil, it is a list of maps;
1946 don't mention keys which would be shadowed by any of them.
1947 PREFIX, if non-nil, says mention only keys that start with PREFIX.
1948 TITLE, if not 0, is a string to insert at the beginning.
1949 TITLE should not end with a colon or a newline; we supply that.
1950 If NOMENU is not 0, then omit menu-bar commands. */
1953 describe_map_tree (startmap
, partial
, shadow
, prefix
, title
, nomenu
)
1954 Lisp_Object startmap
, shadow
, prefix
;
1959 Lisp_Object maps
, seen
, sub_shadows
;
1960 struct gcpro gcpro1
, gcpro2
, gcpro3
;
1967 maps
= Faccessible_keymaps (startmap
, prefix
);
1970 GCPRO3 (maps
, seen
, sub_shadows
);
1976 /* Delete from MAPS each element that is for the menu bar. */
1977 for (list
= maps
; !NILP (list
); list
= XCONS (list
)->cdr
)
1979 Lisp_Object elt
, prefix
, tem
;
1982 prefix
= Fcar (elt
);
1983 if (XVECTOR (prefix
)->size
>= 1)
1985 tem
= Faref (prefix
, make_number (0));
1986 if (EQ (tem
, Qmenu_bar
))
1987 maps
= Fdelq (elt
, maps
);
1996 insert_string (title
);
1999 insert_string (" Starting With ");
2000 insert1 (Fkey_description (prefix
));
2002 insert_string (":\n");
2004 insert_string (key_heading
);
2008 for (; !NILP (maps
); maps
= Fcdr (maps
))
2010 register Lisp_Object elt
, prefix
, tail
;
2013 prefix
= Fcar (elt
);
2017 for (tail
= shadow
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
2021 shmap
= XCONS (tail
)->car
;
2023 /* If the sequence by which we reach this keymap is zero-length,
2024 then the shadow map for this keymap is just SHADOW. */
2025 if ((STRINGP (prefix
) && XSTRING (prefix
)->size
== 0)
2026 || (VECTORP (prefix
) && XVECTOR (prefix
)->size
== 0))
2028 /* If the sequence by which we reach this keymap actually has
2029 some elements, then the sequence's definition in SHADOW is
2030 what we should use. */
2033 shmap
= Flookup_key (shmap
, Fcar (elt
), Qt
);
2034 if (INTEGERP (shmap
))
2038 /* If shmap is not nil and not a keymap,
2039 it completely shadows this map, so don't
2040 describe this map at all. */
2041 if (!NILP (shmap
) && NILP (Fkeymapp (shmap
)))
2045 sub_shadows
= Fcons (shmap
, sub_shadows
);
2048 describe_map (Fcdr (elt
), Fcar (elt
), describe_command
,
2049 partial
, sub_shadows
, &seen
);
2055 insert_string ("\n");
2061 describe_command (definition
)
2062 Lisp_Object definition
;
2064 register Lisp_Object tem1
;
2066 Findent_to (make_number (16), make_number (1));
2068 if (SYMBOLP (definition
))
2070 XSETSTRING (tem1
, XSYMBOL (definition
)->name
);
2072 insert_string ("\n");
2074 else if (STRINGP (definition
))
2075 insert_string ("Keyboard Macro\n");
2078 tem1
= Fkeymapp (definition
);
2080 insert_string ("Prefix Command\n");
2082 insert_string ("??\n");
2086 /* Like Flookup_key, but uses a list of keymaps SHADOW instead of a single map.
2087 Returns the first non-nil binding found in any of those maps. */
2090 shadow_lookup (shadow
, key
, flag
)
2091 Lisp_Object shadow
, key
, flag
;
2093 Lisp_Object tail
, value
;
2095 for (tail
= shadow
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
2097 value
= Flookup_key (XCONS (tail
)->car
, key
, flag
);
2104 /* Describe the contents of map MAP, assuming that this map itself is
2105 reached by the sequence of prefix keys KEYS (a string or vector).
2106 PARTIAL, SHADOW are as in `describe_map_tree' above. */
2109 describe_map (map
, keys
, elt_describer
, partial
, shadow
, seen
)
2110 register Lisp_Object map
;
2112 int (*elt_describer
) ();
2117 Lisp_Object elt_prefix
;
2118 Lisp_Object tail
, definition
, event
;
2120 Lisp_Object suppress
;
2123 struct gcpro gcpro1
, gcpro2
, gcpro3
;
2125 if (!NILP (keys
) && XFASTINT (Flength (keys
)) > 0)
2127 /* Call Fkey_description first, to avoid GC bug for the other string. */
2128 tem
= Fkey_description (keys
);
2129 elt_prefix
= concat2 (tem
, build_string (" "));
2135 suppress
= intern ("suppress-keymap");
2137 /* This vector gets used to present single keys to Flookup_key. Since
2138 that is done once per keymap element, we don't want to cons up a
2139 fresh vector every time. */
2140 kludge
= Fmake_vector (make_number (1), Qnil
);
2143 GCPRO3 (elt_prefix
, definition
, kludge
);
2145 for (tail
= map
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
2149 if (VECTORP (XCONS (tail
)->car
))
2150 describe_vector (XCONS (tail
)->car
,
2151 elt_prefix
, elt_describer
, partial
, shadow
);
2152 else if (CONSP (XCONS (tail
)->car
))
2154 event
= XCONS (XCONS (tail
)->car
)->car
;
2156 /* Ignore bindings whose "keys" are not really valid events.
2157 (We get these in the frames and buffers menu.) */
2158 if (! (SYMBOLP (event
) || INTEGERP (event
)))
2161 definition
= get_keyelt (XCONS (XCONS (tail
)->car
)->cdr
, 0);
2163 /* Don't show undefined commands or suppressed commands. */
2164 if (NILP (definition
)) continue;
2165 if (SYMBOLP (definition
) && partial
)
2167 tem
= Fget (definition
, suppress
);
2172 /* Don't show a command that isn't really visible
2173 because a local definition of the same key shadows it. */
2175 XVECTOR (kludge
)->contents
[0] = event
;
2178 tem
= shadow_lookup (shadow
, kludge
, Qt
);
2179 if (!NILP (tem
)) continue;
2182 tem
= Flookup_key (map
, kludge
, Qt
);
2183 if (! EQ (tem
, definition
)) continue;
2191 if (!NILP (elt_prefix
))
2192 insert1 (elt_prefix
);
2194 /* THIS gets the string to describe the character EVENT. */
2195 insert1 (Fsingle_key_description (event
));
2197 /* Print a description of the definition of this character.
2198 elt_describer will take care of spacing out far enough
2199 for alignment purposes. */
2200 (*elt_describer
) (definition
);
2202 else if (EQ (XCONS (tail
)->car
, Qkeymap
))
2204 /* The same keymap might be in the structure twice, if we're
2205 using an inherited keymap. So skip anything we've already
2207 tem
= Fassq (tail
, *seen
);
2208 if (CONSP (tem
) && !NILP (Fequal (XCONS (tem
)->car
, keys
)))
2210 *seen
= Fcons (Fcons (tail
, keys
), *seen
);
2218 describe_vector_princ (elt
)
2221 Findent_to (make_number (16), make_number (1));
2226 DEFUN ("describe-vector", Fdescribe_vector
, Sdescribe_vector
, 1, 1, 0,
2227 "Insert a description of contents of VECTOR.\n\
2228 This is text showing the elements of vector matched against indices.")
2232 int count
= specpdl_ptr
- specpdl
;
2234 specbind (Qstandard_output
, Fcurrent_buffer ());
2235 CHECK_VECTOR (vector
, 0);
2236 describe_vector (vector
, Qnil
, describe_vector_princ
, 0, Qnil
);
2238 return unbind_to (count
, Qnil
);
2241 describe_vector (vector
, elt_prefix
, elt_describer
, partial
, shadow
)
2242 register Lisp_Object vector
;
2243 Lisp_Object elt_prefix
;
2244 int (*elt_describer
) ();
2250 Lisp_Object tem1
, tem2
;
2252 Lisp_Object suppress
;
2255 struct gcpro gcpro1
, gcpro2
, gcpro3
;
2259 /* This vector gets used to present single keys to Flookup_key. Since
2260 that is done once per vector element, we don't want to cons up a
2261 fresh vector every time. */
2262 kludge
= Fmake_vector (make_number (1), Qnil
);
2263 GCPRO3 (elt_prefix
, tem1
, kludge
);
2266 suppress
= intern ("suppress-keymap");
2268 for (i
= 0; i
< XVECTOR (vector
)->size
; i
++)
2271 tem1
= get_keyelt (XVECTOR (vector
)->contents
[i
], 0);
2273 if (NILP (tem1
)) continue;
2275 /* Don't mention suppressed commands. */
2276 if (SYMBOLP (tem1
) && partial
)
2278 this = Fget (tem1
, suppress
);
2283 /* If this command in this map is shadowed by some other map,
2289 XVECTOR (kludge
)->contents
[0] = make_number (i
);
2290 tem
= shadow_lookup (shadow
, kludge
, Qt
);
2292 if (!NILP (tem
)) continue;
2301 /* Output the prefix that applies to every entry in this map. */
2302 if (!NILP (elt_prefix
))
2303 insert1 (elt_prefix
);
2305 /* Get the string to describe the character I, and print it. */
2306 XSETFASTINT (dummy
, i
);
2308 /* THIS gets the string to describe the character DUMMY. */
2309 this = Fsingle_key_description (dummy
);
2312 /* Find all consecutive characters that have the same definition. */
2313 while (i
+ 1 < XVECTOR (vector
)->size
2314 && (tem2
= get_keyelt (XVECTOR (vector
)->contents
[i
+1], 0),
2318 /* If we have a range of more than one character,
2319 print where the range reaches to. */
2321 if (i
!= XINT (dummy
))
2324 if (!NILP (elt_prefix
))
2325 insert1 (elt_prefix
);
2327 XSETFASTINT (dummy
, i
);
2328 insert1 (Fsingle_key_description (dummy
));
2331 /* Print a description of the definition of this character.
2332 elt_describer will take care of spacing out far enough
2333 for alignment purposes. */
2334 (*elt_describer
) (tem1
);
2340 /* Apropos - finding all symbols whose names match a regexp. */
2341 Lisp_Object apropos_predicate
;
2342 Lisp_Object apropos_accumulate
;
2345 apropos_accum (symbol
, string
)
2346 Lisp_Object symbol
, string
;
2348 register Lisp_Object tem
;
2350 tem
= Fstring_match (string
, Fsymbol_name (symbol
), Qnil
);
2351 if (!NILP (tem
) && !NILP (apropos_predicate
))
2352 tem
= call1 (apropos_predicate
, symbol
);
2354 apropos_accumulate
= Fcons (symbol
, apropos_accumulate
);
2357 DEFUN ("apropos-internal", Fapropos_internal
, Sapropos_internal
, 1, 2, 0,
2358 "Show all symbols whose names contain match for REGEXP.\n\
2359 If optional 2nd arg PRED is non-nil, (funcall PRED SYM) is done\n\
2360 for each symbol and a symbol is mentioned only if that returns non-nil.\n\
2361 Return list of symbols found.")
2363 Lisp_Object string
, pred
;
2365 struct gcpro gcpro1
, gcpro2
;
2366 CHECK_STRING (string
, 0);
2367 apropos_predicate
= pred
;
2368 GCPRO2 (apropos_predicate
, apropos_accumulate
);
2369 apropos_accumulate
= Qnil
;
2370 map_obarray (Vobarray
, apropos_accum
, string
);
2371 apropos_accumulate
= Fsort (apropos_accumulate
, Qstring_lessp
);
2373 return apropos_accumulate
;
2380 Qkeymap
= intern ("keymap");
2381 staticpro (&Qkeymap
);
2383 /* Initialize the keymaps standardly used.
2384 Each one is the value of a Lisp variable, and is also
2385 pointed to by a C variable */
2387 global_map
= Fcons (Qkeymap
,
2388 Fcons (Fmake_vector (make_number (0400), Qnil
), Qnil
));
2389 Fset (intern ("global-map"), global_map
);
2391 meta_map
= Fmake_keymap (Qnil
);
2392 Fset (intern ("esc-map"), meta_map
);
2393 Ffset (intern ("ESC-prefix"), meta_map
);
2395 control_x_map
= Fmake_keymap (Qnil
);
2396 Fset (intern ("ctl-x-map"), control_x_map
);
2397 Ffset (intern ("Control-X-prefix"), control_x_map
);
2399 DEFVAR_LISP ("minibuffer-local-map", &Vminibuffer_local_map
,
2400 "Default keymap to use when reading from the minibuffer.");
2401 Vminibuffer_local_map
= Fmake_sparse_keymap (Qnil
);
2403 DEFVAR_LISP ("minibuffer-local-ns-map", &Vminibuffer_local_ns_map
,
2404 "Local keymap for the minibuffer when spaces are not allowed.");
2405 Vminibuffer_local_ns_map
= Fmake_sparse_keymap (Qnil
);
2407 DEFVAR_LISP ("minibuffer-local-completion-map", &Vminibuffer_local_completion_map
,
2408 "Local keymap for minibuffer input with completion.");
2409 Vminibuffer_local_completion_map
= Fmake_sparse_keymap (Qnil
);
2411 DEFVAR_LISP ("minibuffer-local-must-match-map", &Vminibuffer_local_must_match_map
,
2412 "Local keymap for minibuffer input with completion, for exact match.");
2413 Vminibuffer_local_must_match_map
= Fmake_sparse_keymap (Qnil
);
2415 current_global_map
= global_map
;
2417 DEFVAR_LISP ("minor-mode-map-alist", &Vminor_mode_map_alist
,
2418 "Alist of keymaps to use for minor modes.\n\
2419 Each element looks like (VARIABLE . KEYMAP); KEYMAP is used to read\n\
2420 key sequences and look up bindings iff VARIABLE's value is non-nil.\n\
2421 If two active keymaps bind the same key, the keymap appearing earlier\n\
2422 in the list takes precedence.");
2423 Vminor_mode_map_alist
= Qnil
;
2425 DEFVAR_LISP ("function-key-map", &Vfunction_key_map
,
2426 "Keymap mapping ASCII function key sequences onto their preferred forms.\n\
2427 This allows Emacs to recognize function keys sent from ASCII\n\
2428 terminals at any point in a key sequence.\n\
2430 The `read-key-sequence' function replaces any subsequence bound by\n\
2431 `function-key-map' with its binding. More precisely, when the active\n\
2432 keymaps have no binding for the current key sequence but\n\
2433 `function-key-map' binds a suffix of the sequence to a vector or string,\n\
2434 `read-key-sequence' replaces the matching suffix with its binding, and\n\
2435 continues with the new sequence.\n\
2437 The events that come from bindings in `function-key-map' are not\n\
2438 themselves looked up in `function-key-map'.\n\
2440 For example, suppose `function-key-map' binds `ESC O P' to [f1].\n\
2441 Typing `ESC O P' to `read-key-sequence' would return [f1]. Typing\n\
2442 `C-x ESC O P' would return [?\\C-x f1]. If [f1] were a prefix\n\
2443 key, typing `ESC O P x' would return [f1 x].");
2444 Vfunction_key_map
= Fmake_sparse_keymap (Qnil
);
2446 Qsingle_key_description
= intern ("single-key-description");
2447 staticpro (&Qsingle_key_description
);
2449 Qkey_description
= intern ("key-description");
2450 staticpro (&Qkey_description
);
2452 Qkeymapp
= intern ("keymapp");
2453 staticpro (&Qkeymapp
);
2455 Qnon_ascii
= intern ("non-ascii");
2456 staticpro (&Qnon_ascii
);
2458 defsubr (&Skeymapp
);
2459 defsubr (&Smake_keymap
);
2460 defsubr (&Smake_sparse_keymap
);
2461 defsubr (&Scopy_keymap
);
2462 defsubr (&Skey_binding
);
2463 defsubr (&Slocal_key_binding
);
2464 defsubr (&Sglobal_key_binding
);
2465 defsubr (&Sminor_mode_key_binding
);
2466 defsubr (&Sglobal_set_key
);
2467 defsubr (&Slocal_set_key
);
2468 defsubr (&Sdefine_key
);
2469 defsubr (&Slookup_key
);
2470 defsubr (&Sglobal_unset_key
);
2471 defsubr (&Slocal_unset_key
);
2472 defsubr (&Sdefine_prefix_command
);
2473 defsubr (&Suse_global_map
);
2474 defsubr (&Suse_local_map
);
2475 defsubr (&Scurrent_local_map
);
2476 defsubr (&Scurrent_global_map
);
2477 defsubr (&Scurrent_minor_mode_maps
);
2478 defsubr (&Saccessible_keymaps
);
2479 defsubr (&Skey_description
);
2480 defsubr (&Sdescribe_vector
);
2481 defsubr (&Ssingle_key_description
);
2482 defsubr (&Stext_char_description
);
2483 defsubr (&Swhere_is_internal
);
2484 defsubr (&Sdescribe_bindings
);
2485 defsubr (&Sapropos_internal
);
2492 initial_define_key (global_map
, 033, "ESC-prefix");
2493 initial_define_key (global_map
, Ctl('X'), "Control-X-prefix");