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