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