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