(default-menubar): Make initial value nil.
[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
2fc66973 76Lisp_Object Qkeymapp, Qkeymap, Qnon_ascii;
2c6f1a39
JB
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,
cd8520b9 916 "Define COMMAND as a prefix command. COMMAND should be a symbol.\n\
2c6f1a39 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}
2fc66973
JB
1314
1315/* Return non-zero if SEQ contains only ASCII characters, perhaps with
1316 a meta bit. */
1317static int
1318ascii_sequence_p (seq)
1319 Lisp_Object seq;
1320{
1321 Lisp_Object i;
1322 int len = XINT (Flength (seq));
1323
1324 for (XFASTINT (i) = 0; XFASTINT (i) < len; XFASTINT (i)++)
1325 {
1326 Lisp_Object elt = Faref (seq, i);
1327
1328 if (XTYPE (elt) != Lisp_Int
1329 || (XUINT (elt) & ~CHAR_META) >= 0x80)
1330 return 0;
1331 }
1332
1333 return 1;
1334}
1335
2c6f1a39 1336\f
cc0a8174
JB
1337/* where-is - finding a command in a set of keymaps. */
1338
2c6f1a39
JB
1339DEFUN ("where-is-internal", Fwhere_is_internal, Swhere_is_internal, 1, 5, 0,
1340 "Return list of keys that invoke DEFINITION in KEYMAP or KEYMAP1.\n\
1341If KEYMAP is nil, search only KEYMAP1.\n\
1342If KEYMAP1 is nil, use the current global map.\n\
1343\n\
2fc66973
JB
1344If optional 4th arg FIRSTONLY is non-nil, return a string representing\n\
1345the first key sequence found, rather than a list of all possible key\n\
1346sequences. If FIRSTONLY is t, avoid key sequences which use non-ASCII\n\
1347keys and therefore may not be usable on ASCII terminals. If FIRSTONLY\n\
1348is the symbol `non-ascii', return the first binding found, no matter\n\
1349what its components.\n\
2c6f1a39
JB
1350\n\
1351If optional 5th arg NOINDIRECT is non-nil, don't follow indirections\n\
1352to other keymaps or slots. This makes it possible to search for an\n\
1353indirect definition itself.")
1354 (definition, local_keymap, global_keymap, firstonly, noindirect)
1355 Lisp_Object definition, local_keymap, global_keymap;
1356 Lisp_Object firstonly, noindirect;
1357{
1358 register Lisp_Object maps;
1359 Lisp_Object found;
1360
265a9e55 1361 if (NILP (global_keymap))
2c6f1a39
JB
1362 global_keymap = current_global_map;
1363
265a9e55 1364 if (!NILP (local_keymap))
2c6f1a39
JB
1365 maps = nconc2 (Faccessible_keymaps (get_keymap (local_keymap)),
1366 Faccessible_keymaps (get_keymap (global_keymap)));
1367 else
1368 maps = Faccessible_keymaps (get_keymap (global_keymap));
1369
1370 found = Qnil;
1371
265a9e55 1372 for (; !NILP (maps); maps = Fcdr (maps))
2c6f1a39 1373 {
f5b79c1c
JB
1374 /* Key sequence to reach map */
1375 register Lisp_Object this = Fcar (Fcar (maps));
1376
1377 /* The map that it reaches */
1378 register Lisp_Object map = Fcdr (Fcar (maps));
1379
1380 /* If Fcar (map) is a VECTOR, the current element within that vector. */
1381 int i = 0;
2c6f1a39
JB
1382
1383 /* In order to fold [META-PREFIX-CHAR CHAR] sequences into
1384 [M-CHAR] sequences, check if last character of the sequence
1385 is the meta-prefix char. */
1386 Lisp_Object last = make_number (XINT (Flength (this)) - 1);
1387 int last_is_meta = (XINT (last) >= 0
1388 && EQ (Faref (this, last), meta_prefix_char));
2c6f1a39 1389
fde3a52f
JB
1390 QUIT;
1391
f5b79c1c 1392 while (CONSP (map))
2c6f1a39 1393 {
f5b79c1c
JB
1394 /* Because the code we want to run on each binding is rather
1395 large, we don't want to have two separate loop bodies for
1396 sparse keymap bindings and tables; we want to iterate one
1397 loop body over both keymap and vector bindings.
1398
1399 For this reason, if Fcar (map) is a vector, we don't
1400 advance map to the next element until i indicates that we
1401 have finished off the vector. */
2c6f1a39 1402
f5b79c1c
JB
1403 Lisp_Object elt = XCONS (map)->car;
1404 Lisp_Object key, binding, sequence;
1405
fde3a52f
JB
1406 QUIT;
1407
f5b79c1c
JB
1408 /* Set key and binding to the current key and binding, and
1409 advance map and i to the next binding. */
1410 if (XTYPE (elt) == Lisp_Vector)
2c6f1a39
JB
1411 {
1412 /* In a vector, look at each element. */
f5b79c1c 1413 binding = XVECTOR (elt)->contents[i];
2c6f1a39
JB
1414 XFASTINT (key) = i;
1415 i++;
1416
f5b79c1c
JB
1417 /* If we've just finished scanning a vector, advance map
1418 to the next element, and reset i in anticipation of the
1419 next vector we may find. */
2c6f1a39 1420 if (i >= DENSE_TABLE_SIZE)
2c6f1a39 1421 {
f5b79c1c
JB
1422 map = XCONS (map)->cdr;
1423 i = 0;
2c6f1a39 1424 }
f5b79c1c
JB
1425 }
1426 else if (CONSP (elt))
1427 {
2c6f1a39 1428 key = Fcar (Fcar (map));
f5b79c1c
JB
1429 binding = Fcdr (Fcar (map));
1430
1431 map = XCONS (map)->cdr;
2c6f1a39
JB
1432 }
1433 else
f5b79c1c
JB
1434 /* We want to ignore keymap elements that are neither
1435 vectors nor conses. */
fde3a52f
JB
1436 {
1437 map = XCONS (map)->cdr;
1438 continue;
1439 }
2c6f1a39
JB
1440
1441 /* Search through indirections unless that's not wanted. */
265a9e55 1442 if (NILP (noindirect))
2c6f1a39
JB
1443 binding = get_keyelt (binding);
1444
1445 /* End this iteration if this element does not match
1446 the target. */
1447
1448 if (XTYPE (definition) == Lisp_Cons)
1449 {
1450 Lisp_Object tem;
1451 tem = Fequal (binding, definition);
265a9e55 1452 if (NILP (tem))
2c6f1a39
JB
1453 continue;
1454 }
1455 else
1456 if (!EQ (binding, definition))
1457 continue;
1458
1459 /* We have found a match.
1460 Construct the key sequence where we found it. */
1461 if (XTYPE (key) == Lisp_Int && last_is_meta)
1462 {
1463 sequence = Fcopy_sequence (this);
0b8fc2d4 1464 Faset (sequence, last, make_number (XINT (key) | meta_modifier));
2c6f1a39
JB
1465 }
1466 else
1467 sequence = append_key (this, key);
1468
1469 /* Verify that this key binding is not shadowed by another
1470 binding for the same key, before we say it exists.
1471
1472 Mechanism: look for local definition of this key and if
1473 it is defined and does not match what we found then
1474 ignore this key.
1475
1476 Either nil or number as value from Flookup_key
1477 means undefined. */
265a9e55 1478 if (!NILP (local_keymap))
2c6f1a39 1479 {
7c140252 1480 binding = Flookup_key (local_keymap, sequence, Qnil);
265a9e55 1481 if (!NILP (binding) && XTYPE (binding) != Lisp_Int)
2c6f1a39
JB
1482 {
1483 if (XTYPE (definition) == Lisp_Cons)
1484 {
1485 Lisp_Object tem;
1486 tem = Fequal (binding, definition);
265a9e55 1487 if (NILP (tem))
2c6f1a39
JB
1488 continue;
1489 }
1490 else
1491 if (!EQ (binding, definition))
1492 continue;
1493 }
1494 }
1495
1496 /* It is a true unshadowed match. Record it. */
2fc66973 1497 found = Fcons (sequence, found);
2c6f1a39 1498
2fc66973
JB
1499 /* If firstonly is Qnon_ascii, then we can return the first
1500 binding we find. If firstonly is not Qnon_ascii but not
1501 nil, then we should return the first ascii-only binding
1502 we find. */
1503 if (EQ (firstonly, Qnon_ascii))
1504 return sequence;
1505 else if (! NILP (firstonly) && ascii_sequence_p (sequence))
2c6f1a39 1506 return sequence;
2c6f1a39
JB
1507 }
1508 }
2fc66973
JB
1509
1510 found = Fnreverse (found);
1511
1512 /* firstonly may have been t, but we may have gone all the way through
1513 the keymaps without finding an all-ASCII key sequence. So just
1514 return the best we could find. */
1515 if (! NILP (firstonly))
1516 return Fcar (found);
1517
1518 return found;
2c6f1a39
JB
1519}
1520
1521/* Return a string listing the keys and buttons that run DEFINITION. */
1522
1523static Lisp_Object
1524where_is_string (definition)
1525 Lisp_Object definition;
1526{
1527 register Lisp_Object keys, keys1;
1528
1529 keys = Fwhere_is_internal (definition,
1530 current_buffer->keymap, Qnil, Qnil, Qnil);
1531 keys1 = Fmapconcat (Qkey_description, keys, build_string (", "));
1532
1533 return keys1;
1534}
1535
1536DEFUN ("where-is", Fwhere_is, Swhere_is, 1, 1, "CWhere is command: ",
1537 "Print message listing key sequences that invoke specified command.\n\
1538Argument is a command definition, usually a symbol with a function definition.")
1539 (definition)
1540 Lisp_Object definition;
1541{
1542 register Lisp_Object string;
1543
1544 CHECK_SYMBOL (definition, 0);
1545 string = where_is_string (definition);
1546
1547 if (XSTRING (string)->size)
1548 message ("%s is on %s", XSYMBOL (definition)->name->data,
1549 XSTRING (string)->data);
1550 else
1551 message ("%s is not on any key", XSYMBOL (definition)->name->data);
1552 return Qnil;
1553}
1554\f
cc0a8174
JB
1555/* describe-bindings - summarizing all the bindings in a set of keymaps. */
1556
2c6f1a39
JB
1557DEFUN ("describe-bindings", Fdescribe_bindings, Sdescribe_bindings, 0, 0, "",
1558 "Show a list of all defined keys, and their definitions.\n\
1559The list is put in a buffer, which is displayed.")
1560 ()
1561{
1562 register Lisp_Object thisbuf;
1563 XSET (thisbuf, Lisp_Buffer, current_buffer);
1564 internal_with_output_to_temp_buffer ("*Help*",
1565 describe_buffer_bindings,
1566 thisbuf);
1567 return Qnil;
1568}
1569
1570static Lisp_Object
1571describe_buffer_bindings (descbuf)
1572 Lisp_Object descbuf;
1573{
1574 register Lisp_Object start1, start2;
1575
4726a9f1
JB
1576 char *key_heading
1577 = "\
1578key binding\n\
1579--- -------\n";
1580 char *alternate_heading
1581 = "\
1582Alternate Characters (use anywhere the nominal character is listed):\n\
1583nominal alternate\n\
1584------- ---------\n";
2c6f1a39
JB
1585
1586 Fset_buffer (Vstandard_output);
1587
4726a9f1
JB
1588 /* Report on alternates for keys. */
1589 if (XTYPE (Vkeyboard_translate_table) == Lisp_String)
1590 {
1591 int c;
1592 unsigned char *translate = XSTRING (Vkeyboard_translate_table)->data;
1593 int translate_len = XSTRING (Vkeyboard_translate_table)->size;
1594
1595 for (c = 0; c < translate_len; c++)
1596 if (translate[c] != c)
1597 {
1598 char buf[20];
1599 char *bufend;
1600
1601 if (alternate_heading)
1602 {
1603 insert_string (alternate_heading);
1604 alternate_heading = 0;
1605 }
1606
1607 bufend = push_key_description (translate[c], buf);
1608 insert (buf, bufend - buf);
1609 Findent_to (make_number (16), make_number (1));
1610 bufend = push_key_description (c, buf);
1611 insert (buf, bufend - buf);
1612
1613 insert ("\n", 1);
1614 }
1615
1616 insert ("\n", 1);
1617 }
1618
cc0a8174
JB
1619 {
1620 int i, nmaps;
1621 Lisp_Object *modes, *maps;
1622
4726a9f1
JB
1623 /* Temporarily switch to descbuf, so that we can get that buffer's
1624 minor modes correctly. */
1625 Fset_buffer (descbuf);
cc0a8174 1626 nmaps = current_minor_maps (&modes, &maps);
4726a9f1
JB
1627 Fset_buffer (Vstandard_output);
1628
cc0a8174
JB
1629 for (i = 0; i < nmaps; i++)
1630 {
1631 if (XTYPE (modes[i]) == Lisp_Symbol)
1632 {
1633 insert_char ('`');
1634 insert_string (XSYMBOL (modes[i])->name->data);
1635 insert_char ('\'');
1636 }
1637 else
1638 insert_string ("Strangely Named");
1639 insert_string (" Minor Mode Bindings:\n");
4726a9f1 1640 insert_string (key_heading);
cc0a8174
JB
1641 describe_map_tree (maps[i], 0, Qnil);
1642 insert_char ('\n');
1643 }
1644 }
1645
2c6f1a39 1646 start1 = XBUFFER (descbuf)->keymap;
265a9e55 1647 if (!NILP (start1))
2c6f1a39
JB
1648 {
1649 insert_string ("Local Bindings:\n");
4726a9f1 1650 insert_string (key_heading);
cc0a8174 1651 describe_map_tree (start1, 0, Qnil);
2c6f1a39
JB
1652 insert_string ("\n");
1653 }
1654
1655 insert_string ("Global Bindings:\n");
4726a9f1
JB
1656 if (NILP (start1))
1657 insert_string (key_heading);
2c6f1a39 1658
cc0a8174 1659 describe_map_tree (current_global_map, 0, XBUFFER (descbuf)->keymap);
2c6f1a39
JB
1660
1661 Fset_buffer (descbuf);
1662 return Qnil;
1663}
1664
1665/* Insert a desription of the key bindings in STARTMAP,
1666 followed by those of all maps reachable through STARTMAP.
1667 If PARTIAL is nonzero, omit certain "uninteresting" commands
1668 (such as `undefined').
1669 If SHADOW is non-nil, it is another map;
1670 don't mention keys which would be shadowed by it. */
1671
1672void
1673describe_map_tree (startmap, partial, shadow)
1674 Lisp_Object startmap, shadow;
1675 int partial;
1676{
1677 register Lisp_Object elt, sh;
1678 Lisp_Object maps;
1679 struct gcpro gcpro1;
1680
1681 maps = Faccessible_keymaps (startmap);
1682 GCPRO1 (maps);
1683
265a9e55 1684 for (; !NILP (maps); maps = Fcdr (maps))
2c6f1a39
JB
1685 {
1686 elt = Fcar (maps);
1687 sh = Fcar (elt);
1688
1689 /* If there is no shadow keymap given, don't shadow. */
265a9e55 1690 if (NILP (shadow))
2c6f1a39
JB
1691 sh = Qnil;
1692
1693 /* If the sequence by which we reach this keymap is zero-length,
1694 then the shadow map for this keymap is just SHADOW. */
1695 else if ((XTYPE (sh) == Lisp_String
1696 && XSTRING (sh)->size == 0)
1697 || (XTYPE (sh) == Lisp_Vector
1698 && XVECTOR (sh)->size == 0))
1699 sh = shadow;
1700
1701 /* If the sequence by which we reach this keymap actually has
1702 some elements, then the sequence's definition in SHADOW is
1703 what we should use. */
1704 else
1705 {
7c140252 1706 sh = Flookup_key (shadow, Fcar (elt), Qt);
2c6f1a39
JB
1707 if (XTYPE (sh) == Lisp_Int)
1708 sh = Qnil;
1709 }
1710
1711 /* If sh is null (meaning that the current map is not shadowed),
1712 or a keymap (meaning that bindings from the current map might
1713 show through), describe the map. Otherwise, sh is a command
1714 that completely shadows the current map, and we shouldn't
1715 bother. */
265a9e55 1716 if (NILP (sh) || !NILP (Fkeymapp (sh)))
2c6f1a39
JB
1717 describe_map (Fcdr (elt), Fcar (elt), partial, sh);
1718 }
1719
1720 UNGCPRO;
1721}
1722
1723static void
1724describe_command (definition)
1725 Lisp_Object definition;
1726{
1727 register Lisp_Object tem1;
1728
1729 Findent_to (make_number (16), make_number (1));
1730
1731 if (XTYPE (definition) == Lisp_Symbol)
1732 {
1733 XSET (tem1, Lisp_String, XSYMBOL (definition)->name);
1734 insert1 (tem1);
1735 insert_string ("\n");
1736 }
1737 else
1738 {
1739 tem1 = Fkeymapp (definition);
265a9e55 1740 if (!NILP (tem1))
2c6f1a39
JB
1741 insert_string ("Prefix Command\n");
1742 else
1743 insert_string ("??\n");
1744 }
1745}
1746
1747/* Describe the contents of map MAP, assuming that this map itself is
1748 reached by the sequence of prefix keys KEYS (a string or vector).
1749 PARTIAL, SHADOW is as in `describe_map_tree' above. */
1750
1751static void
1752describe_map (map, keys, partial, shadow)
1753 Lisp_Object map, keys;
1754 int partial;
1755 Lisp_Object shadow;
1756{
1757 register Lisp_Object keysdesc;
1758
d09b2024 1759 if (!NILP (keys) && XFASTINT (Flength (keys)) > 0)
5cba3869
RS
1760 {
1761 Lisp_Object tem;
1762 /* Call Fkey_description first, to avoid GC bug for the other string. */
1763 tem = Fkey_description (keys);
1764 keysdesc = concat2 (tem, build_string (" "));
1765 }
2c6f1a39
JB
1766 else
1767 keysdesc = Qnil;
1768
f5b79c1c 1769 describe_map_2 (map, keysdesc, describe_command, partial, shadow);
2c6f1a39
JB
1770}
1771
f5b79c1c 1772/* Insert a description of KEYMAP into the current buffer. */
2c6f1a39
JB
1773
1774static void
f5b79c1c
JB
1775describe_map_2 (keymap, elt_prefix, elt_describer, partial, shadow)
1776 register Lisp_Object keymap;
2c6f1a39
JB
1777 Lisp_Object elt_prefix;
1778 int (*elt_describer) ();
1779 int partial;
1780 Lisp_Object shadow;
1781{
1782 Lisp_Object this;
1783 Lisp_Object tem1, tem2 = Qnil;
1784 Lisp_Object suppress;
1785 Lisp_Object kludge;
1786 int first = 1;
1787 struct gcpro gcpro1, gcpro2, gcpro3;
1788
1789 if (partial)
1790 suppress = intern ("suppress-keymap");
1791
1792 /* This vector gets used to present single keys to Flookup_key. Since
f5b79c1c 1793 that is done once per keymap element, we don't want to cons up a
2c6f1a39
JB
1794 fresh vector every time. */
1795 kludge = Fmake_vector (make_number (1), Qnil);
1796
1797 GCPRO3 (elt_prefix, tem2, kludge);
1798
f5b79c1c 1799 for (; CONSP (keymap); keymap = Fcdr (keymap))
2c6f1a39
JB
1800 {
1801 QUIT;
2c6f1a39 1802
f5b79c1c
JB
1803 if (XTYPE (XCONS (keymap)->car) == Lisp_Vector)
1804 describe_vector (XCONS (keymap)->car,
1805 elt_prefix, elt_describer, partial, shadow);
1806 else
2c6f1a39 1807 {
f5b79c1c
JB
1808 tem1 = Fcar_safe (Fcar (keymap));
1809 tem2 = get_keyelt (Fcdr_safe (Fcar (keymap)));
2c6f1a39 1810
f5b79c1c
JB
1811 /* Don't show undefined commands or suppressed commands. */
1812 if (NILP (tem2)) continue;
1813 if (XTYPE (tem2) == Lisp_Symbol && partial)
1814 {
1815 this = Fget (tem2, suppress);
1816 if (!NILP (this))
1817 continue;
1818 }
2c6f1a39 1819
f5b79c1c
JB
1820 /* Don't show a command that isn't really visible
1821 because a local definition of the same key shadows it. */
2c6f1a39 1822
f5b79c1c
JB
1823 if (!NILP (shadow))
1824 {
1825 Lisp_Object tem;
2c6f1a39 1826
f5b79c1c 1827 XVECTOR (kludge)->contents[0] = tem1;
7c140252 1828 tem = Flookup_key (shadow, kludge, Qt);
f5b79c1c
JB
1829 if (!NILP (tem)) continue;
1830 }
1831
1832 if (first)
1833 {
1834 insert ("\n", 1);
1835 first = 0;
1836 }
2c6f1a39 1837
f5b79c1c
JB
1838 if (!NILP (elt_prefix))
1839 insert1 (elt_prefix);
2c6f1a39 1840
f5b79c1c
JB
1841 /* THIS gets the string to describe the character TEM1. */
1842 this = Fsingle_key_description (tem1);
1843 insert1 (this);
2c6f1a39 1844
f5b79c1c
JB
1845 /* Print a description of the definition of this character.
1846 elt_describer will take care of spacing out far enough
1847 for alignment purposes. */
1848 (*elt_describer) (tem2);
1849 }
2c6f1a39
JB
1850 }
1851
1852 UNGCPRO;
1853}
1854
1855static int
1856describe_vector_princ (elt)
1857 Lisp_Object elt;
1858{
1859 Fprinc (elt, Qnil);
1860}
1861
1862DEFUN ("describe-vector", Fdescribe_vector, Sdescribe_vector, 1, 1, 0,
1863 "Print on `standard-output' a description of contents of VECTOR.\n\
1864This is text showing the elements of vector matched against indices.")
1865 (vector)
1866 Lisp_Object vector;
1867{
1868 CHECK_VECTOR (vector, 0);
92cc37e8 1869 describe_vector (vector, Qnil, describe_vector_princ, 0, Qnil);
2c6f1a39
JB
1870}
1871
1872describe_vector (vector, elt_prefix, elt_describer, partial, shadow)
1873 register Lisp_Object vector;
1874 Lisp_Object elt_prefix;
1875 int (*elt_describer) ();
1876 int partial;
1877 Lisp_Object shadow;
1878{
1879 Lisp_Object this;
1880 Lisp_Object dummy;
1881 Lisp_Object tem1, tem2;
1882 register int i;
1883 Lisp_Object suppress;
1884 Lisp_Object kludge;
1885 int first = 1;
1886 struct gcpro gcpro1, gcpro2, gcpro3;
1887
1888 tem1 = Qnil;
1889
1890 /* This vector gets used to present single keys to Flookup_key. Since
1891 that is done once per vector element, we don't want to cons up a
1892 fresh vector every time. */
1893 kludge = Fmake_vector (make_number (1), Qnil);
1894 GCPRO3 (elt_prefix, tem1, kludge);
1895
1896 if (partial)
1897 suppress = intern ("suppress-keymap");
1898
1899 for (i = 0; i < DENSE_TABLE_SIZE; i++)
1900 {
1901 QUIT;
1902 tem1 = get_keyelt (XVECTOR (vector)->contents[i]);
1903
265a9e55 1904 if (NILP (tem1)) continue;
2c6f1a39
JB
1905
1906 /* Don't mention suppressed commands. */
1907 if (XTYPE (tem1) == Lisp_Symbol && partial)
1908 {
1909 this = Fget (tem1, suppress);
265a9e55 1910 if (!NILP (this))
2c6f1a39
JB
1911 continue;
1912 }
1913
1914 /* If this command in this map is shadowed by some other map,
1915 ignore it. */
265a9e55 1916 if (!NILP (shadow))
2c6f1a39
JB
1917 {
1918 Lisp_Object tem;
1919
1920 XVECTOR (kludge)->contents[0] = make_number (i);
7c140252 1921 tem = Flookup_key (shadow, kludge, Qt);
2c6f1a39 1922
265a9e55 1923 if (!NILP (tem)) continue;
2c6f1a39
JB
1924 }
1925
1926 if (first)
1927 {
1928 insert ("\n", 1);
1929 first = 0;
1930 }
1931
1932 /* Output the prefix that applies to every entry in this map. */
265a9e55 1933 if (!NILP (elt_prefix))
2c6f1a39
JB
1934 insert1 (elt_prefix);
1935
1936 /* Get the string to describe the character I, and print it. */
1937 XFASTINT (dummy) = i;
1938
1939 /* THIS gets the string to describe the character DUMMY. */
1940 this = Fsingle_key_description (dummy);
1941 insert1 (this);
1942
1943 /* Find all consecutive characters that have the same definition. */
1944 while (i + 1 < DENSE_TABLE_SIZE
1945 && (tem2 = get_keyelt (XVECTOR (vector)->contents[i+1]),
1946 EQ (tem2, tem1)))
1947 i++;
1948
1949 /* If we have a range of more than one character,
1950 print where the range reaches to. */
1951
1952 if (i != XINT (dummy))
1953 {
1954 insert (" .. ", 4);
265a9e55 1955 if (!NILP (elt_prefix))
2c6f1a39
JB
1956 insert1 (elt_prefix);
1957
1958 XFASTINT (dummy) = i;
1959 insert1 (Fsingle_key_description (dummy));
1960 }
1961
1962 /* Print a description of the definition of this character.
1963 elt_describer will take care of spacing out far enough
1964 for alignment purposes. */
1965 (*elt_describer) (tem1);
1966 }
1967
1968 UNGCPRO;
1969}
1970\f
cc0a8174 1971/* Apropos - finding all symbols whose names match a regexp. */
2c6f1a39
JB
1972Lisp_Object apropos_predicate;
1973Lisp_Object apropos_accumulate;
1974
1975static void
1976apropos_accum (symbol, string)
1977 Lisp_Object symbol, string;
1978{
1979 register Lisp_Object tem;
1980
1981 tem = Fstring_match (string, Fsymbol_name (symbol), Qnil);
265a9e55 1982 if (!NILP (tem) && !NILP (apropos_predicate))
2c6f1a39 1983 tem = call1 (apropos_predicate, symbol);
265a9e55 1984 if (!NILP (tem))
2c6f1a39
JB
1985 apropos_accumulate = Fcons (symbol, apropos_accumulate);
1986}
1987
1988DEFUN ("apropos-internal", Fapropos_internal, Sapropos_internal, 1, 2, 0,
1989 "Show all symbols whose names contain match for REGEXP.\n\
1990If optional 2nd arg PRED is non-nil, (funcall PRED SYM) is done\n\
1991for each symbol and a symbol is mentioned only if that returns non-nil.\n\
1992Return list of symbols found.")
1993 (string, pred)
1994 Lisp_Object string, pred;
1995{
1996 struct gcpro gcpro1, gcpro2;
1997 CHECK_STRING (string, 0);
1998 apropos_predicate = pred;
1999 GCPRO2 (apropos_predicate, apropos_accumulate);
2000 apropos_accumulate = Qnil;
2001 map_obarray (Vobarray, apropos_accum, string);
2002 apropos_accumulate = Fsort (apropos_accumulate, Qstring_lessp);
2003 UNGCPRO;
2004 return apropos_accumulate;
2005}
2006\f
2007syms_of_keymap ()
2008{
2009 Lisp_Object tem;
2010
2011 Qkeymap = intern ("keymap");
2012 staticpro (&Qkeymap);
2013
2014/* Initialize the keymaps standardly used.
2015 Each one is the value of a Lisp variable, and is also
2016 pointed to by a C variable */
2017
ce6e5d0b 2018 global_map = Fmake_keymap (Qnil);
2c6f1a39
JB
2019 Fset (intern ("global-map"), global_map);
2020
ce6e5d0b 2021 meta_map = Fmake_keymap (Qnil);
2c6f1a39
JB
2022 Fset (intern ("esc-map"), meta_map);
2023 Ffset (intern ("ESC-prefix"), meta_map);
2024
ce6e5d0b 2025 control_x_map = Fmake_keymap (Qnil);
2c6f1a39
JB
2026 Fset (intern ("ctl-x-map"), control_x_map);
2027 Ffset (intern ("Control-X-prefix"), control_x_map);
2028
2029 DEFVAR_LISP ("minibuffer-local-map", &Vminibuffer_local_map,
2030 "Default keymap to use when reading from the minibuffer.");
ce6e5d0b 2031 Vminibuffer_local_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
2032
2033 DEFVAR_LISP ("minibuffer-local-ns-map", &Vminibuffer_local_ns_map,
2034 "Local keymap for the minibuffer when spaces are not allowed.");
ce6e5d0b 2035 Vminibuffer_local_ns_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
2036
2037 DEFVAR_LISP ("minibuffer-local-completion-map", &Vminibuffer_local_completion_map,
2038 "Local keymap for minibuffer input with completion.");
ce6e5d0b 2039 Vminibuffer_local_completion_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
2040
2041 DEFVAR_LISP ("minibuffer-local-must-match-map", &Vminibuffer_local_must_match_map,
2042 "Local keymap for minibuffer input with completion, for exact match.");
ce6e5d0b 2043 Vminibuffer_local_must_match_map = Fmake_sparse_keymap (Qnil);
2c6f1a39
JB
2044
2045 current_global_map = global_map;
2046
cc0a8174
JB
2047 DEFVAR_LISP ("minor-mode-map-alist", &Vminor_mode_map_alist,
2048 "Alist of keymaps to use for minor modes.\n\
2049Each element looks like (VARIABLE . KEYMAP); KEYMAP is used to read\n\
2050key sequences and look up bindings iff VARIABLE's value is non-nil.\n\
2051If two active keymaps bind the same key, the keymap appearing earlier\n\
2052in the list takes precedence.");
2053 Vminor_mode_map_alist = Qnil;
2054
6bbbd9b0
JB
2055 DEFVAR_LISP ("function-key-map", &Vfunction_key_map,
2056 "Keymap mapping ASCII function key sequences onto their preferred forms.\n\
2057This allows Emacs to recognize function keys sent from ASCII\n\
2058terminals at any point in a key sequence.\n\
2059\n\
2060The read-key-sequence function replaces subsequences bound by\n\
2061function-key-map with their bindings. When the current local and global\n\
2062keymaps have no binding for the current key sequence but\n\
2063function-key-map binds a suffix of the sequence to a vector,\n\
2064read-key-sequence replaces the matching suffix with its binding, and\n\
2065continues with the new sequence.\n\
2066\n\
2067For example, suppose function-key-map binds `ESC O P' to [pf1].\n\
2068Typing `ESC O P' to read-key-sequence would return [pf1]. Typing\n\
2069`C-x ESC O P' would return [?\C-x pf1]. If [pf1] were a prefix\n\
2070key, typing `ESC O P x' would return [pf1 x].");
ce6e5d0b 2071 Vfunction_key_map = Fmake_sparse_keymap (Qnil);
6bbbd9b0 2072
2c6f1a39
JB
2073 Qsingle_key_description = intern ("single-key-description");
2074 staticpro (&Qsingle_key_description);
2075
2076 Qkey_description = intern ("key-description");
2077 staticpro (&Qkey_description);
2078
2079 Qkeymapp = intern ("keymapp");
2080 staticpro (&Qkeymapp);
2081
2fc66973
JB
2082 Qnon_ascii = intern ("non-ascii");
2083 staticpro (&Qnon_ascii);
2084
2c6f1a39
JB
2085 defsubr (&Skeymapp);
2086 defsubr (&Smake_keymap);
2087 defsubr (&Smake_sparse_keymap);
2088 defsubr (&Scopy_keymap);
2089 defsubr (&Skey_binding);
2090 defsubr (&Slocal_key_binding);
2091 defsubr (&Sglobal_key_binding);
cc0a8174 2092 defsubr (&Sminor_mode_key_binding);
2c6f1a39
JB
2093 defsubr (&Sglobal_set_key);
2094 defsubr (&Slocal_set_key);
2095 defsubr (&Sdefine_key);
2096 defsubr (&Slookup_key);
2097 defsubr (&Sglobal_unset_key);
2098 defsubr (&Slocal_unset_key);
2099 defsubr (&Sdefine_prefix_command);
2100 defsubr (&Suse_global_map);
2101 defsubr (&Suse_local_map);
2102 defsubr (&Scurrent_local_map);
2103 defsubr (&Scurrent_global_map);
cc0a8174 2104 defsubr (&Scurrent_minor_mode_maps);
2c6f1a39
JB
2105 defsubr (&Saccessible_keymaps);
2106 defsubr (&Skey_description);
2107 defsubr (&Sdescribe_vector);
2108 defsubr (&Ssingle_key_description);
2109 defsubr (&Stext_char_description);
2110 defsubr (&Swhere_is_internal);
2111 defsubr (&Swhere_is);
2112 defsubr (&Sdescribe_bindings);
2113 defsubr (&Sapropos_internal);
2114}
2115
2116keys_of_keymap ()
2117{
2118 Lisp_Object tem;
2119
2120 initial_define_key (global_map, 033, "ESC-prefix");
2121 initial_define_key (global_map, Ctl('X'), "Control-X-prefix");
2122}