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