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