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