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