1 /* Manipulation of keymaps
2 Copyright (C) 1985, 86, 87, 88, 93, 94, 95 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 /* A list of all commands given new bindings since a certain time
77 when nil was stored here.
78 This is used to speed up recomputation of menu key equivalents
79 when Emacs starts up. t means don't record anything here. */
80 Lisp_Object Vdefine_key_rebound_commands
;
82 Lisp_Object Qkeymapp
, Qkeymap
, Qnon_ascii
;
84 /* A char with the CHAR_META bit set in a vector or the 0200 bit set
85 in a string key sequence is equivalent to prefixing with this
87 extern Lisp_Object meta_prefix_char
;
89 extern Lisp_Object Voverriding_local_map
;
91 static Lisp_Object
define_as_prefix ();
92 static Lisp_Object
describe_buffer_bindings ();
93 static void describe_command ();
94 static void describe_map ();
96 /* Keymap object support - constructors and predicates. */
98 DEFUN ("make-keymap", Fmake_keymap
, Smake_keymap
, 0, 1, 0,
99 "Construct and return a new keymap, of the form (keymap VECTOR . ALIST).\n\
100 VECTOR is a vector which holds the bindings for the ASCII\n\
101 characters. ALIST is an assoc-list which holds bindings for function keys,\n\
102 mouse events, and any other things that appear in the input stream.\n\
103 All entries in it are initially nil, meaning \"command undefined\".\n\n\
104 The optional arg STRING supplies a menu name for the keymap\n\
105 in case you use it as a menu with `x-popup-menu'.")
111 tail
= Fcons (string
, Qnil
);
114 return Fcons (Qkeymap
,
115 Fcons (Fmake_vector (make_number (DENSE_TABLE_SIZE
), Qnil
),
119 DEFUN ("make-sparse-keymap", Fmake_sparse_keymap
, Smake_sparse_keymap
, 0, 1, 0,
120 "Construct and return a new sparse-keymap list.\n\
121 Its car is `keymap' and its cdr is an alist of (CHAR . DEFINITION),\n\
122 which binds the character CHAR to DEFINITION, or (SYMBOL . DEFINITION),\n\
123 which binds the function key or mouse event SYMBOL to DEFINITION.\n\
124 Initially the alist is nil.\n\n\
125 The optional arg STRING supplies a menu name for the keymap\n\
126 in case you use it as a menu with `x-popup-menu'.")
131 return Fcons (Qkeymap
, Fcons (string
, Qnil
));
132 return Fcons (Qkeymap
, Qnil
);
135 /* This function is used for installing the standard key bindings
136 at initialization time.
140 initial_define_key (control_x_map, Ctl('X'), "exchange-point-and-mark"); */
143 initial_define_key (keymap
, key
, defname
)
148 store_in_keymap (keymap
, make_number (key
), intern (defname
));
152 initial_define_lispy_key (keymap
, keyname
, defname
)
157 store_in_keymap (keymap
, intern (keyname
), intern (defname
));
160 /* Define character fromchar in map frommap as an alias for character
161 tochar in map tomap. Subsequent redefinitions of the latter WILL
162 affect the former. */
166 synkey (frommap
, fromchar
, tomap
, tochar
)
167 struct Lisp_Vector
*frommap
, *tomap
;
168 int fromchar
, tochar
;
171 XSETVECTOR (v
, tomap
);
172 XSETFASTINT (c
, tochar
);
173 frommap
->contents
[fromchar
] = Fcons (v
, c
);
177 DEFUN ("keymapp", Fkeymapp
, Skeymapp
, 1, 1, 0,
178 "Return t if ARG is a keymap.\n\
180 A keymap is a list (keymap . ALIST),\n\
181 or a symbol whose function definition is itself a keymap.\n\
182 ALIST elements look like (CHAR . DEFN) or (SYMBOL . DEFN);\n\
183 a vector of densely packed bindings for small character codes\n\
184 is also allowed as an element.")
188 return (NILP (get_keymap_1 (object
, 0, 0)) ? Qnil
: Qt
);
191 /* Check that OBJECT is a keymap (after dereferencing through any
192 symbols). If it is, return it.
194 If AUTOLOAD is non-zero and OBJECT is a symbol whose function value
195 is an autoload form, do the autoload and try again.
196 If AUTOLOAD is nonzero, callers must assume GC is possible.
198 ERROR controls how we respond if OBJECT isn't a keymap.
199 If ERROR is non-zero, signal an error; otherwise, just return Qnil.
201 Note that most of the time, we don't want to pursue autoloads.
202 Functions like Faccessible_keymaps which scan entire keymap trees
203 shouldn't load every autoloaded keymap. I'm not sure about this,
204 but it seems to me that only read_key_sequence, Flookup_key, and
205 Fdefine_key should cause keymaps to be autoloaded. */
208 get_keymap_1 (object
, error
, autoload
)
215 tem
= indirect_function (object
);
216 if (CONSP (tem
) && EQ (XCONS (tem
)->car
, Qkeymap
))
219 /* Should we do an autoload? Autoload forms for keymaps have
220 Qkeymap as their fifth element. */
224 && EQ (XCONS (tem
)->car
, Qautoload
))
228 tail
= Fnth (make_number (4), tem
);
229 if (EQ (tail
, Qkeymap
))
231 struct gcpro gcpro1
, gcpro2
;
233 GCPRO2 (tem
, object
);
234 do_autoload (tem
, object
);
242 wrong_type_argument (Qkeymapp
, object
);
248 /* Follow any symbol chaining, and return the keymap denoted by OBJECT.
249 If OBJECT doesn't denote a keymap at all, signal an error. */
254 return get_keymap_1 (object
, 1, 0);
258 /* Look up IDX in MAP. IDX may be any sort of event.
259 Note that this does only one level of lookup; IDX must be a single
260 event, not a sequence.
262 If T_OK is non-zero, bindings for Qt are treated as default
263 bindings; any key left unmentioned by other tables and bindings is
264 given the binding of Qt.
266 If T_OK is zero, bindings for Qt are not treated specially.
268 If NOINHERIT, don't accept a subkeymap found in an inherited keymap. */
271 access_keymap (map
, idx
, t_ok
, noinherit
)
280 /* If idx is a list (some sort of mouse click, perhaps?),
281 the index we want to use is the car of the list, which
282 ought to be a symbol. */
283 idx
= EVENT_HEAD (idx
);
285 /* If idx is a symbol, it might have modifiers, which need to
286 be put in the canonical order. */
288 idx
= reorder_modifiers (idx
);
289 else if (INTEGERP (idx
))
290 /* Clobber the high bits that can be present on a machine
291 with more than 24 bits of integer. */
292 XSETFASTINT (idx
, XINT (idx
) & (CHAR_META
| (CHAR_META
- 1)));
296 Lisp_Object t_binding
;
299 for (tail
= map
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
303 binding
= XCONS (tail
)->car
;
304 if (SYMBOLP (binding
))
306 /* If NOINHERIT, stop finding prefix definitions
307 after we pass a second occurrence of the `keymap' symbol. */
308 if (noinherit
&& EQ (binding
, Qkeymap
) && ! EQ (tail
, map
))
311 else if (CONSP (binding
))
313 if (EQ (XCONS (binding
)->car
, idx
))
315 val
= XCONS (binding
)->cdr
;
316 if (noprefix
&& CONSP (val
) && EQ (XCONS (val
)->car
, Qkeymap
))
320 if (t_ok
&& EQ (XCONS (binding
)->car
, Qt
))
321 t_binding
= XCONS (binding
)->cdr
;
323 else if (VECTORP (binding
))
325 if (NATNUMP (idx
) && XFASTINT (idx
) < XVECTOR (binding
)->size
)
327 val
= XVECTOR (binding
)->contents
[XFASTINT (idx
)];
328 if (noprefix
&& CONSP (val
) && EQ (XCONS (val
)->car
, Qkeymap
))
341 /* Given OBJECT which was found in a slot in a keymap,
342 trace indirect definitions to get the actual definition of that slot.
343 An indirect definition is a list of the form
344 (KEYMAP . INDEX), where KEYMAP is a keymap or a symbol defined as one
345 and INDEX is the object to look up in KEYMAP to yield the definition.
347 Also if OBJECT has a menu string as the first element,
348 remove that. Also remove a menu help string as second element.
350 If AUTOLOAD is nonzero, load autoloadable keymaps
351 that are referred to with indirection. */
354 get_keyelt (object
, autoload
)
355 register Lisp_Object object
;
360 register Lisp_Object map
, tem
;
362 /* If the contents are (KEYMAP . ELEMENT), go indirect. */
363 map
= get_keymap_1 (Fcar_safe (object
), 0, autoload
);
364 tem
= Fkeymapp (map
);
366 object
= access_keymap (map
, Fcdr (object
), 0, 0);
368 /* If the keymap contents looks like (STRING . DEFN),
370 Keymap alist elements like (CHAR MENUSTRING . DEFN)
371 will be used by HierarKey menus. */
372 else if (CONSP (object
)
373 && STRINGP (XCONS (object
)->car
))
375 object
= XCONS (object
)->cdr
;
376 /* Also remove a menu help string, if any,
377 following the menu item name. */
378 if (CONSP (object
) && STRINGP (XCONS (object
)->car
))
379 object
= XCONS (object
)->cdr
;
380 /* Also remove the sublist that caches key equivalences, if any. */
382 && CONSP (XCONS (object
)->car
))
385 carcar
= XCONS (XCONS (object
)->car
)->car
;
386 if (NILP (carcar
) || VECTORP (carcar
))
387 object
= XCONS (object
)->cdr
;
392 /* Anything else is really the value. */
398 store_in_keymap (keymap
, idx
, def
)
400 register Lisp_Object idx
;
401 register Lisp_Object def
;
403 /* If we are preparing to dump, and DEF is a menu element
404 with a menu item string, copy it to ensure it is not pure. */
405 if (!NILP (Vpurify_flag
) && CONSP (def
)
406 && STRINGP (XCONS (def
)->car
))
407 def
= Fcons (XCONS (def
)->car
, XCONS (def
)->cdr
);
409 if (!CONSP (keymap
) || ! EQ (XCONS (keymap
)->car
, Qkeymap
))
410 error ("attempt to define a key in a non-keymap");
412 /* If idx is a list (some sort of mouse click, perhaps?),
413 the index we want to use is the car of the list, which
414 ought to be a symbol. */
415 idx
= EVENT_HEAD (idx
);
417 /* If idx is a symbol, it might have modifiers, which need to
418 be put in the canonical order. */
420 idx
= reorder_modifiers (idx
);
421 else if (INTEGERP (idx
))
422 /* Clobber the high bits that can be present on a machine
423 with more than 24 bits of integer. */
424 XSETFASTINT (idx
, XINT (idx
) & (CHAR_META
| (CHAR_META
- 1)));
426 /* Scan the keymap for a binding of idx. */
430 /* The cons after which we should insert new bindings. If the
431 keymap has a table element, we record its position here, so new
432 bindings will go after it; this way, the table will stay
433 towards the front of the alist and character lookups in dense
434 keymaps will remain fast. Otherwise, this just points at the
435 front of the keymap. */
436 Lisp_Object insertion_point
;
438 insertion_point
= keymap
;
439 for (tail
= XCONS (keymap
)->cdr
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
443 elt
= XCONS (tail
)->car
;
446 if (NATNUMP (idx
) && XFASTINT (idx
) < XVECTOR (elt
)->size
)
448 XVECTOR (elt
)->contents
[XFASTINT (idx
)] = def
;
451 insertion_point
= tail
;
453 else if (CONSP (elt
))
455 if (EQ (idx
, XCONS (elt
)->car
))
457 XCONS (elt
)->cdr
= def
;
461 else if (SYMBOLP (elt
))
463 /* If we find a 'keymap' symbol in the spine of KEYMAP,
464 then we must have found the start of a second keymap
465 being used as the tail of KEYMAP, and a binding for IDX
466 should be inserted before it. */
467 if (EQ (elt
, Qkeymap
))
475 /* We have scanned the entire keymap, and not found a binding for
476 IDX. Let's add one. */
477 XCONS (insertion_point
)->cdr
478 = Fcons (Fcons (idx
, def
), XCONS (insertion_point
)->cdr
);
485 DEFUN ("copy-keymap", Fcopy_keymap
, Scopy_keymap
, 1, 1, 0,
486 "Return a copy of the keymap KEYMAP.\n\
487 The copy starts out with the same definitions of KEYMAP,\n\
488 but changing either the copy or KEYMAP does not affect the other.\n\
489 Any key definitions that are subkeymaps are recursively copied.\n\
490 However, a key definition which is a symbol whose definition is a keymap\n\
495 register Lisp_Object copy
, tail
;
497 copy
= Fcopy_alist (get_keymap (keymap
));
499 for (tail
= copy
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
503 elt
= XCONS (tail
)->car
;
508 elt
= Fcopy_sequence (elt
);
509 XCONS (tail
)->car
= elt
;
511 for (i
= 0; i
< XVECTOR (elt
)->size
; i
++)
512 if (!SYMBOLP (XVECTOR (elt
)->contents
[i
])
513 && ! NILP (Fkeymapp (XVECTOR (elt
)->contents
[i
])))
514 XVECTOR (elt
)->contents
[i
] =
515 Fcopy_keymap (XVECTOR (elt
)->contents
[i
]);
517 else if (CONSP (elt
))
519 /* Skip the optional menu string. */
520 if (CONSP (XCONS (elt
)->cdr
)
521 && STRINGP (XCONS (XCONS (elt
)->cdr
)->car
))
525 /* Copy the cell, since copy-alist didn't go this deep. */
526 XCONS (elt
)->cdr
= Fcons (XCONS (XCONS (elt
)->cdr
)->car
,
527 XCONS (XCONS (elt
)->cdr
)->cdr
);
528 elt
= XCONS (elt
)->cdr
;
530 /* Also skip the optional menu help string. */
531 if (CONSP (XCONS (elt
)->cdr
)
532 && STRINGP (XCONS (XCONS (elt
)->cdr
)->car
))
534 XCONS (elt
)->cdr
= Fcons (XCONS (XCONS (elt
)->cdr
)->car
,
535 XCONS (XCONS (elt
)->cdr
)->cdr
);
536 elt
= XCONS (elt
)->cdr
;
538 /* There may also be a list that caches key equivalences.
539 Just delete it for the new keymap. */
540 if (CONSP (XCONS (elt
)->cdr
)
541 && CONSP (XCONS (XCONS (elt
)->cdr
)->car
)
542 && (NILP (tem
= XCONS (XCONS (XCONS (elt
)->cdr
)->car
)->car
)
544 XCONS (elt
)->cdr
= XCONS (XCONS (elt
)->cdr
)->cdr
;
547 && ! SYMBOLP (XCONS (elt
)->cdr
)
548 && ! NILP (Fkeymapp (XCONS (elt
)->cdr
)))
549 XCONS (elt
)->cdr
= Fcopy_keymap (XCONS (elt
)->cdr
);
556 /* Simple Keymap mutators and accessors. */
558 /* GC is possible in this function if it autoloads a keymap. */
560 DEFUN ("define-key", Fdefine_key
, Sdefine_key
, 3, 3, 0,
561 "Args KEYMAP, KEY, DEF. Define key sequence KEY, in KEYMAP, as DEF.\n\
562 KEYMAP is a keymap. KEY is a string or a vector of symbols and characters\n\
563 meaning a sequence of keystrokes and events.\n\
564 Non-ASCII characters with codes above 127 (such as ISO Latin-1)\n\
565 can be included if you use a vector.\n\
566 DEF is anything that can be a key's definition:\n\
567 nil (means key is undefined in this keymap),\n\
568 a command (a Lisp function suitable for interactive calling)\n\
569 a string (treated as a keyboard macro),\n\
570 a keymap (to define a prefix key),\n\
571 a symbol. When the key is looked up, the symbol will stand for its\n\
572 function definition, which should at that time be one of the above,\n\
573 or another symbol whose function definition is used, etc.\n\
574 a cons (STRING . DEFN), meaning that DEFN is the definition\n\
575 (DEFN should be a valid definition in its own right),\n\
576 or a cons (KEYMAP . CHAR), meaning use definition of CHAR in map KEYMAP.\n\
578 If KEYMAP is a sparse keymap, the pair binding KEY to DEF is added at\n\
579 the front of KEYMAP.")
586 register Lisp_Object c
;
587 register Lisp_Object tem
;
588 register Lisp_Object cmd
;
592 struct gcpro gcpro1
, gcpro2
, gcpro3
;
594 keymap
= get_keymap_1 (keymap
, 1, 1);
596 if (!VECTORP (key
) && !STRINGP (key
))
597 key
= wrong_type_argument (Qarrayp
, key
);
599 length
= XFASTINT (Flength (key
));
603 if (SYMBOLP (def
) && !EQ (Vdefine_key_rebound_commands
, Qt
))
604 Vdefine_key_rebound_commands
= Fcons (def
, Vdefine_key_rebound_commands
);
606 GCPRO3 (keymap
, key
, def
);
609 meta_bit
= meta_modifier
;
616 c
= Faref (key
, make_number (idx
));
618 if (CONSP (c
) && lucid_event_type_list_p (c
))
619 c
= Fevent_convert_list (c
);
622 && (XINT (c
) & meta_bit
)
625 c
= meta_prefix_char
;
631 XSETINT (c
, XINT (c
) & ~meta_bit
);
637 if (! INTEGERP (c
) && ! SYMBOLP (c
) && ! CONSP (c
))
638 error ("Key sequence contains invalid events");
641 RETURN_UNGCPRO (store_in_keymap (keymap
, c
, def
));
643 cmd
= get_keyelt (access_keymap (keymap
, c
, 0, 1), 1);
645 /* If this key is undefined, make it a prefix. */
647 cmd
= define_as_prefix (keymap
, c
);
649 keymap
= get_keymap_1 (cmd
, 0, 1);
651 /* We must use Fkey_description rather than just passing key to
652 error; key might be a vector, not a string. */
653 error ("Key sequence %s uses invalid prefix characters",
654 XSTRING (Fkey_description (key
))->data
);
658 /* Value is number if KEY is too long; NIL if valid but has no definition. */
659 /* GC is possible in this function if it autoloads a keymap. */
661 DEFUN ("lookup-key", Flookup_key
, Slookup_key
, 2, 3, 0,
662 "In keymap KEYMAP, look up key sequence KEY. Return the definition.\n\
663 nil means undefined. See doc of `define-key' for kinds of definitions.\n\
665 A number as value means KEY is \"too long\";\n\
666 that is, characters or symbols in it except for the last one\n\
667 fail to be a valid sequence of prefix characters in KEYMAP.\n\
668 The number is how many characters at the front of KEY\n\
669 it takes to reach a non-prefix command.\n\
671 Normally, `lookup-key' ignores bindings for t, which act as default\n\
672 bindings, used when nothing else in the keymap applies; this makes it\n\
673 useable as a general function for probing keymaps. However, if the\n\
674 third optional argument ACCEPT-DEFAULT is non-nil, `lookup-key' will\n\
675 recognize the default bindings, just as `read-key-sequence' does.")
676 (keymap
, key
, accept_default
)
677 register Lisp_Object keymap
;
679 Lisp_Object accept_default
;
682 register Lisp_Object tem
;
683 register Lisp_Object cmd
;
684 register Lisp_Object c
;
687 int t_ok
= ! NILP (accept_default
);
691 keymap
= get_keymap_1 (keymap
, 1, 1);
693 if (!VECTORP (key
) && !STRINGP (key
))
694 key
= wrong_type_argument (Qarrayp
, key
);
696 length
= XFASTINT (Flength (key
));
701 meta_bit
= meta_modifier
;
710 c
= Faref (key
, make_number (idx
));
712 if (CONSP (c
) && lucid_event_type_list_p (c
))
713 c
= Fevent_convert_list (c
);
716 && (XINT (c
) & meta_bit
)
719 c
= meta_prefix_char
;
725 XSETINT (c
, XINT (c
) & ~meta_bit
);
731 cmd
= get_keyelt (access_keymap (keymap
, c
, t_ok
, 0), 1);
733 RETURN_UNGCPRO (cmd
);
735 keymap
= get_keymap_1 (cmd
, 0, 1);
737 RETURN_UNGCPRO (make_number (idx
));
743 /* Make KEYMAP define event C as a keymap (i.e., as a prefix).
744 Assume that currently it does not define C at all.
745 Return the keymap. */
748 define_as_prefix (keymap
, c
)
749 Lisp_Object keymap
, c
;
751 Lisp_Object inherit
, cmd
;
753 cmd
= Fmake_sparse_keymap (Qnil
);
754 /* If this key is defined as a prefix in an inherited keymap,
755 make it a prefix in this map, and make its definition
756 inherit the other prefix definition. */
757 inherit
= access_keymap (keymap
, c
, 0, 0);
760 /* If there's an inherited keymap
761 and it doesn't define this key,
762 make it define this key. */
765 for (tail
= Fcdr (keymap
); CONSP (tail
); tail
= XCONS (tail
)->cdr
)
766 if (EQ (XCONS (tail
)->car
, Qkeymap
))
770 inherit
= define_as_prefix (tail
, c
);
773 cmd
= nconc2 (cmd
, inherit
);
774 store_in_keymap (keymap
, c
, cmd
);
779 /* Append a key to the end of a key sequence. We always make a vector. */
782 append_key (key_sequence
, key
)
783 Lisp_Object key_sequence
, key
;
787 args
[0] = key_sequence
;
789 args
[1] = Fcons (key
, Qnil
);
790 return Fvconcat (2, args
);
794 /* Global, local, and minor mode keymap stuff. */
796 /* We can't put these variables inside current_minor_maps, since under
797 some systems, static gets macro-defined to be the empty string.
799 static Lisp_Object
*cmm_modes
, *cmm_maps
;
802 /* Error handler used in current_minor_maps. */
804 current_minor_maps_error ()
809 /* Store a pointer to an array of the keymaps of the currently active
810 minor modes in *buf, and return the number of maps it contains.
812 This function always returns a pointer to the same buffer, and may
813 free or reallocate it, so if you want to keep it for a long time or
814 hand it out to lisp code, copy it. This procedure will be called
815 for every key sequence read, so the nice lispy approach (return a
816 new assoclist, list, what have you) for each invocation would
817 result in a lot of consing over time.
819 If we used xrealloc/xmalloc and ran out of memory, they would throw
820 back to the command loop, which would try to read a key sequence,
821 which would call this function again, resulting in an infinite
822 loop. Instead, we'll use realloc/malloc and silently truncate the
823 list, let the key sequence be read, and hope some other piece of
824 code signals the error. */
826 current_minor_maps (modeptr
, mapptr
)
827 Lisp_Object
**modeptr
, **mapptr
;
830 Lisp_Object alist
, assoc
, var
, val
;
832 for (alist
= Vminor_mode_map_alist
;
834 alist
= XCONS (alist
)->cdr
)
835 if ((assoc
= XCONS (alist
)->car
, CONSP (assoc
))
836 && (var
= XCONS (assoc
)->car
, SYMBOLP (var
))
837 && (val
= find_symbol_value (var
), ! EQ (val
, Qunbound
))
844 Lisp_Object
*newmodes
, *newmaps
;
851 = (Lisp_Object
*) realloc (cmm_modes
,
852 cmm_size
* sizeof (Lisp_Object
));
854 = (Lisp_Object
*) realloc (cmm_maps
,
855 cmm_size
* sizeof (Lisp_Object
));
863 = (Lisp_Object
*) malloc (cmm_size
* sizeof (Lisp_Object
));
865 = (Lisp_Object
*) malloc (cmm_size
* sizeof (Lisp_Object
));
869 if (newmaps
&& newmodes
)
871 cmm_modes
= newmodes
;
878 /* Get the keymap definition--or nil if it is not defined. */
879 temp
= internal_condition_case_1 (Findirect_function
,
881 Qerror
, current_minor_maps_error
);
890 if (modeptr
) *modeptr
= cmm_modes
;
891 if (mapptr
) *mapptr
= cmm_maps
;
895 /* GC is possible in this function if it autoloads a keymap. */
897 DEFUN ("key-binding", Fkey_binding
, Skey_binding
, 1, 2, 0,
898 "Return the binding for command KEY in current keymaps.\n\
899 KEY is a string or vector, a sequence of keystrokes.\n\
900 The binding is probably a symbol with a function definition.\n\
902 Normally, `key-binding' ignores bindings for t, which act as default\n\
903 bindings, used when nothing else in the keymap applies; this makes it\n\
904 usable as a general function for probing keymaps. However, if the\n\
905 optional second argument ACCEPT-DEFAULT is non-nil, `key-binding' does\n\
906 recognize the default bindings, just as `read-key-sequence' does.")
907 (key
, accept_default
)
908 Lisp_Object key
, accept_default
;
910 Lisp_Object
*maps
, value
;
916 if (!NILP (current_kboard
->Voverriding_terminal_local_map
))
918 value
= Flookup_key (current_kboard
->Voverriding_terminal_local_map
,
919 key
, accept_default
);
920 if (! NILP (value
) && !INTEGERP (value
))
921 RETURN_UNGCPRO (value
);
923 else if (!NILP (Voverriding_local_map
))
925 value
= Flookup_key (Voverriding_local_map
, key
, accept_default
);
926 if (! NILP (value
) && !INTEGERP (value
))
927 RETURN_UNGCPRO (value
);
931 nmaps
= current_minor_maps (0, &maps
);
932 /* Note that all these maps are GCPRO'd
933 in the places where we found them. */
935 for (i
= 0; i
< nmaps
; i
++)
936 if (! NILP (maps
[i
]))
938 value
= Flookup_key (maps
[i
], key
, accept_default
);
939 if (! NILP (value
) && !INTEGERP (value
))
940 RETURN_UNGCPRO (value
);
943 if (! NILP (current_buffer
->keymap
))
945 value
= Flookup_key (current_buffer
->keymap
, key
, accept_default
);
946 if (! NILP (value
) && !INTEGERP (value
))
947 RETURN_UNGCPRO (value
);
951 value
= Flookup_key (current_global_map
, key
, accept_default
);
953 if (! NILP (value
) && !INTEGERP (value
))
959 /* GC is possible in this function if it autoloads a keymap. */
961 DEFUN ("local-key-binding", Flocal_key_binding
, Slocal_key_binding
, 1, 2, 0,
962 "Return the binding for command KEYS in current local keymap only.\n\
963 KEYS is a string, a sequence of keystrokes.\n\
964 The binding is probably a symbol with a function definition.\n\
966 If optional argument ACCEPT-DEFAULT is non-nil, recognize default\n\
967 bindings; see the description of `lookup-key' for more details about this.")
968 (keys
, accept_default
)
969 Lisp_Object keys
, accept_default
;
971 register Lisp_Object map
;
972 map
= current_buffer
->keymap
;
975 return Flookup_key (map
, keys
, accept_default
);
978 /* GC is possible in this function if it autoloads a keymap. */
980 DEFUN ("global-key-binding", Fglobal_key_binding
, Sglobal_key_binding
, 1, 2, 0,
981 "Return the binding for command KEYS in current global keymap only.\n\
982 KEYS is a string, a sequence of keystrokes.\n\
983 The binding is probably a symbol with a function definition.\n\
984 This function's return values are the same as those of lookup-key\n\
987 If optional argument ACCEPT-DEFAULT is non-nil, recognize default\n\
988 bindings; see the description of `lookup-key' for more details about this.")
989 (keys
, accept_default
)
990 Lisp_Object keys
, accept_default
;
992 return Flookup_key (current_global_map
, keys
, accept_default
);
995 /* GC is possible in this function if it autoloads a keymap. */
997 DEFUN ("minor-mode-key-binding", Fminor_mode_key_binding
, Sminor_mode_key_binding
, 1, 2, 0,
998 "Find the visible minor mode bindings of KEY.\n\
999 Return an alist of pairs (MODENAME . BINDING), where MODENAME is the\n\
1000 the symbol which names the minor mode binding KEY, and BINDING is\n\
1001 KEY's definition in that mode. In particular, if KEY has no\n\
1002 minor-mode bindings, return nil. If the first binding is a\n\
1003 non-prefix, all subsequent bindings will be omitted, since they would\n\
1004 be ignored. Similarly, the list doesn't include non-prefix bindings\n\
1005 that come after prefix bindings.\n\
1007 If optional argument ACCEPT-DEFAULT is non-nil, recognize default\n\
1008 bindings; see the description of `lookup-key' for more details about this.")
1009 (key
, accept_default
)
1010 Lisp_Object key
, accept_default
;
1012 Lisp_Object
*modes
, *maps
;
1014 Lisp_Object binding
;
1016 struct gcpro gcpro1
, gcpro2
;
1018 nmaps
= current_minor_maps (&modes
, &maps
);
1019 /* Note that all these maps are GCPRO'd
1020 in the places where we found them. */
1023 GCPRO2 (key
, binding
);
1025 for (i
= j
= 0; i
< nmaps
; i
++)
1026 if (! NILP (maps
[i
])
1027 && ! NILP (binding
= Flookup_key (maps
[i
], key
, accept_default
))
1028 && !INTEGERP (binding
))
1030 if (! NILP (get_keymap (binding
)))
1031 maps
[j
++] = Fcons (modes
[i
], binding
);
1033 RETURN_UNGCPRO (Fcons (Fcons (modes
[i
], binding
), Qnil
));
1037 return Flist (j
, maps
);
1040 DEFUN ("define-prefix-command", Fdefine_prefix_command
, Sdefine_prefix_command
, 1, 2, 0,
1041 "Define COMMAND as a prefix command. COMMAND should be a symbol.\n\
1042 A new sparse keymap is stored as COMMAND's function definition and its value.\n\
1043 If a second optional argument MAPVAR is given, the map is stored as\n\
1044 its value instead of as COMMAND's value; but COMMAND is still defined\n\
1047 Lisp_Object name
, mapvar
;
1050 map
= Fmake_sparse_keymap (Qnil
);
1059 DEFUN ("use-global-map", Fuse_global_map
, Suse_global_map
, 1, 1, 0,
1060 "Select KEYMAP as the global keymap.")
1064 keymap
= get_keymap (keymap
);
1065 current_global_map
= keymap
;
1066 record_asynch_buffer_change ();
1071 DEFUN ("use-local-map", Fuse_local_map
, Suse_local_map
, 1, 1, 0,
1072 "Select KEYMAP as the local keymap.\n\
1073 If KEYMAP is nil, that means no local keymap.")
1078 keymap
= get_keymap (keymap
);
1080 current_buffer
->keymap
= keymap
;
1081 record_asynch_buffer_change ();
1086 DEFUN ("current-local-map", Fcurrent_local_map
, Scurrent_local_map
, 0, 0, 0,
1087 "Return current buffer's local keymap, or nil if it has none.")
1090 return current_buffer
->keymap
;
1093 DEFUN ("current-global-map", Fcurrent_global_map
, Scurrent_global_map
, 0, 0, 0,
1094 "Return the current global keymap.")
1097 return current_global_map
;
1100 DEFUN ("current-minor-mode-maps", Fcurrent_minor_mode_maps
, Scurrent_minor_mode_maps
, 0, 0, 0,
1101 "Return a list of keymaps for the minor modes of the current buffer.")
1105 int nmaps
= current_minor_maps (0, &maps
);
1107 return Flist (nmaps
, maps
);
1110 /* Help functions for describing and documenting keymaps. */
1112 /* This function cannot GC. */
1114 DEFUN ("accessible-keymaps", Faccessible_keymaps
, Saccessible_keymaps
,
1116 "Find all keymaps accessible via prefix characters from KEYMAP.\n\
1117 Returns a list of elements of the form (KEYS . MAP), where the sequence\n\
1118 KEYS starting from KEYMAP gets you to MAP. These elements are ordered\n\
1119 so that the KEYS increase in length. The first element is (\"\" . KEYMAP).\n\
1120 An optional argument PREFIX, if non-nil, should be a key sequence;\n\
1121 then the value includes only maps for prefixes that start with PREFIX.")
1123 Lisp_Object startmap
, prefix
;
1125 Lisp_Object maps
, good_maps
, tail
;
1128 /* no need for gcpro because we don't autoload any keymaps. */
1131 prefixlen
= XINT (Flength (prefix
));
1135 /* If a prefix was specified, start with the keymap (if any) for
1136 that prefix, so we don't waste time considering other prefixes. */
1138 tem
= Flookup_key (startmap
, prefix
, Qt
);
1139 /* Flookup_key may give us nil, or a number,
1140 if the prefix is not defined in this particular map.
1141 It might even give us a list that isn't a keymap. */
1142 tem
= get_keymap_1 (tem
, 0, 0);
1144 maps
= Fcons (Fcons (prefix
, tem
), Qnil
);
1149 maps
= Fcons (Fcons (Fmake_vector (make_number (0), Qnil
),
1150 get_keymap (startmap
)),
1153 /* For each map in the list maps,
1154 look at any other maps it points to,
1155 and stick them at the end if they are not already in the list.
1157 This is a breadth-first traversal, where tail is the queue of
1158 nodes, and maps accumulates a list of all nodes visited. */
1160 for (tail
= maps
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
1162 register Lisp_Object thisseq
, thismap
;
1164 /* Does the current sequence end in the meta-prefix-char? */
1167 thisseq
= Fcar (Fcar (tail
));
1168 thismap
= Fcdr (Fcar (tail
));
1169 last
= make_number (XINT (Flength (thisseq
)) - 1);
1170 is_metized
= (XINT (last
) >= 0
1171 && EQ (Faref (thisseq
, last
), meta_prefix_char
));
1173 for (; CONSP (thismap
); thismap
= XCONS (thismap
)->cdr
)
1177 elt
= XCONS (thismap
)->car
;
1185 /* Vector keymap. Scan all the elements. */
1186 for (i
= 0; i
< XVECTOR (elt
)->size
; i
++)
1188 register Lisp_Object tem
;
1189 register Lisp_Object cmd
;
1191 cmd
= get_keyelt (XVECTOR (elt
)->contents
[i
], 0);
1192 if (NILP (cmd
)) continue;
1193 tem
= Fkeymapp (cmd
);
1196 cmd
= get_keymap (cmd
);
1197 /* Ignore keymaps that are already added to maps. */
1198 tem
= Frassq (cmd
, maps
);
1201 /* If the last key in thisseq is meta-prefix-char,
1202 turn it into a meta-ized keystroke. We know
1203 that the event we're about to append is an
1204 ascii keystroke since we're processing a
1208 int meta_bit
= meta_modifier
;
1209 tem
= Fcopy_sequence (thisseq
);
1211 Faset (tem
, last
, make_number (i
| meta_bit
));
1213 /* This new sequence is the same length as
1214 thisseq, so stick it in the list right
1217 = Fcons (Fcons (tem
, cmd
), XCONS (tail
)->cdr
);
1221 tem
= append_key (thisseq
, make_number (i
));
1222 nconc2 (tail
, Fcons (Fcons (tem
, cmd
), Qnil
));
1228 else if (CONSP (elt
))
1230 register Lisp_Object cmd
, tem
, filter
;
1232 cmd
= get_keyelt (XCONS (elt
)->cdr
, 0);
1233 /* Ignore definitions that aren't keymaps themselves. */
1234 tem
= Fkeymapp (cmd
);
1237 /* Ignore keymaps that have been seen already. */
1238 cmd
= get_keymap (cmd
);
1239 tem
= Frassq (cmd
, maps
);
1242 /* Let elt be the event defined by this map entry. */
1243 elt
= XCONS (elt
)->car
;
1245 /* If the last key in thisseq is meta-prefix-char, and
1246 this entry is a binding for an ascii keystroke,
1247 turn it into a meta-ized keystroke. */
1248 if (is_metized
&& INTEGERP (elt
))
1250 tem
= Fcopy_sequence (thisseq
);
1252 make_number (XINT (elt
) | meta_modifier
));
1254 /* This new sequence is the same length as
1255 thisseq, so stick it in the list right
1258 = Fcons (Fcons (tem
, cmd
), XCONS (tail
)->cdr
);
1262 Fcons (Fcons (append_key (thisseq
, elt
), cmd
),
1273 /* Now find just the maps whose access prefixes start with PREFIX. */
1276 for (; CONSP (maps
); maps
= XCONS (maps
)->cdr
)
1278 Lisp_Object elt
, thisseq
;
1279 elt
= XCONS (maps
)->car
;
1280 thisseq
= XCONS (elt
)->car
;
1281 /* The access prefix must be at least as long as PREFIX,
1282 and the first elements must match those of PREFIX. */
1283 if (XINT (Flength (thisseq
)) >= prefixlen
)
1286 for (i
= 0; i
< prefixlen
; i
++)
1289 XSETFASTINT (i1
, i
);
1290 if (!EQ (Faref (thisseq
, i1
), Faref (prefix
, i1
)))
1294 good_maps
= Fcons (elt
, good_maps
);
1298 return Fnreverse (good_maps
);
1301 Lisp_Object Qsingle_key_description
, Qkey_description
;
1303 /* This function cannot GC. */
1305 DEFUN ("key-description", Fkey_description
, Skey_description
, 1, 1, 0,
1306 "Return a pretty description of key-sequence KEYS.\n\
1307 Control characters turn into \"C-foo\" sequences, meta into \"M-foo\"\n\
1308 spaces are put between sequence elements, etc.")
1320 vector
= Fmake_vector (Flength (keys
), Qnil
);
1321 for (i
= 0; i
< XSTRING (keys
)->size
; i
++)
1323 if (XSTRING (keys
)->data
[i
] & 0x80)
1324 XSETFASTINT (XVECTOR (vector
)->contents
[i
],
1325 meta_modifier
| (XSTRING (keys
)->data
[i
] & ~0x80));
1327 XSETFASTINT (XVECTOR (vector
)->contents
[i
],
1328 XSTRING (keys
)->data
[i
]);
1332 else if (!VECTORP (keys
))
1333 keys
= wrong_type_argument (Qarrayp
, keys
);
1335 /* In effect, this computes
1336 (mapconcat 'single-key-description keys " ")
1337 but we shouldn't use mapconcat because it can do GC. */
1339 len
= XVECTOR (keys
)->size
;
1340 sep
= build_string (" ");
1341 /* This has one extra element at the end that we don't pass to Fconcat. */
1342 args
= (Lisp_Object
*) alloca (len
* 2 * sizeof (Lisp_Object
));
1344 for (i
= 0; i
< len
; i
++)
1346 args
[i
* 2] = Fsingle_key_description (XVECTOR (keys
)->contents
[i
]);
1347 args
[i
* 2 + 1] = sep
;
1350 return Fconcat (len
* 2 - 1, args
);
1354 push_key_description (c
, p
)
1355 register unsigned int c
;
1358 /* Clear all the meaningless bits above the meta bit. */
1359 c
&= meta_modifier
| ~ - meta_modifier
;
1361 if (c
& alt_modifier
)
1367 if (c
& ctrl_modifier
)
1373 if (c
& hyper_modifier
)
1377 c
-= hyper_modifier
;
1379 if (c
& meta_modifier
)
1385 if (c
& shift_modifier
)
1389 c
-= shift_modifier
;
1391 if (c
& super_modifier
)
1395 c
-= super_modifier
;
1411 else if (c
== Ctl('J'))
1417 else if (c
== Ctl('M'))
1427 if (c
> 0 && c
<= Ctl ('Z'))
1450 *p
++ = (7 & (c
>> 15)) + '0';
1451 *p
++ = (7 & (c
>> 12)) + '0';
1452 *p
++ = (7 & (c
>> 9)) + '0';
1453 *p
++ = (7 & (c
>> 6)) + '0';
1454 *p
++ = (7 & (c
>> 3)) + '0';
1455 *p
++ = (7 & (c
>> 0)) + '0';
1461 /* This function cannot GC. */
1463 DEFUN ("single-key-description", Fsingle_key_description
, Ssingle_key_description
, 1, 1, 0,
1464 "Return a pretty description of command character KEY.\n\
1465 Control characters turn into C-whatever, etc.")
1471 key
= EVENT_HEAD (key
);
1473 if (INTEGERP (key
)) /* Normal character */
1475 *push_key_description (XUINT (key
), tem
) = 0;
1476 return build_string (tem
);
1478 else if (SYMBOLP (key
)) /* Function key or event-symbol */
1479 return Fsymbol_name (key
);
1480 else if (STRINGP (key
)) /* Buffer names in the menubar. */
1481 return Fcopy_sequence (key
);
1483 error ("KEY must be an integer, cons, symbol, or string");
1487 push_text_char_description (c
, p
)
1488 register unsigned int c
;
1500 *p
++ = c
+ 64; /* 'A' - 1 */
1512 /* This function cannot GC. */
1514 DEFUN ("text-char-description", Ftext_char_description
, Stext_char_description
, 1, 1, 0,
1515 "Return a pretty description of file-character CHAR.\n\
1516 Control characters turn into \"^char\", etc.")
1522 CHECK_NUMBER (chr
, 0);
1524 *push_text_char_description (XINT (chr
) & 0377, tem
) = 0;
1526 return build_string (tem
);
1529 /* Return non-zero if SEQ contains only ASCII characters, perhaps with
1532 ascii_sequence_p (seq
)
1536 int len
= XINT (Flength (seq
));
1538 for (i
= 0; i
< len
; i
++)
1540 Lisp_Object ii
, elt
;
1542 XSETFASTINT (ii
, i
);
1543 elt
= Faref (seq
, ii
);
1546 || (XUINT (elt
) & ~CHAR_META
) >= 0x80)
1554 /* where-is - finding a command in a set of keymaps. */
1556 /* This function can GC if Flookup_key autoloads any keymaps. */
1558 DEFUN ("where-is-internal", Fwhere_is_internal
, Swhere_is_internal
, 1, 4, 0,
1559 "Return list of keys that invoke DEFINITION.\n\
1560 If KEYMAP is non-nil, search only KEYMAP and the global keymap.\n\
1561 If KEYMAP is nil, search all the currently active keymaps.\n\
1563 If optional 3rd arg FIRSTONLY is non-nil, return the first key sequence found,\n\
1564 rather than a list of all possible key sequences.\n\
1565 If FIRSTONLY is the symbol `non-ascii', return the first binding found,\n\
1566 no matter what it is.\n\
1567 If FIRSTONLY has another non-nil value, prefer sequences of ASCII characters,\n\
1568 and entirely reject menu bindings.\n\
1570 If optional 4th arg NOINDIRECT is non-nil, don't follow indirections\n\
1571 to other keymaps or slots. This makes it possible to search for an\n\
1572 indirect definition itself.")
1573 (definition
, keymap
, firstonly
, noindirect
)
1574 Lisp_Object definition
, keymap
;
1575 Lisp_Object firstonly
, noindirect
;
1578 Lisp_Object found
, sequence
;
1579 int keymap_specified
= !NILP (keymap
);
1580 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
;
1581 /* 1 means ignore all menu bindings entirely. */
1582 int nomenus
= !NILP (firstonly
) && !EQ (firstonly
, Qnon_ascii
);
1584 if (! keymap_specified
)
1586 #ifdef USE_TEXT_PROPERTIES
1587 keymap
= get_local_map (PT
, current_buffer
);
1589 keymap
= current_buffer
->keymap
;
1594 maps
= nconc2 (Faccessible_keymaps (get_keymap (keymap
), Qnil
),
1595 Faccessible_keymaps (get_keymap (current_global_map
),
1598 maps
= Faccessible_keymaps (get_keymap (current_global_map
), Qnil
);
1600 /* Put the minor mode keymaps on the front. */
1601 if (! keymap_specified
)
1604 minors
= Fnreverse (Fcurrent_minor_mode_maps ());
1605 while (!NILP (minors
))
1607 maps
= nconc2 (Faccessible_keymaps (get_keymap (XCONS (minors
)->car
),
1610 minors
= XCONS (minors
)->cdr
;
1614 GCPRO5 (definition
, keymap
, maps
, found
, sequence
);
1618 for (; !NILP (maps
); maps
= Fcdr (maps
))
1620 /* Key sequence to reach map, and the map that it reaches */
1621 register Lisp_Object
this, map
;
1623 /* If Fcar (map) is a VECTOR, the current element within that vector. */
1626 /* In order to fold [META-PREFIX-CHAR CHAR] sequences into
1627 [M-CHAR] sequences, check if last character of the sequence
1628 is the meta-prefix char. */
1632 this = Fcar (Fcar (maps
));
1633 map
= Fcdr (Fcar (maps
));
1634 last
= make_number (XINT (Flength (this)) - 1);
1635 last_is_meta
= (XINT (last
) >= 0
1636 && EQ (Faref (this, last
), meta_prefix_char
));
1642 /* Because the code we want to run on each binding is rather
1643 large, we don't want to have two separate loop bodies for
1644 sparse keymap bindings and tables; we want to iterate one
1645 loop body over both keymap and vector bindings.
1647 For this reason, if Fcar (map) is a vector, we don't
1648 advance map to the next element until i indicates that we
1649 have finished off the vector. */
1651 Lisp_Object elt
, key
, binding
;
1652 elt
= XCONS (map
)->car
;
1656 /* Set key and binding to the current key and binding, and
1657 advance map and i to the next binding. */
1660 /* In a vector, look at each element. */
1661 binding
= XVECTOR (elt
)->contents
[i
];
1662 XSETFASTINT (key
, i
);
1665 /* If we've just finished scanning a vector, advance map
1666 to the next element, and reset i in anticipation of the
1667 next vector we may find. */
1668 if (i
>= XVECTOR (elt
)->size
)
1670 map
= XCONS (map
)->cdr
;
1674 else if (CONSP (elt
))
1676 key
= Fcar (Fcar (map
));
1677 binding
= Fcdr (Fcar (map
));
1679 map
= XCONS (map
)->cdr
;
1682 /* We want to ignore keymap elements that are neither
1683 vectors nor conses. */
1685 map
= XCONS (map
)->cdr
;
1689 /* Search through indirections unless that's not wanted. */
1690 if (NILP (noindirect
))
1696 Lisp_Object map
, tem
;
1697 /* If the contents are (KEYMAP . ELEMENT), go indirect. */
1698 map
= get_keymap_1 (Fcar_safe (definition
), 0, 0);
1699 tem
= Fkeymapp (map
);
1701 definition
= access_keymap (map
, Fcdr (definition
), 0, 0);
1705 /* If the contents are (STRING ...), reject. */
1706 if (CONSP (definition
)
1707 && STRINGP (XCONS (definition
)->car
))
1711 binding
= get_keyelt (binding
, 0);
1714 /* End this iteration if this element does not match
1717 if (CONSP (definition
))
1720 tem
= Fequal (binding
, definition
);
1725 if (!EQ (binding
, definition
))
1728 /* We have found a match.
1729 Construct the key sequence where we found it. */
1730 if (INTEGERP (key
) && last_is_meta
)
1732 sequence
= Fcopy_sequence (this);
1733 Faset (sequence
, last
, make_number (XINT (key
) | meta_modifier
));
1736 sequence
= append_key (this, key
);
1738 /* Verify that this key binding is not shadowed by another
1739 binding for the same key, before we say it exists.
1741 Mechanism: look for local definition of this key and if
1742 it is defined and does not match what we found then
1745 Either nil or number as value from Flookup_key
1747 if (keymap_specified
)
1749 binding
= Flookup_key (keymap
, sequence
, Qnil
);
1750 if (!NILP (binding
) && !INTEGERP (binding
))
1752 if (CONSP (definition
))
1755 tem
= Fequal (binding
, definition
);
1760 if (!EQ (binding
, definition
))
1766 binding
= Fkey_binding (sequence
, Qnil
);
1767 if (!EQ (binding
, definition
))
1771 /* It is a true unshadowed match. Record it, unless it's already
1772 been seen (as could happen when inheriting keymaps). */
1773 if (NILP (Fmember (sequence
, found
)))
1774 found
= Fcons (sequence
, found
);
1776 /* If firstonly is Qnon_ascii, then we can return the first
1777 binding we find. If firstonly is not Qnon_ascii but not
1778 nil, then we should return the first ascii-only binding
1780 if (EQ (firstonly
, Qnon_ascii
))
1781 RETURN_UNGCPRO (sequence
);
1782 else if (! NILP (firstonly
) && ascii_sequence_p (sequence
))
1783 RETURN_UNGCPRO (sequence
);
1789 found
= Fnreverse (found
);
1791 /* firstonly may have been t, but we may have gone all the way through
1792 the keymaps without finding an all-ASCII key sequence. So just
1793 return the best we could find. */
1794 if (! NILP (firstonly
))
1795 return Fcar (found
);
1800 /* describe-bindings - summarizing all the bindings in a set of keymaps. */
1802 DEFUN ("describe-bindings", Fdescribe_bindings
, Sdescribe_bindings
, 0, 1, "",
1803 "Show a list of all defined keys, and their definitions.\n\
1804 The list is put in a buffer, which is displayed.\n\
1805 An optional argument PREFIX, if non-nil, should be a key sequence;\n\
1806 then we display only bindings that start with that prefix.")
1810 register Lisp_Object thisbuf
;
1811 XSETBUFFER (thisbuf
, current_buffer
);
1812 internal_with_output_to_temp_buffer ("*Help*",
1813 describe_buffer_bindings
,
1814 Fcons (thisbuf
, prefix
));
1818 /* ARG is (BUFFER . PREFIX). */
1821 describe_buffer_bindings (arg
)
1824 Lisp_Object descbuf
, prefix
, shadow
;
1825 register Lisp_Object start1
;
1826 struct gcpro gcpro1
;
1828 char *alternate_heading
1830 Alternate Characters (use anywhere the nominal character is listed):\n\
1831 nominal alternate\n\
1832 ------- ---------\n";
1834 descbuf
= XCONS (arg
)->car
;
1835 prefix
= XCONS (arg
)->cdr
;
1839 Fset_buffer (Vstandard_output
);
1841 /* Report on alternates for keys. */
1842 if (STRINGP (Vkeyboard_translate_table
))
1845 unsigned char *translate
= XSTRING (Vkeyboard_translate_table
)->data
;
1846 int translate_len
= XSTRING (Vkeyboard_translate_table
)->size
;
1848 for (c
= 0; c
< translate_len
; c
++)
1849 if (translate
[c
] != c
)
1854 if (alternate_heading
)
1856 insert_string (alternate_heading
);
1857 alternate_heading
= 0;
1860 bufend
= push_key_description (translate
[c
], buf
);
1861 insert (buf
, bufend
- buf
);
1862 Findent_to (make_number (16), make_number (1));
1863 bufend
= push_key_description (c
, buf
);
1864 insert (buf
, bufend
- buf
);
1874 Lisp_Object
*modes
, *maps
;
1876 /* Temporarily switch to descbuf, so that we can get that buffer's
1877 minor modes correctly. */
1878 Fset_buffer (descbuf
);
1879 if (!NILP (current_kboard
->Voverriding_terminal_local_map
)
1880 || !NILP (Voverriding_local_map
))
1883 nmaps
= current_minor_maps (&modes
, &maps
);
1884 Fset_buffer (Vstandard_output
);
1886 /* Print the minor mode maps. */
1887 for (i
= 0; i
< nmaps
; i
++)
1889 /* The title for a minor mode keymap
1890 is constructed at run time.
1891 We let describe_map_tree do the actual insertion
1892 because it takes care of other features when doing so. */
1895 if (!SYMBOLP (modes
[i
]))
1898 p
= title
= (char *) alloca (40 + XSYMBOL (modes
[i
])->name
->size
);
1900 bcopy (XSYMBOL (modes
[i
])->name
->data
, p
,
1901 XSYMBOL (modes
[i
])->name
->size
);
1902 p
+= XSYMBOL (modes
[i
])->name
->size
;
1904 bcopy (" Minor Mode Bindings", p
, sizeof (" Minor Mode Bindings") - 1);
1905 p
+= sizeof (" Minor Mode Bindings") - 1;
1908 describe_map_tree (maps
[i
], 0, shadow
, prefix
, title
, 0);
1909 shadow
= Fcons (maps
[i
], shadow
);
1913 /* Print the (major mode) local map. */
1914 if (!NILP (current_kboard
->Voverriding_terminal_local_map
))
1915 start1
= current_kboard
->Voverriding_terminal_local_map
;
1916 else if (!NILP (Voverriding_local_map
))
1917 start1
= Voverriding_local_map
;
1919 start1
= XBUFFER (descbuf
)->keymap
;
1923 describe_map_tree (start1
, 0, shadow
, prefix
,
1924 "Major Mode Bindings", 0);
1925 shadow
= Fcons (start1
, shadow
);
1928 describe_map_tree (current_global_map
, 0, shadow
, prefix
,
1929 "Global Bindings", 0);
1931 call0 (intern ("help-mode"));
1932 Fset_buffer (descbuf
);
1937 /* Insert a desription of the key bindings in STARTMAP,
1938 followed by those of all maps reachable through STARTMAP.
1939 If PARTIAL is nonzero, omit certain "uninteresting" commands
1940 (such as `undefined').
1941 If SHADOW is non-nil, it is a list of maps;
1942 don't mention keys which would be shadowed by any of them.
1943 PREFIX, if non-nil, says mention only keys that start with PREFIX.
1944 TITLE, if not 0, is a string to insert at the beginning.
1945 TITLE should not end with a colon or a newline; we supply that.
1946 If NOMENU is not 0, then omit menu-bar commands. */
1949 describe_map_tree (startmap
, partial
, shadow
, prefix
, title
, nomenu
)
1950 Lisp_Object startmap
, shadow
, prefix
;
1955 Lisp_Object maps
, seen
, sub_shadows
;
1956 struct gcpro gcpro1
, gcpro2
, gcpro3
;
1963 maps
= Faccessible_keymaps (startmap
, prefix
);
1966 GCPRO3 (maps
, seen
, sub_shadows
);
1972 /* Delete from MAPS each element that is for the menu bar. */
1973 for (list
= maps
; !NILP (list
); list
= XCONS (list
)->cdr
)
1975 Lisp_Object elt
, prefix
, tem
;
1978 prefix
= Fcar (elt
);
1979 if (XVECTOR (prefix
)->size
>= 1)
1981 tem
= Faref (prefix
, make_number (0));
1982 if (EQ (tem
, Qmenu_bar
))
1983 maps
= Fdelq (elt
, maps
);
1992 insert_string (title
);
1995 insert_string (" Starting With ");
1996 insert1 (Fkey_description (prefix
));
1998 insert_string (":\n");
2000 insert_string (key_heading
);
2004 for (; !NILP (maps
); maps
= Fcdr (maps
))
2006 register Lisp_Object elt
, prefix
, tail
;
2009 prefix
= Fcar (elt
);
2013 for (tail
= shadow
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
2017 shmap
= XCONS (tail
)->car
;
2019 /* If the sequence by which we reach this keymap is zero-length,
2020 then the shadow map for this keymap is just SHADOW. */
2021 if ((STRINGP (prefix
) && XSTRING (prefix
)->size
== 0)
2022 || (VECTORP (prefix
) && XVECTOR (prefix
)->size
== 0))
2024 /* If the sequence by which we reach this keymap actually has
2025 some elements, then the sequence's definition in SHADOW is
2026 what we should use. */
2029 shmap
= Flookup_key (shmap
, Fcar (elt
), Qt
);
2030 if (INTEGERP (shmap
))
2034 /* If shmap is not nil and not a keymap,
2035 it completely shadows this map, so don't
2036 describe this map at all. */
2037 if (!NILP (shmap
) && NILP (Fkeymapp (shmap
)))
2041 sub_shadows
= Fcons (shmap
, sub_shadows
);
2044 describe_map (Fcdr (elt
), Fcar (elt
), describe_command
,
2045 partial
, sub_shadows
, &seen
);
2051 insert_string ("\n");
2057 describe_command (definition
)
2058 Lisp_Object definition
;
2060 register Lisp_Object tem1
;
2062 Findent_to (make_number (16), make_number (1));
2064 if (SYMBOLP (definition
))
2066 XSETSTRING (tem1
, XSYMBOL (definition
)->name
);
2068 insert_string ("\n");
2070 else if (STRINGP (definition
))
2071 insert_string ("Keyboard Macro\n");
2074 tem1
= Fkeymapp (definition
);
2076 insert_string ("Prefix Command\n");
2078 insert_string ("??\n");
2082 /* Like Flookup_key, but uses a list of keymaps SHADOW instead of a single map.
2083 Returns the first non-nil binding found in any of those maps. */
2086 shadow_lookup (shadow
, key
, flag
)
2087 Lisp_Object shadow
, key
, flag
;
2089 Lisp_Object tail
, value
;
2091 for (tail
= shadow
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
2093 value
= Flookup_key (XCONS (tail
)->car
, key
, flag
);
2100 /* Describe the contents of map MAP, assuming that this map itself is
2101 reached by the sequence of prefix keys KEYS (a string or vector).
2102 PARTIAL, SHADOW are as in `describe_map_tree' above. */
2105 describe_map (map
, keys
, elt_describer
, partial
, shadow
, seen
)
2106 register Lisp_Object map
;
2108 int (*elt_describer
) ();
2113 Lisp_Object elt_prefix
;
2114 Lisp_Object tail
, definition
, event
;
2116 Lisp_Object suppress
;
2119 struct gcpro gcpro1
, gcpro2
, gcpro3
;
2121 if (!NILP (keys
) && XFASTINT (Flength (keys
)) > 0)
2123 /* Call Fkey_description first, to avoid GC bug for the other string. */
2124 tem
= Fkey_description (keys
);
2125 elt_prefix
= concat2 (tem
, build_string (" "));
2131 suppress
= intern ("suppress-keymap");
2133 /* This vector gets used to present single keys to Flookup_key. Since
2134 that is done once per keymap element, we don't want to cons up a
2135 fresh vector every time. */
2136 kludge
= Fmake_vector (make_number (1), Qnil
);
2139 GCPRO3 (elt_prefix
, definition
, kludge
);
2141 for (tail
= map
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
2145 if (VECTORP (XCONS (tail
)->car
))
2146 describe_vector (XCONS (tail
)->car
,
2147 elt_prefix
, elt_describer
, partial
, shadow
, map
);
2148 else if (CONSP (XCONS (tail
)->car
))
2150 event
= XCONS (XCONS (tail
)->car
)->car
;
2152 /* Ignore bindings whose "keys" are not really valid events.
2153 (We get these in the frames and buffers menu.) */
2154 if (! (SYMBOLP (event
) || INTEGERP (event
)))
2157 definition
= get_keyelt (XCONS (XCONS (tail
)->car
)->cdr
, 0);
2159 /* Don't show undefined commands or suppressed commands. */
2160 if (NILP (definition
)) continue;
2161 if (SYMBOLP (definition
) && partial
)
2163 tem
= Fget (definition
, suppress
);
2168 /* Don't show a command that isn't really visible
2169 because a local definition of the same key shadows it. */
2171 XVECTOR (kludge
)->contents
[0] = event
;
2174 tem
= shadow_lookup (shadow
, kludge
, Qt
);
2175 if (!NILP (tem
)) continue;
2178 tem
= Flookup_key (map
, kludge
, Qt
);
2179 if (! EQ (tem
, definition
)) continue;
2187 if (!NILP (elt_prefix
))
2188 insert1 (elt_prefix
);
2190 /* THIS gets the string to describe the character EVENT. */
2191 insert1 (Fsingle_key_description (event
));
2193 /* Print a description of the definition of this character.
2194 elt_describer will take care of spacing out far enough
2195 for alignment purposes. */
2196 (*elt_describer
) (definition
);
2198 else if (EQ (XCONS (tail
)->car
, Qkeymap
))
2200 /* The same keymap might be in the structure twice, if we're
2201 using an inherited keymap. So skip anything we've already
2203 tem
= Fassq (tail
, *seen
);
2204 if (CONSP (tem
) && !NILP (Fequal (XCONS (tem
)->car
, keys
)))
2206 *seen
= Fcons (Fcons (tail
, keys
), *seen
);
2214 describe_vector_princ (elt
)
2217 Findent_to (make_number (16), make_number (1));
2222 DEFUN ("describe-vector", Fdescribe_vector
, Sdescribe_vector
, 1, 1, 0,
2223 "Insert a description of contents of VECTOR.\n\
2224 This is text showing the elements of vector matched against indices.")
2228 int count
= specpdl_ptr
- specpdl
;
2230 specbind (Qstandard_output
, Fcurrent_buffer ());
2231 CHECK_VECTOR (vector
, 0);
2232 describe_vector (vector
, Qnil
, describe_vector_princ
, 0, Qnil
, Qnil
);
2234 return unbind_to (count
, Qnil
);
2237 describe_vector (vector
, elt_prefix
, elt_describer
,
2238 partial
, shadow
, entire_map
)
2239 register Lisp_Object vector
;
2240 Lisp_Object elt_prefix
;
2241 int (*elt_describer
) ();
2244 Lisp_Object entire_map
;
2248 Lisp_Object definition
;
2251 Lisp_Object suppress
;
2254 struct gcpro gcpro1
, gcpro2
, gcpro3
;
2258 /* This vector gets used to present single keys to Flookup_key. Since
2259 that is done once per vector element, we don't want to cons up a
2260 fresh vector every time. */
2261 kludge
= Fmake_vector (make_number (1), Qnil
);
2262 GCPRO3 (elt_prefix
, definition
, kludge
);
2265 suppress
= intern ("suppress-keymap");
2267 for (i
= 0; i
< XVECTOR (vector
)->size
; i
++)
2270 definition
= get_keyelt (XVECTOR (vector
)->contents
[i
], 0);
2272 if (NILP (definition
)) continue;
2274 /* Don't mention suppressed commands. */
2275 if (SYMBOLP (definition
) && partial
)
2277 this = Fget (definition
, suppress
);
2282 /* If this binding is shadowed by some other map, ignore it. */
2287 XVECTOR (kludge
)->contents
[0] = make_number (i
);
2288 tem
= shadow_lookup (shadow
, kludge
, Qt
);
2290 if (!NILP (tem
)) continue;
2293 /* Ignore this definition if it is shadowed by an earlier
2294 one in the same keymap. */
2295 if (!NILP (entire_map
))
2299 XVECTOR (kludge
)->contents
[0] = make_number (i
);
2300 tem
= Flookup_key (entire_map
, kludge
, Qt
);
2302 if (! EQ (tem
, definition
))
2312 /* Output the prefix that applies to every entry in this map. */
2313 if (!NILP (elt_prefix
))
2314 insert1 (elt_prefix
);
2316 /* Get the string to describe the character I, and print it. */
2317 XSETFASTINT (dummy
, i
);
2319 /* THIS gets the string to describe the character DUMMY. */
2320 this = Fsingle_key_description (dummy
);
2323 /* Find all consecutive characters that have the same definition. */
2324 while (i
+ 1 < XVECTOR (vector
)->size
2325 && (tem2
= get_keyelt (XVECTOR (vector
)->contents
[i
+1], 0),
2326 EQ (tem2
, definition
)))
2329 /* If we have a range of more than one character,
2330 print where the range reaches to. */
2332 if (i
!= XINT (dummy
))
2335 if (!NILP (elt_prefix
))
2336 insert1 (elt_prefix
);
2338 XSETFASTINT (dummy
, i
);
2339 insert1 (Fsingle_key_description (dummy
));
2342 /* Print a description of the definition of this character.
2343 elt_describer will take care of spacing out far enough
2344 for alignment purposes. */
2345 (*elt_describer
) (definition
);
2351 /* Apropos - finding all symbols whose names match a regexp. */
2352 Lisp_Object apropos_predicate
;
2353 Lisp_Object apropos_accumulate
;
2356 apropos_accum (symbol
, string
)
2357 Lisp_Object symbol
, string
;
2359 register Lisp_Object tem
;
2361 tem
= Fstring_match (string
, Fsymbol_name (symbol
), Qnil
);
2362 if (!NILP (tem
) && !NILP (apropos_predicate
))
2363 tem
= call1 (apropos_predicate
, symbol
);
2365 apropos_accumulate
= Fcons (symbol
, apropos_accumulate
);
2368 DEFUN ("apropos-internal", Fapropos_internal
, Sapropos_internal
, 1, 2, 0,
2369 "Show all symbols whose names contain match for REGEXP.\n\
2370 If optional 2nd arg PRED is non-nil, (funcall PRED SYM) is done\n\
2371 for each symbol and a symbol is mentioned only if that returns non-nil.\n\
2372 Return list of symbols found.")
2374 Lisp_Object string
, pred
;
2376 struct gcpro gcpro1
, gcpro2
;
2377 CHECK_STRING (string
, 0);
2378 apropos_predicate
= pred
;
2379 GCPRO2 (apropos_predicate
, apropos_accumulate
);
2380 apropos_accumulate
= Qnil
;
2381 map_obarray (Vobarray
, apropos_accum
, string
);
2382 apropos_accumulate
= Fsort (apropos_accumulate
, Qstring_lessp
);
2384 return apropos_accumulate
;
2391 Qkeymap
= intern ("keymap");
2392 staticpro (&Qkeymap
);
2394 /* Initialize the keymaps standardly used.
2395 Each one is the value of a Lisp variable, and is also
2396 pointed to by a C variable */
2398 global_map
= Fcons (Qkeymap
,
2399 Fcons (Fmake_vector (make_number (0400), Qnil
), Qnil
));
2400 Fset (intern ("global-map"), global_map
);
2402 meta_map
= Fmake_keymap (Qnil
);
2403 Fset (intern ("esc-map"), meta_map
);
2404 Ffset (intern ("ESC-prefix"), meta_map
);
2406 control_x_map
= Fmake_keymap (Qnil
);
2407 Fset (intern ("ctl-x-map"), control_x_map
);
2408 Ffset (intern ("Control-X-prefix"), control_x_map
);
2410 DEFVAR_LISP ("define-key-rebound-commands", &Vdefine_key_rebound_commands
,
2411 "List of commands given new key bindings recently.\n\
2412 This is used for internal purposes during Emacs startup;\n\
2413 don't alter it yourself.");
2414 Vdefine_key_rebound_commands
= Qt
;
2416 DEFVAR_LISP ("minibuffer-local-map", &Vminibuffer_local_map
,
2417 "Default keymap to use when reading from the minibuffer.");
2418 Vminibuffer_local_map
= Fmake_sparse_keymap (Qnil
);
2420 DEFVAR_LISP ("minibuffer-local-ns-map", &Vminibuffer_local_ns_map
,
2421 "Local keymap for the minibuffer when spaces are not allowed.");
2422 Vminibuffer_local_ns_map
= Fmake_sparse_keymap (Qnil
);
2424 DEFVAR_LISP ("minibuffer-local-completion-map", &Vminibuffer_local_completion_map
,
2425 "Local keymap for minibuffer input with completion.");
2426 Vminibuffer_local_completion_map
= Fmake_sparse_keymap (Qnil
);
2428 DEFVAR_LISP ("minibuffer-local-must-match-map", &Vminibuffer_local_must_match_map
,
2429 "Local keymap for minibuffer input with completion, for exact match.");
2430 Vminibuffer_local_must_match_map
= Fmake_sparse_keymap (Qnil
);
2432 current_global_map
= global_map
;
2434 DEFVAR_LISP ("minor-mode-map-alist", &Vminor_mode_map_alist
,
2435 "Alist of keymaps to use for minor modes.\n\
2436 Each element looks like (VARIABLE . KEYMAP); KEYMAP is used to read\n\
2437 key sequences and look up bindings iff VARIABLE's value is non-nil.\n\
2438 If two active keymaps bind the same key, the keymap appearing earlier\n\
2439 in the list takes precedence.");
2440 Vminor_mode_map_alist
= Qnil
;
2442 DEFVAR_LISP ("function-key-map", &Vfunction_key_map
,
2443 "Keymap mapping ASCII function key sequences onto their preferred forms.\n\
2444 This allows Emacs to recognize function keys sent from ASCII\n\
2445 terminals at any point in a key sequence.\n\
2447 The `read-key-sequence' function replaces any subsequence bound by\n\
2448 `function-key-map' with its binding. More precisely, when the active\n\
2449 keymaps have no binding for the current key sequence but\n\
2450 `function-key-map' binds a suffix of the sequence to a vector or string,\n\
2451 `read-key-sequence' replaces the matching suffix with its binding, and\n\
2452 continues with the new sequence.\n\
2454 The events that come from bindings in `function-key-map' are not\n\
2455 themselves looked up in `function-key-map'.\n\
2457 For example, suppose `function-key-map' binds `ESC O P' to [f1].\n\
2458 Typing `ESC O P' to `read-key-sequence' would return [f1]. Typing\n\
2459 `C-x ESC O P' would return [?\\C-x f1]. If [f1] were a prefix\n\
2460 key, typing `ESC O P x' would return [f1 x].");
2461 Vfunction_key_map
= Fmake_sparse_keymap (Qnil
);
2463 Qsingle_key_description
= intern ("single-key-description");
2464 staticpro (&Qsingle_key_description
);
2466 Qkey_description
= intern ("key-description");
2467 staticpro (&Qkey_description
);
2469 Qkeymapp
= intern ("keymapp");
2470 staticpro (&Qkeymapp
);
2472 Qnon_ascii
= intern ("non-ascii");
2473 staticpro (&Qnon_ascii
);
2475 defsubr (&Skeymapp
);
2476 defsubr (&Smake_keymap
);
2477 defsubr (&Smake_sparse_keymap
);
2478 defsubr (&Scopy_keymap
);
2479 defsubr (&Skey_binding
);
2480 defsubr (&Slocal_key_binding
);
2481 defsubr (&Sglobal_key_binding
);
2482 defsubr (&Sminor_mode_key_binding
);
2483 defsubr (&Sdefine_key
);
2484 defsubr (&Slookup_key
);
2485 defsubr (&Sdefine_prefix_command
);
2486 defsubr (&Suse_global_map
);
2487 defsubr (&Suse_local_map
);
2488 defsubr (&Scurrent_local_map
);
2489 defsubr (&Scurrent_global_map
);
2490 defsubr (&Scurrent_minor_mode_maps
);
2491 defsubr (&Saccessible_keymaps
);
2492 defsubr (&Skey_description
);
2493 defsubr (&Sdescribe_vector
);
2494 defsubr (&Ssingle_key_description
);
2495 defsubr (&Stext_char_description
);
2496 defsubr (&Swhere_is_internal
);
2497 defsubr (&Sdescribe_bindings
);
2498 defsubr (&Sapropos_internal
);
2505 initial_define_key (global_map
, 033, "ESC-prefix");
2506 initial_define_key (global_map
, Ctl('X'), "Control-X-prefix");