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