(INTERNAL_TERMINAL): Allow audio bell.
[bpt/emacs.git] / src / keymap.c
CommitLineData
2c6f1a39 1/* Manipulation of keymaps
f0148b5e 2 Copyright (C) 1985, 86, 87, 88, 93, 94 Free Software Foundation, Inc.
2c6f1a39
JB
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
502ddf23 8the Free Software Foundation; either version 2, or (at your option)
2c6f1a39
JB
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
18160b98 21#include <config.h>
2c6f1a39
JB
22#include <stdio.h>
23#undef NULL
24#include "lisp.h"
25#include "commands.h"
26#include "buffer.h"
6bbbd9b0 27#include "keyboard.h"
6ba6e250 28#include "termhooks.h"
9ac0d9e0 29#include "blockinput.h"
2c6f1a39
JB
30
31#define min(a, b) ((a) < (b) ? (a) : (b))
32
f5b79c1c 33/* The number of elements in keymap vectors. */
2c6f1a39
JB
34#define DENSE_TABLE_SIZE (0200)
35
36/* Actually allocate storage for these variables */
37
38Lisp_Object current_global_map; /* Current global keymap */
39
40Lisp_Object global_map; /* default global key bindings */
41
42Lisp_Object meta_map; /* The keymap used for globally bound
43 ESC-prefixed default commands */
44
45Lisp_Object control_x_map; /* The keymap used for globally bound
46 C-x-prefixed default commands */
47
48/* was MinibufLocalMap */
49Lisp_Object Vminibuffer_local_map;
50 /* The keymap used by the minibuf for local
51 bindings when spaces are allowed in the
52 minibuf */
53
54/* was MinibufLocalNSMap */
55Lisp_Object Vminibuffer_local_ns_map;
56 /* The keymap used by the minibuf for local
57 bindings when spaces are not encouraged
58 in the minibuf */
59
60/* keymap used for minibuffers when doing completion */
61/* was MinibufLocalCompletionMap */
62Lisp_Object Vminibuffer_local_completion_map;
63
64/* keymap used for minibuffers when doing completion and require a match */
65/* was MinibufLocalMustMatchMap */
66Lisp_Object Vminibuffer_local_must_match_map;
67
cc0a8174
JB
68/* Alist of minor mode variables and keymaps. */
69Lisp_Object Vminor_mode_map_alist;
70
6bbbd9b0
JB
71/* Keymap mapping ASCII function key sequences onto their preferred forms.
72 Initialized by the terminal-specific lisp files. See DEFVAR for more
73 documentation. */
74Lisp_Object Vfunction_key_map;
75
2fc66973 76Lisp_Object Qkeymapp, Qkeymap, Qnon_ascii;
2c6f1a39 77
3d248688
JB
78/* A char with the CHAR_META bit set in a vector or the 0200 bit set
79 in a string key sequence is equivalent to prefixing with this
80 character. */
2c6f1a39
JB
81extern Lisp_Object meta_prefix_char;
82
7d92e329
RS
83extern Lisp_Object Voverriding_local_map;
84
2c6f1a39 85void describe_map_tree ();
c07aec97 86static Lisp_Object define_as_prefix ();
2c6f1a39
JB
87static Lisp_Object describe_buffer_bindings ();
88static void describe_command ();
89static void describe_map ();
2c6f1a39 90\f
cc0a8174
JB
91/* Keymap object support - constructors and predicates. */
92
ce6e5d0b 93DEFUN ("make-keymap", Fmake_keymap, Smake_keymap, 0, 1, 0,
2c6f1a39 94 "Construct and return a new keymap, of the form (keymap VECTOR . ALIST).\n\
926a64aa 95VECTOR is a vector which holds the bindings for the ASCII\n\
2c6f1a39
JB
96characters. ALIST is an assoc-list which holds bindings for function keys,\n\
97mouse events, and any other things that appear in the input stream.\n\
ce6e5d0b
RS
98All entries in it are initially nil, meaning \"command undefined\".\n\n\
99The optional arg STRING supplies a menu name for the keymap\n\
100in case you use it as a menu with `x-popup-menu'.")
101 (string)
102 Lisp_Object string;
2c6f1a39 103{
ce6e5d0b
RS
104 Lisp_Object tail;
105 if (!NILP (string))
106 tail = Fcons (string, Qnil);
107 else
108 tail = Qnil;
2c6f1a39
JB
109 return Fcons (Qkeymap,
110 Fcons (Fmake_vector (make_number (DENSE_TABLE_SIZE), Qnil),
ce6e5d0b 111 tail));
2c6f1a39
JB
112}
113
ce6e5d0b 114DEFUN ("make-sparse-keymap", Fmake_sparse_keymap, Smake_sparse_keymap, 0, 1, 0,
2c6f1a39
JB
115 "Construct and return a new sparse-keymap list.\n\
116Its car is `keymap' and its cdr is an alist of (CHAR . DEFINITION),\n\
117which binds the character CHAR to DEFINITION, or (SYMBOL . DEFINITION),\n\
118which binds the function key or mouse event SYMBOL to DEFINITION.\n\
ce6e5d0b
RS
119Initially the alist is nil.\n\n\
120The optional arg STRING supplies a menu name for the keymap\n\
121in case you use it as a menu with `x-popup-menu'.")
122 (string)
123 Lisp_Object string;
2c6f1a39 124{
ce6e5d0b
RS
125 if (!NILP (string))
126 return Fcons (Qkeymap, Fcons (string, Qnil));
2c6f1a39
JB
127 return Fcons (Qkeymap, Qnil);
128}
129
130/* This function is used for installing the standard key bindings
131 at initialization time.
132
133 For example:
134
e25c4e44 135 initial_define_key (control_x_map, Ctl('X'), "exchange-point-and-mark"); */
2c6f1a39
JB
136
137void
138initial_define_key (keymap, key, defname)
139 Lisp_Object keymap;
140 int key;
141 char *defname;
142{
143 store_in_keymap (keymap, make_number (key), intern (defname));
144}
145
e25c4e44
JB
146void
147initial_define_lispy_key (keymap, keyname, defname)
148 Lisp_Object keymap;
149 char *keyname;
150 char *defname;
151{
152 store_in_keymap (keymap, intern (keyname), intern (defname));
153}
154
2c6f1a39
JB
155/* Define character fromchar in map frommap as an alias for character
156 tochar in map tomap. Subsequent redefinitions of the latter WILL
157 affect the former. */
158
159#if 0
160void
161synkey (frommap, fromchar, tomap, tochar)
162 struct Lisp_Vector *frommap, *tomap;
163 int fromchar, tochar;
164{
165 Lisp_Object v, c;
166 XSET (v, Lisp_Vector, tomap);
167 XFASTINT (c) = tochar;
168 frommap->contents[fromchar] = Fcons (v, c);
169}
170#endif /* 0 */
171
172DEFUN ("keymapp", Fkeymapp, Skeymapp, 1, 1, 0,
173 "Return t if ARG is a keymap.\n\
1d8d96fa 174\n\
926a64aa 175A keymap is a list (keymap . ALIST),\n\
90f80bcf 176or a symbol whose function definition is itself a keymap.\n\
1d8d96fa 177ALIST elements look like (CHAR . DEFN) or (SYMBOL . DEFN);\n\
926a64aa
RS
178a vector of densely packed bindings for small character codes\n\
179is also allowed as an element.")
2c6f1a39
JB
180 (object)
181 Lisp_Object object;
182{
d09b2024 183 return (NILP (get_keymap_1 (object, 0, 0)) ? Qnil : Qt);
2c6f1a39
JB
184}
185
186/* Check that OBJECT is a keymap (after dereferencing through any
d09b2024
JB
187 symbols). If it is, return it.
188
189 If AUTOLOAD is non-zero and OBJECT is a symbol whose function value
190 is an autoload form, do the autoload and try again.
191
192 ERROR controls how we respond if OBJECT isn't a keymap.
193 If ERROR is non-zero, signal an error; otherwise, just return Qnil.
194
195 Note that most of the time, we don't want to pursue autoloads.
196 Functions like Faccessible_keymaps which scan entire keymap trees
197 shouldn't load every autoloaded keymap. I'm not sure about this,
198 but it seems to me that only read_key_sequence, Flookup_key, and
199 Fdefine_key should cause keymaps to be autoloaded. */
200
2c6f1a39 201Lisp_Object
d09b2024 202get_keymap_1 (object, error, autoload)
2c6f1a39 203 Lisp_Object object;
d09b2024 204 int error, autoload;
2c6f1a39 205{
d09b2024 206 Lisp_Object tem;
2c6f1a39 207
d09b2024 208 autoload_retry:
502ddf23 209 tem = indirect_function (object);
2c6f1a39
JB
210 if (CONSP (tem) && EQ (XCONS (tem)->car, Qkeymap))
211 return tem;
f5b79c1c 212
8e4dfd54
JB
213 /* Should we do an autoload? Autoload forms for keymaps have
214 Qkeymap as their fifth element. */
d09b2024
JB
215 if (autoload
216 && XTYPE (object) == Lisp_Symbol
217 && CONSP (tem)
218 && EQ (XCONS (tem)->car, Qautoload))
219 {
8e4dfd54 220 Lisp_Object tail;
d09b2024 221
8e4dfd54
JB
222 tail = Fnth (make_number (4), tem);
223 if (EQ (tail, Qkeymap))
224 {
225 struct gcpro gcpro1, gcpro2;
d09b2024 226
81fa9e2f
RS
227 GCPRO2 (tem, object);
228 do_autoload (tem, object);
8e4dfd54
JB
229 UNGCPRO;
230
231 goto autoload_retry;
232 }
d09b2024
JB
233 }
234
2c6f1a39
JB
235 if (error)
236 wrong_type_argument (Qkeymapp, object);
cc0a8174
JB
237 else
238 return Qnil;
2c6f1a39
JB
239}
240
d09b2024
JB
241
242/* Follow any symbol chaining, and return the keymap denoted by OBJECT.
243 If OBJECT doesn't denote a keymap at all, signal an error. */
2c6f1a39
JB
244Lisp_Object
245get_keymap (object)
246 Lisp_Object object;
247{
224a16e8 248 return get_keymap_1 (object, 1, 0);
2c6f1a39
JB
249}
250
251
2c6f1a39 252/* Look up IDX in MAP. IDX may be any sort of event.
f5b79c1c 253 Note that this does only one level of lookup; IDX must be a single
e25c4e44
JB
254 event, not a sequence.
255
256 If T_OK is non-zero, bindings for Qt are treated as default
257 bindings; any key left unmentioned by other tables and bindings is
258 given the binding of Qt.
259
c07aec97
RS
260 If T_OK is zero, bindings for Qt are not treated specially.
261
262 If NOINHERIT, don't accept a subkeymap found in an inherited keymap. */
2c6f1a39
JB
263
264Lisp_Object
c07aec97 265access_keymap (map, idx, t_ok, noinherit)
2c6f1a39
JB
266 Lisp_Object map;
267 Lisp_Object idx;
e25c4e44 268 int t_ok;
c07aec97 269 int noinherit;
2c6f1a39 270{
c07aec97
RS
271 int noprefix = 0;
272 Lisp_Object val;
273
2c6f1a39
JB
274 /* If idx is a list (some sort of mouse click, perhaps?),
275 the index we want to use is the car of the list, which
276 ought to be a symbol. */
cebd887d 277 idx = EVENT_HEAD (idx);
2c6f1a39 278
f5b79c1c
JB
279 /* If idx is a symbol, it might have modifiers, which need to
280 be put in the canonical order. */
0b8fc2d4 281 if (XTYPE (idx) == Lisp_Symbol)
f5b79c1c 282 idx = reorder_modifiers (idx);
2732bdbb
RS
283 else if (INTEGERP (idx))
284 /* Clobber the high bits that can be present on a machine
285 with more than 24 bits of integer. */
ad4ec84a 286 XFASTINT (idx) = XINT (idx) & (CHAR_META | (CHAR_META - 1));
2c6f1a39 287
f5b79c1c
JB
288 {
289 Lisp_Object tail;
e9b6dfb0 290 Lisp_Object t_binding;
2c6f1a39 291
e9b6dfb0 292 t_binding = Qnil;
f5b79c1c 293 for (tail = map; CONSP (tail); tail = XCONS (tail)->cdr)
2c6f1a39 294 {
e9b6dfb0 295 Lisp_Object binding;
f5b79c1c 296
e9b6dfb0 297 binding = XCONS (tail)->car;
f5b79c1c
JB
298 switch (XTYPE (binding))
299 {
c07aec97
RS
300 case Lisp_Symbol:
301 /* If NOINHERIT, stop finding prefix definitions
302 after we pass a second occurrence of the `keymap' symbol. */
303 if (noinherit && EQ (binding, Qkeymap) && ! EQ (tail, map))
304 noprefix = 1;
305 break;
306
f5b79c1c
JB
307 case Lisp_Cons:
308 if (EQ (XCONS (binding)->car, idx))
c07aec97
RS
309 {
310 val = XCONS (binding)->cdr;
311 if (noprefix && CONSP (val) && EQ (XCONS (val)->car, Qkeymap))
312 return Qnil;
313 return val;
314 }
e25c4e44
JB
315 if (t_ok && EQ (XCONS (binding)->car, Qt))
316 t_binding = XCONS (binding)->cdr;
f5b79c1c
JB
317 break;
318
319 case Lisp_Vector:
926a64aa 320 if (XTYPE (idx) == Lisp_Int
0b8fc2d4 321 && XINT (idx) >= 0
926a64aa 322 && XINT (idx) < XVECTOR (binding)->size)
c07aec97
RS
323 {
324 val = XVECTOR (binding)->contents[XINT (idx)];
325 if (noprefix && CONSP (val) && EQ (XCONS (val)->car, Qkeymap))
326 return Qnil;
327 return val;
328 }
f5b79c1c
JB
329 break;
330 }
20218e2f
JB
331
332 QUIT;
2c6f1a39 333 }
fde3a52f 334
e25c4e44
JB
335 return t_binding;
336 }
2c6f1a39
JB
337}
338
339/* Given OBJECT which was found in a slot in a keymap,
340 trace indirect definitions to get the actual definition of that slot.
341 An indirect definition is a list of the form
342 (KEYMAP . INDEX), where KEYMAP is a keymap or a symbol defined as one
343 and INDEX is the object to look up in KEYMAP to yield the definition.
344
345 Also if OBJECT has a menu string as the first element,
224a16e8
RS
346 remove that. Also remove a menu help string as second element.
347
348 If AUTOLOAD is nonzero, load autoloadable keymaps
349 that are referred to with indirection. */
2c6f1a39
JB
350
351Lisp_Object
224a16e8 352get_keyelt (object, autoload)
2c6f1a39 353 register Lisp_Object object;
224a16e8 354 int autoload;
2c6f1a39
JB
355{
356 while (1)
357 {
358 register Lisp_Object map, tem;
359
fde3a52f 360 /* If the contents are (KEYMAP . ELEMENT), go indirect. */
224a16e8 361 map = get_keymap_1 (Fcar_safe (object), 0, autoload);
2c6f1a39 362 tem = Fkeymapp (map);
265a9e55 363 if (!NILP (tem))
c07aec97 364 object = access_keymap (map, Fcdr (object), 0, 0);
2c6f1a39
JB
365
366 /* If the keymap contents looks like (STRING . DEFN),
367 use DEFN.
368 Keymap alist elements like (CHAR MENUSTRING . DEFN)
369 will be used by HierarKey menus. */
370 else if (XTYPE (object) == Lisp_Cons
371 && XTYPE (XCONS (object)->car) == Lisp_String)
1a8c3f10
RS
372 {
373 object = XCONS (object)->cdr;
374 /* Also remove a menu help string, if any,
375 following the menu item name. */
376 if (XTYPE (object) == Lisp_Cons
377 && XTYPE (XCONS (object)->car) == Lisp_String)
378 object = XCONS (object)->cdr;
c6ec9f6e
RS
379 /* Also remove the sublist that caches key equivalences, if any. */
380 if (CONSP (object)
381 && CONSP (XCONS (object)->car))
ffab2bd6 382 {
c6ec9f6e
RS
383 Lisp_Object carcar;
384 carcar = XCONS (XCONS (object)->car)->car;
385 if (NILP (carcar) || VECTORP (carcar))
ffab2bd6
RS
386 object = XCONS (object)->cdr;
387 }
1a8c3f10 388 }
2c6f1a39
JB
389
390 else
391 /* Anything else is really the value. */
392 return object;
393 }
394}
395
396Lisp_Object
397store_in_keymap (keymap, idx, def)
398 Lisp_Object keymap;
399 register Lisp_Object idx;
400 register Lisp_Object def;
401{
f5b79c1c
JB
402 if (XTYPE (keymap) != Lisp_Cons
403 || ! EQ (XCONS (keymap)->car, Qkeymap))
404 error ("attempt to define a key in a non-keymap");
405
2c6f1a39
JB
406 /* If idx is a list (some sort of mouse click, perhaps?),
407 the index we want to use is the car of the list, which
408 ought to be a symbol. */
cebd887d 409 idx = EVENT_HEAD (idx);
2c6f1a39 410
f5b79c1c
JB
411 /* If idx is a symbol, it might have modifiers, which need to
412 be put in the canonical order. */
0b8fc2d4 413 if (XTYPE (idx) == Lisp_Symbol)
f5b79c1c 414 idx = reorder_modifiers (idx);
2732bdbb
RS
415 else if (INTEGERP (idx))
416 /* Clobber the high bits that can be present on a machine
417 with more than 24 bits of integer. */
ad4ec84a 418 XFASTINT (idx) = XINT (idx) & (CHAR_META | (CHAR_META - 1));
f5b79c1c
JB
419
420 /* Scan the keymap for a binding of idx. */
2c6f1a39 421 {
f5b79c1c 422 Lisp_Object tail;
2c6f1a39 423
f5b79c1c
JB
424 /* The cons after which we should insert new bindings. If the
425 keymap has a table element, we record its position here, so new
426 bindings will go after it; this way, the table will stay
427 towards the front of the alist and character lookups in dense
428 keymaps will remain fast. Otherwise, this just points at the
429 front of the keymap. */
e9b6dfb0 430 Lisp_Object insertion_point;
2c6f1a39 431
e9b6dfb0 432 insertion_point = keymap;
f5b79c1c 433 for (tail = XCONS (keymap)->cdr; CONSP (tail); tail = XCONS (tail)->cdr)
2c6f1a39 434 {
e9b6dfb0 435 Lisp_Object elt;
f5b79c1c 436
e9b6dfb0 437 elt = XCONS (tail)->car;
f5b79c1c
JB
438 switch (XTYPE (elt))
439 {
440 case Lisp_Vector:
0b8fc2d4 441 if (XTYPE (idx) == Lisp_Int
926a64aa 442 && XINT (idx) >= 0 && XINT (idx) < XVECTOR (elt)->size)
f5b79c1c
JB
443 {
444 XVECTOR (elt)->contents[XFASTINT (idx)] = def;
445 return def;
446 }
447 insertion_point = tail;
448 break;
449
450 case Lisp_Cons:
451 if (EQ (idx, XCONS (elt)->car))
452 {
453 XCONS (elt)->cdr = def;
454 return def;
455 }
456 break;
457
458 case Lisp_Symbol:
459 /* If we find a 'keymap' symbol in the spine of KEYMAP,
460 then we must have found the start of a second keymap
461 being used as the tail of KEYMAP, and a binding for IDX
462 should be inserted before it. */
463 if (EQ (elt, Qkeymap))
464 goto keymap_end;
465 break;
466 }
0188441d
JB
467
468 QUIT;
2c6f1a39 469 }
2c6f1a39 470
f5b79c1c
JB
471 keymap_end:
472 /* We have scanned the entire keymap, and not found a binding for
473 IDX. Let's add one. */
474 XCONS (insertion_point)->cdr =
475 Fcons (Fcons (idx, def), XCONS (insertion_point)->cdr);
476 }
477
2c6f1a39
JB
478 return def;
479}
480
f5b79c1c 481
2c6f1a39
JB
482DEFUN ("copy-keymap", Fcopy_keymap, Scopy_keymap, 1, 1, 0,
483 "Return a copy of the keymap KEYMAP.\n\
484The copy starts out with the same definitions of KEYMAP,\n\
485but changing either the copy or KEYMAP does not affect the other.\n\
1d8d96fa
JB
486Any key definitions that are subkeymaps are recursively copied.\n\
487However, a key definition which is a symbol whose definition is a keymap\n\
488is not copied.")
2c6f1a39
JB
489 (keymap)
490 Lisp_Object keymap;
491{
492 register Lisp_Object copy, tail;
493
494 copy = Fcopy_alist (get_keymap (keymap));
2c6f1a39 495
f5b79c1c 496 for (tail = copy; CONSP (tail); tail = XCONS (tail)->cdr)
2c6f1a39 497 {
e9b6dfb0 498 Lisp_Object elt;
2c6f1a39 499
e9b6dfb0 500 elt = XCONS (tail)->car;
926a64aa 501 if (XTYPE (elt) == Lisp_Vector)
2c6f1a39 502 {
f5b79c1c 503 int i;
2c6f1a39 504
f5b79c1c
JB
505 elt = Fcopy_sequence (elt);
506 XCONS (tail)->car = elt;
2c6f1a39 507
926a64aa 508 for (i = 0; i < XVECTOR (elt)->size; i++)
f5b79c1c 509 if (XTYPE (XVECTOR (elt)->contents[i]) != Lisp_Symbol
98006242 510 && ! NILP (Fkeymapp (XVECTOR (elt)->contents[i])))
f5b79c1c
JB
511 XVECTOR (elt)->contents[i] =
512 Fcopy_keymap (XVECTOR (elt)->contents[i]);
2c6f1a39 513 }
d65a13c5
KH
514 else if (CONSP (elt))
515 {
516 /* Skip the optional menu string. */
517 if (CONSP (XCONS (elt)->cdr)
518 && STRINGP (XCONS (XCONS (elt)->cdr)->car))
519 {
520 Lisp_Object tem;
521
522 /* Copy the cell, since copy-alist didn't go this deep. */
523 XCONS (elt)->cdr = Fcons (XCONS (XCONS (elt)->cdr)->car,
524 XCONS (XCONS (elt)->cdr)->cdr);
525 elt = XCONS (elt)->cdr;
526
527 /* Also skip the optional menu help string. */
528 if (CONSP (XCONS (elt)->cdr)
529 && STRINGP (XCONS (XCONS (elt)->cdr)->car))
530 {
531 XCONS (elt)->cdr = Fcons (XCONS (XCONS (elt)->cdr)->car,
532 XCONS (XCONS (elt)->cdr)->cdr);
533 elt = XCONS (elt)->cdr;
534 }
535 /* There may also be a list that caches key equivalences.
536 Just delete it for the new keymap. */
537 if (CONSP (XCONS (elt)->cdr)
538 && CONSP (XCONS (XCONS (elt)->cdr)->car)
539 && (NILP (tem = XCONS (XCONS (XCONS (elt)->cdr)->car)->car)
540 || VECTORP (tem)))
541 XCONS (elt)->cdr = XCONS (XCONS (elt)->cdr)->cdr;
542 }
543 if (CONSP (elt)
544 && ! SYMBOLP (XCONS (elt)->cdr)
545 && ! NILP (Fkeymapp (XCONS (elt)->cdr)))
546 XCONS (elt)->cdr = Fcopy_keymap (XCONS (elt)->cdr);
547 }
2c6f1a39
JB
548 }
549
550 return copy;
551}
552\f
cc0a8174
JB
553/* Simple Keymap mutators and accessors. */
554
2c6f1a39
JB
555DEFUN ("define-key", Fdefine_key, Sdefine_key, 3, 3, 0,
556 "Args KEYMAP, KEY, DEF. Define key sequence KEY, in KEYMAP, as DEF.\n\
557KEYMAP is a keymap. KEY is a string or a vector of symbols and characters\n\
558meaning a sequence of keystrokes and events.\n\
c818754b
RS
559Non-ASCII characters with codes above 127 (such as ISO Latin-1)\n\
560can be included if you use a vector.\n\
2c6f1a39
JB
561DEF is anything that can be a key's definition:\n\
562 nil (means key is undefined in this keymap),\n\
563 a command (a Lisp function suitable for interactive calling)\n\
564 a string (treated as a keyboard macro),\n\
565 a keymap (to define a prefix key),\n\
566 a symbol. When the key is looked up, the symbol will stand for its\n\
567 function definition, which should at that time be one of the above,\n\
568 or another symbol whose function definition is used, etc.\n\
569 a cons (STRING . DEFN), meaning that DEFN is the definition\n\
570 (DEFN should be a valid definition in its own right),\n\
6e8290aa
JB
571 or a cons (KEYMAP . CHAR), meaning use definition of CHAR in map KEYMAP.\n\
572\n\
573If KEYMAP is a sparse keymap, the pair binding KEY to DEF is added at\n\
574the front of KEYMAP.")
2c6f1a39 575 (keymap, key, def)
d09b2024 576 Lisp_Object keymap;
2c6f1a39
JB
577 Lisp_Object key;
578 Lisp_Object def;
579{
580 register int idx;
581 register Lisp_Object c;
582 register Lisp_Object tem;
583 register Lisp_Object cmd;
584 int metized = 0;
6ba6e250 585 int meta_bit;
2c6f1a39 586 int length;
d09b2024 587 struct gcpro gcpro1, gcpro2, gcpro3;
2c6f1a39 588
224a16e8 589 keymap = get_keymap_1 (keymap, 1, 1);
2c6f1a39
JB
590
591 if (XTYPE (key) != Lisp_Vector
592 && XTYPE (key) != Lisp_String)
593 key = wrong_type_argument (Qarrayp, key);
594
d09b2024 595 length = XFASTINT (Flength (key));
2c6f1a39
JB
596 if (length == 0)
597 return Qnil;
598
d09b2024
JB
599 GCPRO3 (keymap, key, def);
600
6ba6e250
RS
601 if (XTYPE (key) == Lisp_Vector)
602 meta_bit = meta_modifier;
603 else
604 meta_bit = 0x80;
605
2c6f1a39
JB
606 idx = 0;
607 while (1)
608 {
609 c = Faref (key, make_number (idx));
610
611 if (XTYPE (c) == Lisp_Int
6ba6e250 612 && (XINT (c) & meta_bit)
2c6f1a39
JB
613 && !metized)
614 {
615 c = meta_prefix_char;
616 metized = 1;
617 }
618 else
619 {
620 if (XTYPE (c) == Lisp_Int)
0b8fc2d4 621 XSETINT (c, XINT (c) & ~meta_bit);
2c6f1a39
JB
622
623 metized = 0;
624 idx++;
625 }
626
5907b863
KH
627 if (! INTEGERP (c) && ! SYMBOLP (c) && ! CONSP (c))
628 error ("Key sequence contains illegal events");
629
2c6f1a39 630 if (idx == length)
d09b2024 631 RETURN_UNGCPRO (store_in_keymap (keymap, c, def));
2c6f1a39 632
224a16e8 633 cmd = get_keyelt (access_keymap (keymap, c, 0, 1), 1);
2c6f1a39 634
c07aec97 635 /* If this key is undefined, make it a prefix. */
265a9e55 636 if (NILP (cmd))
c07aec97 637 cmd = define_as_prefix (keymap, c);
2c6f1a39 638
d09b2024
JB
639 keymap = get_keymap_1 (cmd, 0, 1);
640 if (NILP (keymap))
e9b6dfb0
KH
641 /* We must use Fkey_description rather than just passing key to
642 error; key might be a vector, not a string. */
643 error ("Key sequence %s uses invalid prefix characters",
644 XSTRING (Fkey_description (key))->data);
2c6f1a39
JB
645 }
646}
647
648/* Value is number if KEY is too long; NIL if valid but has no definition. */
649
7c140252 650DEFUN ("lookup-key", Flookup_key, Slookup_key, 2, 3, 0,
2c6f1a39
JB
651 "In keymap KEYMAP, look up key sequence KEY. Return the definition.\n\
652nil means undefined. See doc of `define-key' for kinds of definitions.\n\
7c140252 653\n\
2c6f1a39
JB
654A number as value means KEY is \"too long\";\n\
655that is, characters or symbols in it except for the last one\n\
656fail to be a valid sequence of prefix characters in KEYMAP.\n\
657The number is how many characters at the front of KEY\n\
7c140252
JB
658it takes to reach a non-prefix command.\n\
659\n\
660Normally, `lookup-key' ignores bindings for t, which act as default\n\
661bindings, used when nothing else in the keymap applies; this makes it\n\
662useable as a general function for probing keymaps. However, if the\n\
663third optional argument ACCEPT-DEFAULT is non-nil, `lookup-key' will\n\
664recognize the default bindings, just as `read-key-sequence' does.")
665 (keymap, key, accept_default)
2c6f1a39
JB
666 register Lisp_Object keymap;
667 Lisp_Object key;
7c140252 668 Lisp_Object accept_default;
2c6f1a39
JB
669{
670 register int idx;
671 register Lisp_Object tem;
672 register Lisp_Object cmd;
673 register Lisp_Object c;
674 int metized = 0;
675 int length;
7c140252 676 int t_ok = ! NILP (accept_default);
6ba6e250 677 int meta_bit;
2c6f1a39 678
224a16e8 679 keymap = get_keymap_1 (keymap, 1, 1);
2c6f1a39
JB
680
681 if (XTYPE (key) != Lisp_Vector
682 && XTYPE (key) != Lisp_String)
683 key = wrong_type_argument (Qarrayp, key);
684
d09b2024 685 length = XFASTINT (Flength (key));
2c6f1a39
JB
686 if (length == 0)
687 return keymap;
688
6ba6e250
RS
689 if (XTYPE (key) == Lisp_Vector)
690 meta_bit = meta_modifier;
691 else
692 meta_bit = 0x80;
693
2c6f1a39
JB
694 idx = 0;
695 while (1)
696 {
697 c = Faref (key, make_number (idx));
698
699 if (XTYPE (c) == Lisp_Int
6ba6e250 700 && (XINT (c) & meta_bit)
2c6f1a39
JB
701 && !metized)
702 {
703 c = meta_prefix_char;
704 metized = 1;
705 }
706 else
707 {
708 if (XTYPE (c) == Lisp_Int)
6ba6e250 709 XSETINT (c, XINT (c) & ~meta_bit);
2c6f1a39
JB
710
711 metized = 0;
712 idx++;
713 }
714
224a16e8 715 cmd = get_keyelt (access_keymap (keymap, c, t_ok, 0), 1);
2c6f1a39
JB
716 if (idx == length)
717 return cmd;
718
224a16e8 719 keymap = get_keymap_1 (cmd, 0, 1);
d09b2024 720 if (NILP (keymap))
2c6f1a39
JB
721 return make_number (idx);
722
2c6f1a39
JB
723 QUIT;
724 }
725}
726
c07aec97
RS
727/* Make KEYMAP define event C as a keymap (i.e., as a prefix).
728 Assume that currently it does not define C at all.
729 Return the keymap. */
730
731static Lisp_Object
732define_as_prefix (keymap, c)
733 Lisp_Object keymap, c;
734{
735 Lisp_Object inherit, cmd;
736
737 cmd = Fmake_sparse_keymap (Qnil);
738 /* If this key is defined as a prefix in an inherited keymap,
739 make it a prefix in this map, and make its definition
740 inherit the other prefix definition. */
741 inherit = access_keymap (keymap, c, 0, 0);
742 if (NILP (inherit))
743 {
744 /* If there's an inherited keymap
745 and it doesn't define this key,
746 make it define this key. */
747 Lisp_Object tail;
748
749 for (tail = Fcdr (keymap); CONSP (tail); tail = XCONS (tail)->cdr)
750 if (EQ (XCONS (tail)->car, Qkeymap))
751 break;
752
753 if (!NILP (tail))
754 inherit = define_as_prefix (tail, c);
755 }
756
757 cmd = nconc2 (cmd, inherit);
758 store_in_keymap (keymap, c, cmd);
759
760 return cmd;
761}
762
0b8fc2d4
RS
763/* Append a key to the end of a key sequence. We always make a vector. */
764
2c6f1a39
JB
765Lisp_Object
766append_key (key_sequence, key)
767 Lisp_Object key_sequence, key;
768{
769 Lisp_Object args[2];
770
771 args[0] = key_sequence;
772
0b8fc2d4
RS
773 args[1] = Fcons (key, Qnil);
774 return Fvconcat (2, args);
2c6f1a39
JB
775}
776
777\f
cc0a8174
JB
778/* Global, local, and minor mode keymap stuff. */
779
265a9e55 780/* We can't put these variables inside current_minor_maps, since under
6bbbd9b0
JB
781 some systems, static gets macro-defined to be the empty string.
782 Ickypoo. */
265a9e55
JB
783static Lisp_Object *cmm_modes, *cmm_maps;
784static int cmm_size;
785
cc0a8174
JB
786/* Store a pointer to an array of the keymaps of the currently active
787 minor modes in *buf, and return the number of maps it contains.
788
789 This function always returns a pointer to the same buffer, and may
790 free or reallocate it, so if you want to keep it for a long time or
791 hand it out to lisp code, copy it. This procedure will be called
792 for every key sequence read, so the nice lispy approach (return a
793 new assoclist, list, what have you) for each invocation would
794 result in a lot of consing over time.
795
796 If we used xrealloc/xmalloc and ran out of memory, they would throw
797 back to the command loop, which would try to read a key sequence,
798 which would call this function again, resulting in an infinite
799 loop. Instead, we'll use realloc/malloc and silently truncate the
800 list, let the key sequence be read, and hope some other piece of
801 code signals the error. */
802int
803current_minor_maps (modeptr, mapptr)
804 Lisp_Object **modeptr, **mapptr;
805{
cc0a8174 806 int i = 0;
6bbbd9b0 807 Lisp_Object alist, assoc, var, val;
cc0a8174
JB
808
809 for (alist = Vminor_mode_map_alist;
810 CONSP (alist);
811 alist = XCONS (alist)->cdr)
812 if (CONSP (assoc = XCONS (alist)->car)
813 && XTYPE (var = XCONS (assoc)->car) == Lisp_Symbol
6bbbd9b0
JB
814 && ! EQ ((val = find_symbol_value (var)), Qunbound)
815 && ! NILP (val))
cc0a8174 816 {
265a9e55 817 if (i >= cmm_size)
cc0a8174
JB
818 {
819 Lisp_Object *newmodes, *newmaps;
820
265a9e55 821 if (cmm_maps)
cc0a8174 822 {
9ac0d9e0 823 BLOCK_INPUT;
e58077c8 824 cmm_size *= 2;
64116ad5
RS
825 newmodes
826 = (Lisp_Object *) realloc (cmm_modes,
827 cmm_size * sizeof (Lisp_Object));
828 newmaps
829 = (Lisp_Object *) realloc (cmm_maps,
830 cmm_size * sizeof (Lisp_Object));
9ac0d9e0 831 UNBLOCK_INPUT;
cc0a8174
JB
832 }
833 else
834 {
9ac0d9e0 835 BLOCK_INPUT;
e58077c8 836 cmm_size = 30;
64116ad5
RS
837 newmodes
838 = (Lisp_Object *) malloc (cmm_size * sizeof (Lisp_Object));
839 newmaps
840 = (Lisp_Object *) malloc (cmm_size * sizeof (Lisp_Object));
9ac0d9e0 841 UNBLOCK_INPUT;
cc0a8174
JB
842 }
843
844 if (newmaps && newmodes)
845 {
265a9e55
JB
846 cmm_modes = newmodes;
847 cmm_maps = newmaps;
cc0a8174
JB
848 }
849 else
850 break;
851 }
265a9e55 852 cmm_modes[i] = var;
992984b2 853 cmm_maps [i] = Findirect_function (XCONS (assoc)->cdr);
cc0a8174
JB
854 i++;
855 }
856
265a9e55
JB
857 if (modeptr) *modeptr = cmm_modes;
858 if (mapptr) *mapptr = cmm_maps;
cc0a8174
JB
859 return i;
860}
861
7c140252 862DEFUN ("key-binding", Fkey_binding, Skey_binding, 1, 2, 0,
2c6f1a39 863 "Return the binding for command KEY in current keymaps.\n\
7c140252
JB
864KEY is a string or vector, a sequence of keystrokes.\n\
865The binding is probably a symbol with a function definition.\n\
866\n\
867Normally, `key-binding' ignores bindings for t, which act as default\n\
868bindings, used when nothing else in the keymap applies; this makes it\n\
d831234b
RS
869usable as a general function for probing keymaps. However, if the\n\
870optional second argument ACCEPT-DEFAULT is non-nil, `key-binding' does\n\
7c140252
JB
871recognize the default bindings, just as `read-key-sequence' does.")
872 (key, accept_default)
c2a2858a 873 Lisp_Object key, accept_default;
2c6f1a39 874{
cc0a8174
JB
875 Lisp_Object *maps, value;
876 int nmaps, i;
877
7d92e329 878 if (!NILP (Voverriding_local_map))
2c6f1a39 879 {
7d92e329 880 value = Flookup_key (Voverriding_local_map, key, accept_default);
265a9e55 881 if (! NILP (value) && XTYPE (value) != Lisp_Int)
2c6f1a39
JB
882 return value;
883 }
7d92e329
RS
884 else
885 {
886 nmaps = current_minor_maps (0, &maps);
887 for (i = 0; i < nmaps; i++)
888 if (! NILP (maps[i]))
889 {
890 value = Flookup_key (maps[i], key, accept_default);
891 if (! NILP (value) && XTYPE (value) != Lisp_Int)
892 return value;
893 }
894
895 if (! NILP (current_buffer->keymap))
896 {
897 value = Flookup_key (current_buffer->keymap, key, accept_default);
898 if (! NILP (value) && XTYPE (value) != Lisp_Int)
899 return value;
900 }
901 }
cc0a8174 902
7c140252 903 value = Flookup_key (current_global_map, key, accept_default);
265a9e55 904 if (! NILP (value) && XTYPE (value) != Lisp_Int)
cc0a8174
JB
905 return value;
906
907 return Qnil;
2c6f1a39
JB
908}
909
7c140252 910DEFUN ("local-key-binding", Flocal_key_binding, Slocal_key_binding, 1, 2, 0,
2c6f1a39
JB
911 "Return the binding for command KEYS in current local keymap only.\n\
912KEYS is a string, a sequence of keystrokes.\n\
7c140252
JB
913The binding is probably a symbol with a function definition.\n\
914\n\
915If optional argument ACCEPT-DEFAULT is non-nil, recognize default\n\
916bindings; see the description of `lookup-key' for more details about this.")
917 (keys, accept_default)
918 Lisp_Object keys, accept_default;
2c6f1a39
JB
919{
920 register Lisp_Object map;
921 map = current_buffer->keymap;
265a9e55 922 if (NILP (map))
2c6f1a39 923 return Qnil;
7c140252 924 return Flookup_key (map, keys, accept_default);
2c6f1a39
JB
925}
926
7c140252 927DEFUN ("global-key-binding", Fglobal_key_binding, Sglobal_key_binding, 1, 2, 0,
2c6f1a39
JB
928 "Return the binding for command KEYS in current global keymap only.\n\
929KEYS is a string, a sequence of keystrokes.\n\
6bbbd9b0
JB
930The binding is probably a symbol with a function definition.\n\
931This function's return values are the same as those of lookup-key\n\
7c140252
JB
932(which see).\n\
933\n\
934If optional argument ACCEPT-DEFAULT is non-nil, recognize default\n\
935bindings; see the description of `lookup-key' for more details about this.")
936 (keys, accept_default)
937 Lisp_Object keys, accept_default;
2c6f1a39 938{
7c140252 939 return Flookup_key (current_global_map, keys, accept_default);
2c6f1a39
JB
940}
941
7c140252 942DEFUN ("minor-mode-key-binding", Fminor_mode_key_binding, Sminor_mode_key_binding, 1, 2, 0,
cc0a8174
JB
943 "Find the visible minor mode bindings of KEY.\n\
944Return an alist of pairs (MODENAME . BINDING), where MODENAME is the\n\
945the symbol which names the minor mode binding KEY, and BINDING is\n\
946KEY's definition in that mode. In particular, if KEY has no\n\
947minor-mode bindings, return nil. If the first binding is a\n\
948non-prefix, all subsequent bindings will be omitted, since they would\n\
949be ignored. Similarly, the list doesn't include non-prefix bindings\n\
7c140252
JB
950that come after prefix bindings.\n\
951\n\
952If optional argument ACCEPT-DEFAULT is non-nil, recognize default\n\
953bindings; see the description of `lookup-key' for more details about this.")
954 (key, accept_default)
955 Lisp_Object key, accept_default;
cc0a8174
JB
956{
957 Lisp_Object *modes, *maps;
958 int nmaps;
959 Lisp_Object binding;
960 int i, j;
961
962 nmaps = current_minor_maps (&modes, &maps);
963
964 for (i = j = 0; i < nmaps; i++)
265a9e55 965 if (! NILP (maps[i])
7c140252 966 && ! NILP (binding = Flookup_key (maps[i], key, accept_default))
cc0a8174
JB
967 && XTYPE (binding) != Lisp_Int)
968 {
d09b2024 969 if (! NILP (get_keymap (binding)))
cc0a8174
JB
970 maps[j++] = Fcons (modes[i], binding);
971 else if (j == 0)
972 return Fcons (Fcons (modes[i], binding), Qnil);
973 }
974
975 return Flist (j, maps);
976}
977
2c6f1a39
JB
978DEFUN ("global-set-key", Fglobal_set_key, Sglobal_set_key, 2, 2,
979 "kSet key globally: \nCSet key %s to command: ",
980 "Give KEY a global binding as COMMAND.\n\
981COMMAND is a symbol naming an interactively-callable function.\n\
2fa8c0b5 982KEY is a key sequence (a string or vector of characters or event types).\n\
c818754b
RS
983Non-ASCII characters with codes above 127 (such as ISO Latin-1)\n\
984can be included if you use a vector.\n\
2c6f1a39
JB
985Note that if KEY has a local binding in the current buffer\n\
986that local binding will continue to shadow any global binding.")
987 (keys, function)
988 Lisp_Object keys, function;
989{
990 if (XTYPE (keys) != Lisp_Vector
991 && XTYPE (keys) != Lisp_String)
992 keys = wrong_type_argument (Qarrayp, keys);
993
994 Fdefine_key (current_global_map, keys, function);
995 return Qnil;
996}
997
998DEFUN ("local-set-key", Flocal_set_key, Slocal_set_key, 2, 2,
999 "kSet key locally: \nCSet key %s locally to command: ",
1000 "Give KEY a local binding as COMMAND.\n\
1001COMMAND is a symbol naming an interactively-callable function.\n\
2fa8c0b5 1002KEY is a key sequence (a string or vector of characters or event types).\n\
c818754b
RS
1003Non-ASCII characters with codes above 127 (such as ISO Latin-1)\n\
1004can be included if you use a vector.\n\
2c6f1a39 1005The binding goes in the current buffer's local map,\n\
af1d6f09 1006which in most cases is shared with all other buffers in the same major mode.")
2c6f1a39
JB
1007 (keys, function)
1008 Lisp_Object keys, function;
1009{
1010 register Lisp_Object map;
1011 map = current_buffer->keymap;
265a9e55 1012 if (NILP (map))
2c6f1a39 1013 {
ce6e5d0b 1014 map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
1015 current_buffer->keymap = map;
1016 }
1017
1018 if (XTYPE (keys) != Lisp_Vector
1019 && XTYPE (keys) != Lisp_String)
1020 keys = wrong_type_argument (Qarrayp, keys);
1021
1022 Fdefine_key (map, keys, function);
1023 return Qnil;
1024}
1025
1026DEFUN ("global-unset-key", Fglobal_unset_key, Sglobal_unset_key,
1027 1, 1, "kUnset key globally: ",
1028 "Remove global binding of KEY.\n\
1029KEY is a string representing a sequence of keystrokes.")
1030 (keys)
1031 Lisp_Object keys;
1032{
1033 return Fglobal_set_key (keys, Qnil);
1034}
1035
1036DEFUN ("local-unset-key", Flocal_unset_key, Slocal_unset_key, 1, 1,
1037 "kUnset key locally: ",
1038 "Remove local binding of KEY.\n\
1039KEY is a string representing a sequence of keystrokes.")
1040 (keys)
1041 Lisp_Object keys;
1042{
265a9e55 1043 if (!NILP (current_buffer->keymap))
2c6f1a39
JB
1044 Flocal_set_key (keys, Qnil);
1045 return Qnil;
1046}
1047
1048DEFUN ("define-prefix-command", Fdefine_prefix_command, Sdefine_prefix_command, 1, 2, 0,
cd8520b9 1049 "Define COMMAND as a prefix command. COMMAND should be a symbol.\n\
2c6f1a39 1050A new sparse keymap is stored as COMMAND's function definition and its value.\n\
1d8d96fa
JB
1051If a second optional argument MAPVAR is given, the map is stored as\n\
1052its value instead of as COMMAND's value; but COMMAND is still defined\n\
1053as a function.")
2c6f1a39
JB
1054 (name, mapvar)
1055 Lisp_Object name, mapvar;
1056{
1057 Lisp_Object map;
ce6e5d0b 1058 map = Fmake_sparse_keymap (Qnil);
2c6f1a39 1059 Ffset (name, map);
265a9e55 1060 if (!NILP (mapvar))
2c6f1a39
JB
1061 Fset (mapvar, map);
1062 else
1063 Fset (name, map);
1064 return name;
1065}
1066
1067DEFUN ("use-global-map", Fuse_global_map, Suse_global_map, 1, 1, 0,
1068 "Select KEYMAP as the global keymap.")
1069 (keymap)
1070 Lisp_Object keymap;
1071{
1072 keymap = get_keymap (keymap);
1073 current_global_map = keymap;
1074 return Qnil;
1075}
1076
1077DEFUN ("use-local-map", Fuse_local_map, Suse_local_map, 1, 1, 0,
1078 "Select KEYMAP as the local keymap.\n\
1079If KEYMAP is nil, that means no local keymap.")
1080 (keymap)
1081 Lisp_Object keymap;
1082{
265a9e55 1083 if (!NILP (keymap))
2c6f1a39
JB
1084 keymap = get_keymap (keymap);
1085
1086 current_buffer->keymap = keymap;
1087
1088 return Qnil;
1089}
1090
1091DEFUN ("current-local-map", Fcurrent_local_map, Scurrent_local_map, 0, 0, 0,
1092 "Return current buffer's local keymap, or nil if it has none.")
1093 ()
1094{
1095 return current_buffer->keymap;
1096}
1097
1098DEFUN ("current-global-map", Fcurrent_global_map, Scurrent_global_map, 0, 0, 0,
1099 "Return the current global keymap.")
1100 ()
1101{
1102 return current_global_map;
1103}
cc0a8174
JB
1104
1105DEFUN ("current-minor-mode-maps", Fcurrent_minor_mode_maps, Scurrent_minor_mode_maps, 0, 0, 0,
1106 "Return a list of keymaps for the minor modes of the current buffer.")
1107 ()
1108{
1109 Lisp_Object *maps;
1110 int nmaps = current_minor_maps (0, &maps);
1111
1112 return Flist (nmaps, maps);
1113}
2c6f1a39 1114\f
cc0a8174
JB
1115/* Help functions for describing and documenting keymaps. */
1116
2c6f1a39 1117DEFUN ("accessible-keymaps", Faccessible_keymaps, Saccessible_keymaps,
53c8f9fa 1118 1, 2, 0,
2c6f1a39
JB
1119 "Find all keymaps accessible via prefix characters from KEYMAP.\n\
1120Returns a list of elements of the form (KEYS . MAP), where the sequence\n\
1121KEYS starting from KEYMAP gets you to MAP. These elements are ordered\n\
f66ef185
RS
1122so that the KEYS increase in length. The first element is (\"\" . KEYMAP).\n\
1123An optional argument PREFIX, if non-nil, should be a key sequence;\n\
1124then the value includes only maps for prefixes that start with PREFIX.")
53c8f9fa
RS
1125 (startmap, prefix)
1126 Lisp_Object startmap, prefix;
2c6f1a39 1127{
53c8f9fa
RS
1128 Lisp_Object maps, good_maps, tail;
1129 int prefixlen = 0;
1130
1131 if (!NILP (prefix))
1132 prefixlen = XINT (Flength (prefix));
2c6f1a39 1133
0b8fc2d4
RS
1134 maps = Fcons (Fcons (Fmake_vector (make_number (0), Qnil),
1135 get_keymap (startmap)),
1136 Qnil);
2c6f1a39
JB
1137
1138 /* For each map in the list maps,
1139 look at any other maps it points to,
1140 and stick them at the end if they are not already in the list.
1141
1142 This is a breadth-first traversal, where tail is the queue of
1143 nodes, and maps accumulates a list of all nodes visited. */
1144
f5b79c1c 1145 for (tail = maps; CONSP (tail); tail = XCONS (tail)->cdr)
2c6f1a39 1146 {
e9b6dfb0
KH
1147 register Lisp_Object thisseq, thismap;
1148 Lisp_Object last;
2c6f1a39 1149 /* Does the current sequence end in the meta-prefix-char? */
e9b6dfb0
KH
1150 int is_metized;
1151
1152 thisseq = Fcar (Fcar (tail));
1153 thismap = Fcdr (Fcar (tail));
1154 last = make_number (XINT (Flength (thisseq)) - 1);
1155 is_metized = (XINT (last) >= 0
1156 && EQ (Faref (thisseq, last), meta_prefix_char));
2c6f1a39 1157
f5b79c1c 1158 for (; CONSP (thismap); thismap = XCONS (thismap)->cdr)
2c6f1a39 1159 {
e9b6dfb0
KH
1160 Lisp_Object elt;
1161
1162 elt = XCONS (thismap)->car;
2c6f1a39 1163
f5b79c1c
JB
1164 QUIT;
1165
1166 if (XTYPE (elt) == Lisp_Vector)
2c6f1a39
JB
1167 {
1168 register int i;
1169
1170 /* Vector keymap. Scan all the elements. */
db6f9d95 1171 for (i = 0; i < XVECTOR (elt)->size; i++)
2c6f1a39
JB
1172 {
1173 register Lisp_Object tem;
1174 register Lisp_Object cmd;
1175
224a16e8 1176 cmd = get_keyelt (XVECTOR (elt)->contents[i], 0);
265a9e55 1177 if (NILP (cmd)) continue;
2c6f1a39 1178 tem = Fkeymapp (cmd);
265a9e55 1179 if (!NILP (tem))
2c6f1a39
JB
1180 {
1181 cmd = get_keymap (cmd);
1182 /* Ignore keymaps that are already added to maps. */
1183 tem = Frassq (cmd, maps);
265a9e55 1184 if (NILP (tem))
2c6f1a39
JB
1185 {
1186 /* If the last key in thisseq is meta-prefix-char,
1187 turn it into a meta-ized keystroke. We know
1188 that the event we're about to append is an
f5b79c1c
JB
1189 ascii keystroke since we're processing a
1190 keymap table. */
2c6f1a39
JB
1191 if (is_metized)
1192 {
0b8fc2d4 1193 int meta_bit = meta_modifier;
2c6f1a39 1194 tem = Fcopy_sequence (thisseq);
0b8fc2d4
RS
1195
1196 Faset (tem, last, make_number (i | meta_bit));
2c6f1a39
JB
1197
1198 /* This new sequence is the same length as
1199 thisseq, so stick it in the list right
1200 after this one. */
0b8fc2d4
RS
1201 XCONS (tail)->cdr
1202 = Fcons (Fcons (tem, cmd), XCONS (tail)->cdr);
2c6f1a39
JB
1203 }
1204 else
1205 {
1206 tem = append_key (thisseq, make_number (i));
1207 nconc2 (tail, Fcons (Fcons (tem, cmd), Qnil));
1208 }
1209 }
1210 }
1211 }
f5b79c1c
JB
1212 }
1213 else if (CONSP (elt))
2c6f1a39 1214 {
e9b6dfb0 1215 register Lisp_Object cmd, tem, filter;
2c6f1a39 1216
224a16e8 1217 cmd = get_keyelt (XCONS (elt)->cdr, 0);
2c6f1a39
JB
1218 /* Ignore definitions that aren't keymaps themselves. */
1219 tem = Fkeymapp (cmd);
265a9e55 1220 if (!NILP (tem))
2c6f1a39
JB
1221 {
1222 /* Ignore keymaps that have been seen already. */
1223 cmd = get_keymap (cmd);
1224 tem = Frassq (cmd, maps);
265a9e55 1225 if (NILP (tem))
2c6f1a39 1226 {
53c8f9fa 1227 /* Let elt be the event defined by this map entry. */
2c6f1a39
JB
1228 elt = XCONS (elt)->car;
1229
1230 /* If the last key in thisseq is meta-prefix-char, and
1231 this entry is a binding for an ascii keystroke,
1232 turn it into a meta-ized keystroke. */
1233 if (is_metized && XTYPE (elt) == Lisp_Int)
1234 {
1235 tem = Fcopy_sequence (thisseq);
0b8fc2d4
RS
1236 Faset (tem, last,
1237 make_number (XINT (elt) | meta_modifier));
2c6f1a39
JB
1238
1239 /* This new sequence is the same length as
1240 thisseq, so stick it in the list right
1241 after this one. */
53c8f9fa
RS
1242 XCONS (tail)->cdr
1243 = Fcons (Fcons (tem, cmd), XCONS (tail)->cdr);
2c6f1a39
JB
1244 }
1245 else
1246 nconc2 (tail,
1247 Fcons (Fcons (append_key (thisseq, elt), cmd),
1248 Qnil));
1249 }
1250 }
1251 }
2c6f1a39 1252 }
2c6f1a39
JB
1253 }
1254
53c8f9fa
RS
1255 if (NILP (prefix))
1256 return maps;
1257
1258 /* Now find just the maps whose access prefixes start with PREFIX. */
1259
1260 good_maps = Qnil;
1261 for (; CONSP (maps); maps = XCONS (maps)->cdr)
1262 {
1263 Lisp_Object elt, thisseq;
1264 elt = XCONS (maps)->car;
1265 thisseq = XCONS (elt)->car;
1266 /* The access prefix must be at least as long as PREFIX,
1267 and the first elements must match those of PREFIX. */
1268 if (XINT (Flength (thisseq)) >= prefixlen)
1269 {
1270 int i;
1271 for (i = 0; i < prefixlen; i++)
1272 {
1273 Lisp_Object i1;
1274 XFASTINT (i1) = i;
1275 if (!EQ (Faref (thisseq, i1), Faref (prefix, i1)))
1276 break;
1277 }
1278 if (i == prefixlen)
1279 good_maps = Fcons (elt, good_maps);
1280 }
1281 }
1282
1283 return Fnreverse (good_maps);
2c6f1a39
JB
1284}
1285
1286Lisp_Object Qsingle_key_description, Qkey_description;
1287
1288DEFUN ("key-description", Fkey_description, Skey_description, 1, 1, 0,
1289 "Return a pretty description of key-sequence KEYS.\n\
1290Control characters turn into \"C-foo\" sequences, meta into \"M-foo\"\n\
1291spaces are put between sequence elements, etc.")
1292 (keys)
1293 Lisp_Object keys;
1294{
6ba6e250
RS
1295 if (XTYPE (keys) == Lisp_String)
1296 {
1297 Lisp_Object vector;
1298 int i;
1299 vector = Fmake_vector (Flength (keys), Qnil);
1300 for (i = 0; i < XSTRING (keys)->size; i++)
1301 {
1302 if (XSTRING (keys)->data[i] & 0x80)
1303 XFASTINT (XVECTOR (vector)->contents[i])
1304 = meta_modifier | (XSTRING (keys)->data[i] & ~0x80);
1305 else
1306 XFASTINT (XVECTOR (vector)->contents[i])
1307 = XSTRING (keys)->data[i];
1308 }
1309 keys = vector;
1310 }
2c6f1a39
JB
1311 return Fmapconcat (Qsingle_key_description, keys, build_string (" "));
1312}
1313
1314char *
1315push_key_description (c, p)
1316 register unsigned int c;
1317 register char *p;
1318{
71ac885b
RS
1319 /* Clear all the meaningless bits above the meta bit. */
1320 c &= meta_modifier | ~ - meta_modifier;
1321
6ba6e250
RS
1322 if (c & alt_modifier)
1323 {
1324 *p++ = 'A';
1325 *p++ = '-';
1326 c -= alt_modifier;
1327 }
1328 if (c & ctrl_modifier)
1329 {
1330 *p++ = 'C';
1331 *p++ = '-';
1332 c -= ctrl_modifier;
1333 }
1334 if (c & hyper_modifier)
1335 {
1336 *p++ = 'H';
1337 *p++ = '-';
1338 c -= hyper_modifier;
1339 }
1340 if (c & meta_modifier)
2c6f1a39
JB
1341 {
1342 *p++ = 'M';
1343 *p++ = '-';
6ba6e250
RS
1344 c -= meta_modifier;
1345 }
1346 if (c & shift_modifier)
1347 {
1348 *p++ = 'S';
1349 *p++ = '-';
1350 c -= shift_modifier;
1351 }
1352 if (c & super_modifier)
1353 {
1354 *p++ = 's';
1355 *p++ = '-';
1356 c -= super_modifier;
2c6f1a39
JB
1357 }
1358 if (c < 040)
1359 {
1360 if (c == 033)
1361 {
1362 *p++ = 'E';
1363 *p++ = 'S';
1364 *p++ = 'C';
1365 }
6ba6e250 1366 else if (c == '\t')
2c6f1a39
JB
1367 {
1368 *p++ = 'T';
1369 *p++ = 'A';
1370 *p++ = 'B';
1371 }
1372 else if (c == Ctl('J'))
1373 {
1374 *p++ = 'L';
1375 *p++ = 'F';
1376 *p++ = 'D';
1377 }
1378 else if (c == Ctl('M'))
1379 {
1380 *p++ = 'R';
1381 *p++ = 'E';
1382 *p++ = 'T';
1383 }
1384 else
1385 {
1386 *p++ = 'C';
1387 *p++ = '-';
1388 if (c > 0 && c <= Ctl ('Z'))
1389 *p++ = c + 0140;
1390 else
1391 *p++ = c + 0100;
1392 }
1393 }
1394 else if (c == 0177)
1395 {
1396 *p++ = 'D';
1397 *p++ = 'E';
1398 *p++ = 'L';
1399 }
1400 else if (c == ' ')
1401 {
1402 *p++ = 'S';
1403 *p++ = 'P';
1404 *p++ = 'C';
1405 }
6ba6e250 1406 else if (c < 256)
2c6f1a39 1407 *p++ = c;
6ba6e250
RS
1408 else
1409 {
1410 *p++ = '\\';
1411 *p++ = (7 & (c >> 15)) + '0';
1412 *p++ = (7 & (c >> 12)) + '0';
1413 *p++ = (7 & (c >> 9)) + '0';
1414 *p++ = (7 & (c >> 6)) + '0';
1415 *p++ = (7 & (c >> 3)) + '0';
1416 *p++ = (7 & (c >> 0)) + '0';
1417 }
2c6f1a39
JB
1418
1419 return p;
1420}
1421
1422DEFUN ("single-key-description", Fsingle_key_description, Ssingle_key_description, 1, 1, 0,
1423 "Return a pretty description of command character KEY.\n\
1424Control characters turn into C-whatever, etc.")
1425 (key)
1426 Lisp_Object key;
1427{
6ba6e250 1428 char tem[20];
2c6f1a39 1429
cebd887d 1430 key = EVENT_HEAD (key);
6bbbd9b0 1431
2c6f1a39
JB
1432 switch (XTYPE (key))
1433 {
1434 case Lisp_Int: /* Normal character */
6ba6e250 1435 *push_key_description (XUINT (key), tem) = 0;
2c6f1a39
JB
1436 return build_string (tem);
1437
1438 case Lisp_Symbol: /* Function key or event-symbol */
1439 return Fsymbol_name (key);
1440
2c6f1a39 1441 default:
c96dcc01 1442 error ("KEY must be an integer, cons, or symbol.");
2c6f1a39
JB
1443 }
1444}
1445
1446char *
1447push_text_char_description (c, p)
1448 register unsigned int c;
1449 register char *p;
1450{
1451 if (c >= 0200)
1452 {
1453 *p++ = 'M';
1454 *p++ = '-';
1455 c -= 0200;
1456 }
1457 if (c < 040)
1458 {
1459 *p++ = '^';
1460 *p++ = c + 64; /* 'A' - 1 */
1461 }
1462 else if (c == 0177)
1463 {
1464 *p++ = '^';
1465 *p++ = '?';
1466 }
1467 else
1468 *p++ = c;
1469 return p;
1470}
1471
1472DEFUN ("text-char-description", Ftext_char_description, Stext_char_description, 1, 1, 0,
1473 "Return a pretty description of file-character CHAR.\n\
1474Control characters turn into \"^char\", etc.")
1475 (chr)
1476 Lisp_Object chr;
1477{
1478 char tem[6];
1479
1480 CHECK_NUMBER (chr, 0);
1481
1482 *push_text_char_description (XINT (chr) & 0377, tem) = 0;
1483
1484 return build_string (tem);
1485}
2fc66973
JB
1486
1487/* Return non-zero if SEQ contains only ASCII characters, perhaps with
1488 a meta bit. */
1489static int
1490ascii_sequence_p (seq)
1491 Lisp_Object seq;
1492{
1493 Lisp_Object i;
1494 int len = XINT (Flength (seq));
ffab2bd6 1495
2fc66973
JB
1496 for (XFASTINT (i) = 0; XFASTINT (i) < len; XFASTINT (i)++)
1497 {
ffab2bd6
RS
1498 Lisp_Object elt;
1499
1500 elt = Faref (seq, i);
2fc66973
JB
1501
1502 if (XTYPE (elt) != Lisp_Int
1503 || (XUINT (elt) & ~CHAR_META) >= 0x80)
1504 return 0;
1505 }
1506
1507 return 1;
1508}
1509
2c6f1a39 1510\f
cc0a8174
JB
1511/* where-is - finding a command in a set of keymaps. */
1512
f0148b5e
RS
1513DEFUN ("where-is-internal", Fwhere_is_internal, Swhere_is_internal, 1, 4, 0,
1514 "Return list of keys that invoke DEFINITION.\n\
1515If KEYMAP is non-nil, search only KEYMAP and the global keymap.\n\
1516If KEYMAP is nil, search all the currently active keymaps.\n\
2c6f1a39 1517\n\
f0148b5e 1518If optional 3rd arg FIRSTONLY is non-nil, return the first key sequence found,\n\
b8d584f6
RS
1519rather than a list of all possible key sequences.\n\
1520If FIRSTONLY is t, avoid key sequences which use non-ASCII\n\
2fc66973
JB
1521keys and therefore may not be usable on ASCII terminals. If FIRSTONLY\n\
1522is the symbol `non-ascii', return the first binding found, no matter\n\
1523what its components.\n\
2c6f1a39 1524\n\
f0148b5e 1525If optional 4th arg NOINDIRECT is non-nil, don't follow indirections\n\
2c6f1a39
JB
1526to other keymaps or slots. This makes it possible to search for an\n\
1527indirect definition itself.")
f0148b5e
RS
1528 (definition, keymap, firstonly, noindirect)
1529 Lisp_Object definition, keymap;
2c6f1a39
JB
1530 Lisp_Object firstonly, noindirect;
1531{
1532 register Lisp_Object maps;
1533 Lisp_Object found;
f0148b5e 1534 int keymap_specified = !NILP (keymap);
2c6f1a39 1535
f0148b5e
RS
1536 if (! keymap_specified)
1537 {
1538#ifdef USE_TEXT_PROPERTIES
1539 keymap = get_local_map (PT, current_buffer);
1540#else
1541 keymap = current_buffer->keymap;
1542#endif
1543 }
2c6f1a39 1544
f0148b5e
RS
1545 if (!NILP (keymap))
1546 maps = nconc2 (Faccessible_keymaps (get_keymap (keymap), Qnil),
1547 Faccessible_keymaps (get_keymap (current_global_map),
1548 Qnil));
2c6f1a39 1549 else
f0148b5e
RS
1550 maps = Faccessible_keymaps (get_keymap (current_global_map), Qnil);
1551
1552 /* Put the minor mode keymaps on the front. */
1553 if (! keymap_specified)
1554 {
1555 Lisp_Object minors;
1556 minors = Fnreverse (Fcurrent_minor_mode_maps ());
1557 while (!NILP (minors))
1558 {
1559 maps = nconc2 (Faccessible_keymaps (get_keymap (XCONS (minors)->car),
1560 Qnil),
1561 maps);
1562 minors = XCONS (minors)->cdr;
1563 }
1564 }
2c6f1a39
JB
1565
1566 found = Qnil;
1567
265a9e55 1568 for (; !NILP (maps); maps = Fcdr (maps))
2c6f1a39 1569 {
e9b6dfb0
KH
1570 /* Key sequence to reach map, and the map that it reaches */
1571 register Lisp_Object this, map;
f5b79c1c
JB
1572
1573 /* If Fcar (map) is a VECTOR, the current element within that vector. */
1574 int i = 0;
2c6f1a39
JB
1575
1576 /* In order to fold [META-PREFIX-CHAR CHAR] sequences into
1577 [M-CHAR] sequences, check if last character of the sequence
1578 is the meta-prefix char. */
e9b6dfb0
KH
1579 Lisp_Object last;
1580 int last_is_meta;
1581
1582 this = Fcar (Fcar (maps));
1583 map = Fcdr (Fcar (maps));
1584 last = make_number (XINT (Flength (this)) - 1);
1585 last_is_meta = (XINT (last) >= 0
1586 && EQ (Faref (this, last), meta_prefix_char));
2c6f1a39 1587
fde3a52f
JB
1588 QUIT;
1589
f5b79c1c 1590 while (CONSP (map))
2c6f1a39 1591 {
f5b79c1c
JB
1592 /* Because the code we want to run on each binding is rather
1593 large, we don't want to have two separate loop bodies for
1594 sparse keymap bindings and tables; we want to iterate one
1595 loop body over both keymap and vector bindings.
1596
1597 For this reason, if Fcar (map) is a vector, we don't
1598 advance map to the next element until i indicates that we
1599 have finished off the vector. */
2c6f1a39 1600
e9b6dfb0
KH
1601 Lisp_Object elt, key, binding, sequence;
1602 elt = XCONS (map)->car;
f5b79c1c 1603
fde3a52f
JB
1604 QUIT;
1605
f5b79c1c
JB
1606 /* Set key and binding to the current key and binding, and
1607 advance map and i to the next binding. */
1608 if (XTYPE (elt) == Lisp_Vector)
2c6f1a39
JB
1609 {
1610 /* In a vector, look at each element. */
f5b79c1c 1611 binding = XVECTOR (elt)->contents[i];
2c6f1a39
JB
1612 XFASTINT (key) = i;
1613 i++;
1614
f5b79c1c
JB
1615 /* If we've just finished scanning a vector, advance map
1616 to the next element, and reset i in anticipation of the
1617 next vector we may find. */
db6f9d95 1618 if (i >= XVECTOR (elt)->size)
2c6f1a39 1619 {
f5b79c1c
JB
1620 map = XCONS (map)->cdr;
1621 i = 0;
2c6f1a39 1622 }
f5b79c1c
JB
1623 }
1624 else if (CONSP (elt))
1625 {
2c6f1a39 1626 key = Fcar (Fcar (map));
f5b79c1c
JB
1627 binding = Fcdr (Fcar (map));
1628
1629 map = XCONS (map)->cdr;
2c6f1a39
JB
1630 }
1631 else
f5b79c1c
JB
1632 /* We want to ignore keymap elements that are neither
1633 vectors nor conses. */
fde3a52f
JB
1634 {
1635 map = XCONS (map)->cdr;
1636 continue;
1637 }
2c6f1a39
JB
1638
1639 /* Search through indirections unless that's not wanted. */
265a9e55 1640 if (NILP (noindirect))
224a16e8 1641 binding = get_keyelt (binding, 0);
2c6f1a39
JB
1642
1643 /* End this iteration if this element does not match
1644 the target. */
1645
1646 if (XTYPE (definition) == Lisp_Cons)
1647 {
1648 Lisp_Object tem;
1649 tem = Fequal (binding, definition);
265a9e55 1650 if (NILP (tem))
2c6f1a39
JB
1651 continue;
1652 }
1653 else
1654 if (!EQ (binding, definition))
1655 continue;
1656
1657 /* We have found a match.
1658 Construct the key sequence where we found it. */
1659 if (XTYPE (key) == Lisp_Int && last_is_meta)
1660 {
1661 sequence = Fcopy_sequence (this);
0b8fc2d4 1662 Faset (sequence, last, make_number (XINT (key) | meta_modifier));
2c6f1a39
JB
1663 }
1664 else
1665 sequence = append_key (this, key);
1666
1667 /* Verify that this key binding is not shadowed by another
1668 binding for the same key, before we say it exists.
1669
1670 Mechanism: look for local definition of this key and if
1671 it is defined and does not match what we found then
1672 ignore this key.
1673
1674 Either nil or number as value from Flookup_key
1675 means undefined. */
f0148b5e 1676 if (keymap_specified)
2c6f1a39 1677 {
f0148b5e 1678 binding = Flookup_key (keymap, sequence, Qnil);
265a9e55 1679 if (!NILP (binding) && XTYPE (binding) != Lisp_Int)
2c6f1a39
JB
1680 {
1681 if (XTYPE (definition) == Lisp_Cons)
1682 {
1683 Lisp_Object tem;
1684 tem = Fequal (binding, definition);
265a9e55 1685 if (NILP (tem))
2c6f1a39
JB
1686 continue;
1687 }
1688 else
1689 if (!EQ (binding, definition))
1690 continue;
1691 }
1692 }
f0148b5e
RS
1693 else
1694 {
1695 binding = Fkey_binding (sequence, Qnil);
1696 if (!EQ (binding, definition))
1697 continue;
1698 }
2c6f1a39 1699
9fc722de
KH
1700 /* It is a true unshadowed match. Record it, unless it's already
1701 been seen (as could happen when inheriting keymaps). */
1702 if (NILP (Fmember (sequence, found)))
1703 found = Fcons (sequence, found);
2c6f1a39 1704
2fc66973
JB
1705 /* If firstonly is Qnon_ascii, then we can return the first
1706 binding we find. If firstonly is not Qnon_ascii but not
1707 nil, then we should return the first ascii-only binding
1708 we find. */
1709 if (EQ (firstonly, Qnon_ascii))
1710 return sequence;
1711 else if (! NILP (firstonly) && ascii_sequence_p (sequence))
2c6f1a39 1712 return sequence;
2c6f1a39
JB
1713 }
1714 }
2fc66973
JB
1715
1716 found = Fnreverse (found);
1717
1718 /* firstonly may have been t, but we may have gone all the way through
1719 the keymaps without finding an all-ASCII key sequence. So just
1720 return the best we could find. */
1721 if (! NILP (firstonly))
1722 return Fcar (found);
1723
1724 return found;
2c6f1a39 1725}
2c6f1a39 1726\f
cc0a8174
JB
1727/* describe-bindings - summarizing all the bindings in a set of keymaps. */
1728
53c8f9fa 1729DEFUN ("describe-bindings", Fdescribe_bindings, Sdescribe_bindings, 0, 1, "",
2c6f1a39 1730 "Show a list of all defined keys, and their definitions.\n\
53c8f9fa
RS
1731The list is put in a buffer, which is displayed.\n\
1732An optional argument PREFIX, if non-nil, should be a key sequence;\n\
1733then we display only bindings that start with that prefix.")
1734 (prefix)
1735 Lisp_Object prefix;
2c6f1a39
JB
1736{
1737 register Lisp_Object thisbuf;
1738 XSET (thisbuf, Lisp_Buffer, current_buffer);
1739 internal_with_output_to_temp_buffer ("*Help*",
1740 describe_buffer_bindings,
53c8f9fa 1741 Fcons (thisbuf, prefix));
2c6f1a39
JB
1742 return Qnil;
1743}
1744
53c8f9fa
RS
1745/* ARG is (BUFFER . PREFIX). */
1746
2c6f1a39 1747static Lisp_Object
53c8f9fa
RS
1748describe_buffer_bindings (arg)
1749 Lisp_Object arg;
2c6f1a39 1750{
53c8f9fa 1751 Lisp_Object descbuf, prefix, shadow;
d7ab90a9
KH
1752 register Lisp_Object start1;
1753 struct gcpro gcpro1;
2c6f1a39 1754
4726a9f1
JB
1755 char *alternate_heading
1756 = "\
1757Alternate Characters (use anywhere the nominal character is listed):\n\
1758nominal alternate\n\
1759------- ---------\n";
2c6f1a39 1760
53c8f9fa
RS
1761 descbuf = XCONS (arg)->car;
1762 prefix = XCONS (arg)->cdr;
a588e041 1763 shadow = Qnil;
d7ab90a9 1764 GCPRO1 (shadow);
53c8f9fa 1765
2c6f1a39
JB
1766 Fset_buffer (Vstandard_output);
1767
4726a9f1
JB
1768 /* Report on alternates for keys. */
1769 if (XTYPE (Vkeyboard_translate_table) == Lisp_String)
1770 {
1771 int c;
1772 unsigned char *translate = XSTRING (Vkeyboard_translate_table)->data;
1773 int translate_len = XSTRING (Vkeyboard_translate_table)->size;
1774
1775 for (c = 0; c < translate_len; c++)
1776 if (translate[c] != c)
1777 {
1778 char buf[20];
1779 char *bufend;
1780
1781 if (alternate_heading)
1782 {
1783 insert_string (alternate_heading);
1784 alternate_heading = 0;
1785 }
1786
1787 bufend = push_key_description (translate[c], buf);
1788 insert (buf, bufend - buf);
1789 Findent_to (make_number (16), make_number (1));
1790 bufend = push_key_description (c, buf);
1791 insert (buf, bufend - buf);
1792
1793 insert ("\n", 1);
1794 }
1795
1796 insert ("\n", 1);
1797 }
1798
cc0a8174
JB
1799 {
1800 int i, nmaps;
1801 Lisp_Object *modes, *maps;
1802
4726a9f1
JB
1803 /* Temporarily switch to descbuf, so that we can get that buffer's
1804 minor modes correctly. */
1805 Fset_buffer (descbuf);
7d92e329
RS
1806 if (!NILP (Voverriding_local_map))
1807 nmaps = 0;
1808 else
1809 nmaps = current_minor_maps (&modes, &maps);
4726a9f1
JB
1810 Fset_buffer (Vstandard_output);
1811
53c8f9fa 1812 /* Print the minor mode maps. */
cc0a8174
JB
1813 for (i = 0; i < nmaps; i++)
1814 {
c9b7c53a 1815 /* The title for a minor mode keymap
07f15dfd
RS
1816 is constructed at run time.
1817 We let describe_map_tree do the actual insertion
1818 because it takes care of other features when doing so. */
c9b7c53a 1819 char *title, *p;
07f15dfd 1820
d7ab90a9
KH
1821 if (XTYPE (modes[i]) != Lisp_Symbol)
1822 abort();
1823
1824 p = title = (char *) alloca (40 + XSYMBOL (modes[i])->name->size);
1825 *p++ = '`';
1826 bcopy (XSYMBOL (modes[i])->name->data, p,
1827 XSYMBOL (modes[i])->name->size);
1828 p += XSYMBOL (modes[i])->name->size;
1829 *p++ = '\'';
c9b7c53a
KH
1830 bcopy (" Minor Mode Bindings", p, sizeof (" Minor Mode Bindings") - 1);
1831 p += sizeof (" Minor Mode Bindings") - 1;
07f15dfd
RS
1832 *p = 0;
1833
af1d6f09 1834 describe_map_tree (maps[i], 0, shadow, prefix, title, 0);
53c8f9fa 1835 shadow = Fcons (maps[i], shadow);
cc0a8174
JB
1836 }
1837 }
1838
53c8f9fa 1839 /* Print the (major mode) local map. */
7d92e329
RS
1840 if (!NILP (Voverriding_local_map))
1841 start1 = Voverriding_local_map;
1842 else
1843 start1 = XBUFFER (descbuf)->keymap;
1844
265a9e55 1845 if (!NILP (start1))
2c6f1a39 1846 {
53c8f9fa 1847 describe_map_tree (start1, 0, shadow, prefix,
af1d6f09 1848 "Major Mode Bindings", 0);
53c8f9fa 1849 shadow = Fcons (start1, shadow);
2c6f1a39
JB
1850 }
1851
53c8f9fa 1852 describe_map_tree (current_global_map, 0, shadow, prefix,
af1d6f09 1853 "Global Bindings", 0);
2c6f1a39
JB
1854
1855 Fset_buffer (descbuf);
d7ab90a9 1856 UNGCPRO;
2c6f1a39
JB
1857 return Qnil;
1858}
1859
1860/* Insert a desription of the key bindings in STARTMAP,
1861 followed by those of all maps reachable through STARTMAP.
1862 If PARTIAL is nonzero, omit certain "uninteresting" commands
1863 (such as `undefined').
53c8f9fa
RS
1864 If SHADOW is non-nil, it is a list of maps;
1865 don't mention keys which would be shadowed by any of them.
1866 PREFIX, if non-nil, says mention only keys that start with PREFIX.
07f15dfd 1867 TITLE, if not 0, is a string to insert at the beginning.
af1d6f09
RS
1868 TITLE should not end with a colon or a newline; we supply that.
1869 If NOMENU is not 0, then omit menu-bar commands. */
2c6f1a39
JB
1870
1871void
af1d6f09 1872describe_map_tree (startmap, partial, shadow, prefix, title, nomenu)
53c8f9fa 1873 Lisp_Object startmap, shadow, prefix;
2c6f1a39 1874 int partial;
53c8f9fa 1875 char *title;
af1d6f09 1876 int nomenu;
2c6f1a39 1877{
e3dfcd4e
KH
1878 Lisp_Object maps, seen, sub_shadows;
1879 struct gcpro gcpro1, gcpro2, gcpro3;
07f15dfd 1880 int something = 0;
53c8f9fa
RS
1881 char *key_heading
1882 = "\
1883key binding\n\
1884--- -------\n";
2c6f1a39 1885
53c8f9fa 1886 maps = Faccessible_keymaps (startmap, prefix);
925083d1 1887 seen = Qnil;
e3dfcd4e
KH
1888 sub_shadows = Qnil;
1889 GCPRO3 (maps, seen, sub_shadows);
2c6f1a39 1890
af1d6f09
RS
1891 if (nomenu)
1892 {
1893 Lisp_Object list;
1894
1895 /* Delete from MAPS each element that is for the menu bar. */
1896 for (list = maps; !NILP (list); list = XCONS (list)->cdr)
1897 {
1898 Lisp_Object elt, prefix, tem;
1899
1900 elt = Fcar (list);
1901 prefix = Fcar (elt);
1902 if (XVECTOR (prefix)->size >= 1)
1903 {
1904 tem = Faref (prefix, make_number (0));
1905 if (EQ (tem, Qmenu_bar))
1906 maps = Fdelq (elt, maps);
1907 }
1908 }
1909 }
1910
53c8f9fa
RS
1911 if (!NILP (maps))
1912 {
1913 if (title)
07f15dfd
RS
1914 {
1915 insert_string (title);
1916 if (!NILP (prefix))
1917 {
1918 insert_string (" Starting With ");
1919 insert1 (Fkey_description (prefix));
1920 }
1921 insert_string (":\n");
1922 }
53c8f9fa 1923 insert_string (key_heading);
07f15dfd 1924 something = 1;
53c8f9fa
RS
1925 }
1926
265a9e55 1927 for (; !NILP (maps); maps = Fcdr (maps))
2c6f1a39 1928 {
e3dfcd4e 1929 register Lisp_Object elt, prefix, tail;
53c8f9fa 1930
2c6f1a39 1931 elt = Fcar (maps);
53c8f9fa
RS
1932 prefix = Fcar (elt);
1933
1934 sub_shadows = Qnil;
1935
1936 for (tail = shadow; CONSP (tail); tail = XCONS (tail)->cdr)
2c6f1a39 1937 {
53c8f9fa
RS
1938 Lisp_Object shmap;
1939
1940 shmap = XCONS (tail)->car;
1941
1942 /* If the sequence by which we reach this keymap is zero-length,
1943 then the shadow map for this keymap is just SHADOW. */
1944 if ((XTYPE (prefix) == Lisp_String
1945 && XSTRING (prefix)->size == 0)
1946 || (XTYPE (prefix) == Lisp_Vector
1947 && XVECTOR (prefix)->size == 0))
1948 ;
1949 /* If the sequence by which we reach this keymap actually has
1950 some elements, then the sequence's definition in SHADOW is
1951 what we should use. */
1952 else
1953 {
98234407 1954 shmap = Flookup_key (shmap, Fcar (elt), Qt);
53c8f9fa
RS
1955 if (XTYPE (shmap) == Lisp_Int)
1956 shmap = Qnil;
1957 }
1958
1959 /* If shmap is not nil and not a keymap,
1960 it completely shadows this map, so don't
1961 describe this map at all. */
1962 if (!NILP (shmap) && NILP (Fkeymapp (shmap)))
1963 goto skip;
1964
1965 if (!NILP (shmap))
1966 sub_shadows = Fcons (shmap, sub_shadows);
2c6f1a39
JB
1967 }
1968
925083d1
KH
1969 describe_map (Fcdr (elt), Fcar (elt), describe_command,
1970 partial, sub_shadows, &seen);
53c8f9fa
RS
1971
1972 skip: ;
2c6f1a39
JB
1973 }
1974
07f15dfd
RS
1975 if (something)
1976 insert_string ("\n");
1977
2c6f1a39
JB
1978 UNGCPRO;
1979}
1980
1981static void
1982describe_command (definition)
1983 Lisp_Object definition;
1984{
1985 register Lisp_Object tem1;
1986
1987 Findent_to (make_number (16), make_number (1));
1988
1989 if (XTYPE (definition) == Lisp_Symbol)
1990 {
1991 XSET (tem1, Lisp_String, XSYMBOL (definition)->name);
1992 insert1 (tem1);
1993 insert_string ("\n");
1994 }
24065b9c
RS
1995 else if (STRINGP (definition))
1996 insert_string ("Keyboard Macro\n");
2c6f1a39
JB
1997 else
1998 {
1999 tem1 = Fkeymapp (definition);
265a9e55 2000 if (!NILP (tem1))
2c6f1a39
JB
2001 insert_string ("Prefix Command\n");
2002 else
2003 insert_string ("??\n");
2004 }
2005}
2006
53c8f9fa
RS
2007/* Like Flookup_key, but uses a list of keymaps SHADOW instead of a single map.
2008 Returns the first non-nil binding found in any of those maps. */
2009
2010static Lisp_Object
2011shadow_lookup (shadow, key, flag)
2012 Lisp_Object shadow, key, flag;
2013{
2014 Lisp_Object tail, value;
2015
2016 for (tail = shadow; CONSP (tail); tail = XCONS (tail)->cdr)
2017 {
2018 value = Flookup_key (XCONS (tail)->car, key, flag);
2019 if (!NILP (value))
2020 return value;
2021 }
2022 return Qnil;
2023}
2024
c3c0ee93
KH
2025/* Describe the contents of map MAP, assuming that this map itself is
2026 reached by the sequence of prefix keys KEYS (a string or vector).
925083d1 2027 PARTIAL, SHADOW are as in `describe_map_tree' above. */
2c6f1a39
JB
2028
2029static void
925083d1 2030describe_map (map, keys, elt_describer, partial, shadow, seen)
c3c0ee93
KH
2031 register Lisp_Object map;
2032 Lisp_Object keys;
2c6f1a39
JB
2033 int (*elt_describer) ();
2034 int partial;
2035 Lisp_Object shadow;
925083d1 2036 Lisp_Object *seen;
2c6f1a39 2037{
c3c0ee93 2038 Lisp_Object elt_prefix;
53c8f9fa 2039 Lisp_Object tail, definition, event;
99a225a9 2040 Lisp_Object tem;
2c6f1a39
JB
2041 Lisp_Object suppress;
2042 Lisp_Object kludge;
2043 int first = 1;
2044 struct gcpro gcpro1, gcpro2, gcpro3;
2045
c3c0ee93
KH
2046 if (!NILP (keys) && XFASTINT (Flength (keys)) > 0)
2047 {
c3c0ee93
KH
2048 /* Call Fkey_description first, to avoid GC bug for the other string. */
2049 tem = Fkey_description (keys);
2050 elt_prefix = concat2 (tem, build_string (" "));
2051 }
2052 else
2053 elt_prefix = Qnil;
2054
2c6f1a39
JB
2055 if (partial)
2056 suppress = intern ("suppress-keymap");
2057
2058 /* This vector gets used to present single keys to Flookup_key. Since
f5b79c1c 2059 that is done once per keymap element, we don't want to cons up a
2c6f1a39
JB
2060 fresh vector every time. */
2061 kludge = Fmake_vector (make_number (1), Qnil);
99a225a9 2062 definition = Qnil;
2c6f1a39 2063
99a225a9 2064 GCPRO3 (elt_prefix, definition, kludge);
2c6f1a39 2065
925083d1 2066 for (tail = map; CONSP (tail); tail = XCONS (tail)->cdr)
2c6f1a39
JB
2067 {
2068 QUIT;
2c6f1a39 2069
53c8f9fa
RS
2070 if (XTYPE (XCONS (tail)->car) == Lisp_Vector)
2071 describe_vector (XCONS (tail)->car,
f5b79c1c 2072 elt_prefix, elt_describer, partial, shadow);
925083d1 2073 else if (CONSP (XCONS (tail)->car))
2c6f1a39 2074 {
925083d1 2075 event = XCONS (XCONS (tail)->car)->car;
2c3b35b0
RS
2076
2077 /* Ignore bindings whose "keys" are not really valid events.
2078 (We get these in the frames and buffers menu.) */
2079 if (! (SYMBOLP (event) || INTEGERP (event)))
c96dcc01 2080 continue;
2c3b35b0 2081
925083d1 2082 definition = get_keyelt (XCONS (XCONS (tail)->car)->cdr, 0);
2c6f1a39 2083
f5b79c1c 2084 /* Don't show undefined commands or suppressed commands. */
99a225a9
RS
2085 if (NILP (definition)) continue;
2086 if (XTYPE (definition) == Lisp_Symbol && partial)
f5b79c1c 2087 {
99a225a9
RS
2088 tem = Fget (definition, suppress);
2089 if (!NILP (tem))
f5b79c1c
JB
2090 continue;
2091 }
2c6f1a39 2092
f5b79c1c
JB
2093 /* Don't show a command that isn't really visible
2094 because a local definition of the same key shadows it. */
2c6f1a39 2095
99a225a9 2096 XVECTOR (kludge)->contents[0] = event;
f5b79c1c
JB
2097 if (!NILP (shadow))
2098 {
53c8f9fa 2099 tem = shadow_lookup (shadow, kludge, Qt);
f5b79c1c
JB
2100 if (!NILP (tem)) continue;
2101 }
2102
c3c0ee93 2103 tem = Flookup_key (map, kludge, Qt);
99a225a9
RS
2104 if (! EQ (tem, definition)) continue;
2105
f5b79c1c
JB
2106 if (first)
2107 {
2108 insert ("\n", 1);
2109 first = 0;
2110 }
2c6f1a39 2111
f5b79c1c
JB
2112 if (!NILP (elt_prefix))
2113 insert1 (elt_prefix);
2c6f1a39 2114
99a225a9
RS
2115 /* THIS gets the string to describe the character EVENT. */
2116 insert1 (Fsingle_key_description (event));
2c6f1a39 2117
f5b79c1c
JB
2118 /* Print a description of the definition of this character.
2119 elt_describer will take care of spacing out far enough
2120 for alignment purposes. */
99a225a9 2121 (*elt_describer) (definition);
f5b79c1c 2122 }
925083d1
KH
2123 else if (EQ (XCONS (tail)->car, Qkeymap))
2124 {
2125 /* The same keymap might be in the structure twice, if we're
2126 using an inherited keymap. So skip anything we've already
2127 encountered. */
2128 tem = Fassq (tail, *seen);
2129 if (CONSP (tem) && Fequal (XCONS (tem)->car, keys))
2130 break;
2131 *seen = Fcons (Fcons (tail, keys), *seen);
2132 }
2c6f1a39
JB
2133 }
2134
2135 UNGCPRO;
2136}
2137
2138static int
2139describe_vector_princ (elt)
2140 Lisp_Object elt;
2141{
81fa9e2f 2142 Findent_to (make_number (16), make_number (1));
2c6f1a39 2143 Fprinc (elt, Qnil);
ad4ec84a 2144 Fterpri (Qnil);
2c6f1a39
JB
2145}
2146
2147DEFUN ("describe-vector", Fdescribe_vector, Sdescribe_vector, 1, 1, 0,
ad4ec84a 2148 "Insert a description of contents of VECTOR.\n\
2c6f1a39
JB
2149This is text showing the elements of vector matched against indices.")
2150 (vector)
2151 Lisp_Object vector;
2152{
ad4ec84a
RS
2153 int count = specpdl_ptr - specpdl;
2154
2155 specbind (Qstandard_output, Fcurrent_buffer ());
2c6f1a39 2156 CHECK_VECTOR (vector, 0);
92cc37e8 2157 describe_vector (vector, Qnil, describe_vector_princ, 0, Qnil);
ad4ec84a
RS
2158
2159 return unbind_to (count, Qnil);
2c6f1a39
JB
2160}
2161
2162describe_vector (vector, elt_prefix, elt_describer, partial, shadow)
2163 register Lisp_Object vector;
2164 Lisp_Object elt_prefix;
2165 int (*elt_describer) ();
2166 int partial;
2167 Lisp_Object shadow;
2168{
2169 Lisp_Object this;
2170 Lisp_Object dummy;
2171 Lisp_Object tem1, tem2;
2172 register int i;
2173 Lisp_Object suppress;
2174 Lisp_Object kludge;
2175 int first = 1;
2176 struct gcpro gcpro1, gcpro2, gcpro3;
2177
2178 tem1 = Qnil;
2179
2180 /* This vector gets used to present single keys to Flookup_key. Since
2181 that is done once per vector element, we don't want to cons up a
2182 fresh vector every time. */
2183 kludge = Fmake_vector (make_number (1), Qnil);
2184 GCPRO3 (elt_prefix, tem1, kludge);
2185
2186 if (partial)
2187 suppress = intern ("suppress-keymap");
2188
db6f9d95 2189 for (i = 0; i < XVECTOR (vector)->size; i++)
2c6f1a39
JB
2190 {
2191 QUIT;
224a16e8 2192 tem1 = get_keyelt (XVECTOR (vector)->contents[i], 0);
2c6f1a39 2193
265a9e55 2194 if (NILP (tem1)) continue;
2c6f1a39
JB
2195
2196 /* Don't mention suppressed commands. */
2197 if (XTYPE (tem1) == Lisp_Symbol && partial)
2198 {
2199 this = Fget (tem1, suppress);
265a9e55 2200 if (!NILP (this))
2c6f1a39
JB
2201 continue;
2202 }
2203
2204 /* If this command in this map is shadowed by some other map,
2205 ignore it. */
265a9e55 2206 if (!NILP (shadow))
2c6f1a39
JB
2207 {
2208 Lisp_Object tem;
2209
2210 XVECTOR (kludge)->contents[0] = make_number (i);
53c8f9fa 2211 tem = shadow_lookup (shadow, kludge, Qt);
2c6f1a39 2212
265a9e55 2213 if (!NILP (tem)) continue;
2c6f1a39
JB
2214 }
2215
2216 if (first)
2217 {
2218 insert ("\n", 1);
2219 first = 0;
2220 }
2221
2222 /* Output the prefix that applies to every entry in this map. */
265a9e55 2223 if (!NILP (elt_prefix))
2c6f1a39
JB
2224 insert1 (elt_prefix);
2225
2226 /* Get the string to describe the character I, and print it. */
2227 XFASTINT (dummy) = i;
2228
2229 /* THIS gets the string to describe the character DUMMY. */
2230 this = Fsingle_key_description (dummy);
2231 insert1 (this);
2232
2233 /* Find all consecutive characters that have the same definition. */
db6f9d95 2234 while (i + 1 < XVECTOR (vector)->size
224a16e8 2235 && (tem2 = get_keyelt (XVECTOR (vector)->contents[i+1], 0),
2c6f1a39
JB
2236 EQ (tem2, tem1)))
2237 i++;
2238
2239 /* If we have a range of more than one character,
2240 print where the range reaches to. */
2241
2242 if (i != XINT (dummy))
2243 {
2244 insert (" .. ", 4);
265a9e55 2245 if (!NILP (elt_prefix))
2c6f1a39
JB
2246 insert1 (elt_prefix);
2247
2248 XFASTINT (dummy) = i;
2249 insert1 (Fsingle_key_description (dummy));
2250 }
2251
2252 /* Print a description of the definition of this character.
2253 elt_describer will take care of spacing out far enough
2254 for alignment purposes. */
2255 (*elt_describer) (tem1);
2256 }
2257
2258 UNGCPRO;
2259}
2260\f
cc0a8174 2261/* Apropos - finding all symbols whose names match a regexp. */
2c6f1a39
JB
2262Lisp_Object apropos_predicate;
2263Lisp_Object apropos_accumulate;
2264
2265static void
2266apropos_accum (symbol, string)
2267 Lisp_Object symbol, string;
2268{
2269 register Lisp_Object tem;
2270
2271 tem = Fstring_match (string, Fsymbol_name (symbol), Qnil);
265a9e55 2272 if (!NILP (tem) && !NILP (apropos_predicate))
2c6f1a39 2273 tem = call1 (apropos_predicate, symbol);
265a9e55 2274 if (!NILP (tem))
2c6f1a39
JB
2275 apropos_accumulate = Fcons (symbol, apropos_accumulate);
2276}
2277
2278DEFUN ("apropos-internal", Fapropos_internal, Sapropos_internal, 1, 2, 0,
2279 "Show all symbols whose names contain match for REGEXP.\n\
2280If optional 2nd arg PRED is non-nil, (funcall PRED SYM) is done\n\
2281for each symbol and a symbol is mentioned only if that returns non-nil.\n\
2282Return list of symbols found.")
2283 (string, pred)
2284 Lisp_Object string, pred;
2285{
2286 struct gcpro gcpro1, gcpro2;
2287 CHECK_STRING (string, 0);
2288 apropos_predicate = pred;
2289 GCPRO2 (apropos_predicate, apropos_accumulate);
2290 apropos_accumulate = Qnil;
2291 map_obarray (Vobarray, apropos_accum, string);
2292 apropos_accumulate = Fsort (apropos_accumulate, Qstring_lessp);
2293 UNGCPRO;
2294 return apropos_accumulate;
2295}
2296\f
2297syms_of_keymap ()
2298{
2299 Lisp_Object tem;
2300
2301 Qkeymap = intern ("keymap");
2302 staticpro (&Qkeymap);
2303
2304/* Initialize the keymaps standardly used.
2305 Each one is the value of a Lisp variable, and is also
2306 pointed to by a C variable */
2307
19eaeb86 2308 global_map = Fcons (Qkeymap,
1447c534 2309 Fcons (Fmake_vector (make_number (0400), Qnil), Qnil));
2c6f1a39
JB
2310 Fset (intern ("global-map"), global_map);
2311
ce6e5d0b 2312 meta_map = Fmake_keymap (Qnil);
2c6f1a39
JB
2313 Fset (intern ("esc-map"), meta_map);
2314 Ffset (intern ("ESC-prefix"), meta_map);
2315
ce6e5d0b 2316 control_x_map = Fmake_keymap (Qnil);
2c6f1a39
JB
2317 Fset (intern ("ctl-x-map"), control_x_map);
2318 Ffset (intern ("Control-X-prefix"), control_x_map);
2319
2320 DEFVAR_LISP ("minibuffer-local-map", &Vminibuffer_local_map,
2321 "Default keymap to use when reading from the minibuffer.");
ce6e5d0b 2322 Vminibuffer_local_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
2323
2324 DEFVAR_LISP ("minibuffer-local-ns-map", &Vminibuffer_local_ns_map,
2325 "Local keymap for the minibuffer when spaces are not allowed.");
ce6e5d0b 2326 Vminibuffer_local_ns_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
2327
2328 DEFVAR_LISP ("minibuffer-local-completion-map", &Vminibuffer_local_completion_map,
2329 "Local keymap for minibuffer input with completion.");
ce6e5d0b 2330 Vminibuffer_local_completion_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
2331
2332 DEFVAR_LISP ("minibuffer-local-must-match-map", &Vminibuffer_local_must_match_map,
2333 "Local keymap for minibuffer input with completion, for exact match.");
ce6e5d0b 2334 Vminibuffer_local_must_match_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
2335
2336 current_global_map = global_map;
2337
cc0a8174
JB
2338 DEFVAR_LISP ("minor-mode-map-alist", &Vminor_mode_map_alist,
2339 "Alist of keymaps to use for minor modes.\n\
2340Each element looks like (VARIABLE . KEYMAP); KEYMAP is used to read\n\
2341key sequences and look up bindings iff VARIABLE's value is non-nil.\n\
2342If two active keymaps bind the same key, the keymap appearing earlier\n\
2343in the list takes precedence.");
2344 Vminor_mode_map_alist = Qnil;
2345
6bbbd9b0
JB
2346 DEFVAR_LISP ("function-key-map", &Vfunction_key_map,
2347 "Keymap mapping ASCII function key sequences onto their preferred forms.\n\
2348This allows Emacs to recognize function keys sent from ASCII\n\
2349terminals at any point in a key sequence.\n\
2350\n\
2351The read-key-sequence function replaces subsequences bound by\n\
2352function-key-map with their bindings. When the current local and global\n\
2353keymaps have no binding for the current key sequence but\n\
718ca51e 2354function-key-map binds a suffix of the sequence to a vector or string,\n\
6bbbd9b0
JB
2355read-key-sequence replaces the matching suffix with its binding, and\n\
2356continues with the new sequence.\n\
2357\n\
718ca51e
JB
2358For example, suppose function-key-map binds `ESC O P' to [f1].\n\
2359Typing `ESC O P' to read-key-sequence would return [f1]. Typing\n\
2360`C-x ESC O P' would return [?\\C-x f1]. If [f1] were a prefix\n\
2361key, typing `ESC O P x' would return [f1 x].");
ce6e5d0b 2362 Vfunction_key_map = Fmake_sparse_keymap (Qnil);
6bbbd9b0 2363
2c6f1a39
JB
2364 Qsingle_key_description = intern ("single-key-description");
2365 staticpro (&Qsingle_key_description);
2366
2367 Qkey_description = intern ("key-description");
2368 staticpro (&Qkey_description);
2369
2370 Qkeymapp = intern ("keymapp");
2371 staticpro (&Qkeymapp);
2372
2fc66973
JB
2373 Qnon_ascii = intern ("non-ascii");
2374 staticpro (&Qnon_ascii);
2375
2c6f1a39
JB
2376 defsubr (&Skeymapp);
2377 defsubr (&Smake_keymap);
2378 defsubr (&Smake_sparse_keymap);
2379 defsubr (&Scopy_keymap);
2380 defsubr (&Skey_binding);
2381 defsubr (&Slocal_key_binding);
2382 defsubr (&Sglobal_key_binding);
cc0a8174 2383 defsubr (&Sminor_mode_key_binding);
2c6f1a39
JB
2384 defsubr (&Sglobal_set_key);
2385 defsubr (&Slocal_set_key);
2386 defsubr (&Sdefine_key);
2387 defsubr (&Slookup_key);
2388 defsubr (&Sglobal_unset_key);
2389 defsubr (&Slocal_unset_key);
2390 defsubr (&Sdefine_prefix_command);
2391 defsubr (&Suse_global_map);
2392 defsubr (&Suse_local_map);
2393 defsubr (&Scurrent_local_map);
2394 defsubr (&Scurrent_global_map);
cc0a8174 2395 defsubr (&Scurrent_minor_mode_maps);
2c6f1a39
JB
2396 defsubr (&Saccessible_keymaps);
2397 defsubr (&Skey_description);
2398 defsubr (&Sdescribe_vector);
2399 defsubr (&Ssingle_key_description);
2400 defsubr (&Stext_char_description);
2401 defsubr (&Swhere_is_internal);
2c6f1a39
JB
2402 defsubr (&Sdescribe_bindings);
2403 defsubr (&Sapropos_internal);
2404}
2405
2406keys_of_keymap ()
2407{
2408 Lisp_Object tem;
2409
2410 initial_define_key (global_map, 033, "ESC-prefix");
2411 initial_define_key (global_map, Ctl('X'), "Control-X-prefix");
2412}