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