Mercurial > emacs
annotate src/keymap.c @ 36280:3780eecdcd10
*** empty log message ***
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Thu, 22 Feb 2001 11:46:14 +0000 |
parents | ffdcf20f53f2 |
children | 274190d289d7 |
rev | line source |
---|---|
250 | 1 /* Manipulation of keymaps |
35706 | 2 Copyright (C) 1985, 86,87,88,93,94,95,98,99, 2000 |
32818 | 3 Free Software Foundation, Inc. |
250 | 4 |
5 This file is part of GNU Emacs. | |
6 | |
7 GNU Emacs is free software; you can redistribute it and/or modify | |
8 it under the terms of the GNU General Public License as published by | |
647 | 9 the Free Software Foundation; either version 2, or (at your option) |
250 | 10 any later version. |
11 | |
12 GNU Emacs is distributed in the hope that it will be useful, | |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 GNU General Public License for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with GNU Emacs; see the file COPYING. If not, write to | |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14129
diff
changeset
|
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14129
diff
changeset
|
20 Boston, MA 02111-1307, USA. */ |
250 | 21 |
22 | |
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
4575
diff
changeset
|
23 #include <config.h> |
250 | 24 #include <stdio.h> |
25 #include "lisp.h" | |
26 #include "commands.h" | |
27 #include "buffer.h" | |
17036 | 28 #include "charset.h" |
517 | 29 #include "keyboard.h" |
2059 | 30 #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
|
31 #include "blockinput.h" |
13771
28790743a5a3
(Fkey_binding): Handle text-property keymaps.
Karl Heuer <kwzh@gnu.org>
parents:
13343
diff
changeset
|
32 #include "puresize.h" |
29282 | 33 #include "intervals.h" |
250 | 34 |
35 #define min(a, b) ((a) < (b) ? (a) : (b)) | |
36 | |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
37 /* The number of elements in keymap vectors. */ |
250 | 38 #define DENSE_TABLE_SIZE (0200) |
39 | |
40 /* Actually allocate storage for these variables */ | |
41 | |
42 Lisp_Object current_global_map; /* Current global keymap */ | |
43 | |
44 Lisp_Object global_map; /* default global key bindings */ | |
45 | |
46 Lisp_Object meta_map; /* The keymap used for globally bound | |
47 ESC-prefixed default commands */ | |
48 | |
49 Lisp_Object control_x_map; /* The keymap used for globally bound | |
50 C-x-prefixed default commands */ | |
51 | |
52 /* was MinibufLocalMap */ | |
53 Lisp_Object Vminibuffer_local_map; | |
54 /* The keymap used by the minibuf for local | |
55 bindings when spaces are allowed in the | |
56 minibuf */ | |
57 | |
58 /* was MinibufLocalNSMap */ | |
59 Lisp_Object Vminibuffer_local_ns_map; | |
60 /* The keymap used by the minibuf for local | |
61 bindings when spaces are not encouraged | |
62 in the minibuf */ | |
63 | |
64 /* keymap used for minibuffers when doing completion */ | |
65 /* was MinibufLocalCompletionMap */ | |
66 Lisp_Object Vminibuffer_local_completion_map; | |
67 | |
68 /* keymap used for minibuffers when doing completion and require a match */ | |
69 /* was MinibufLocalMustMatchMap */ | |
70 Lisp_Object Vminibuffer_local_must_match_map; | |
71 | |
465 | 72 /* Alist of minor mode variables and keymaps. */ |
73 Lisp_Object Vminor_mode_map_alist; | |
74 | |
20517
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
75 /* Alist of major-mode-specific overrides for |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
76 minor mode variables and keymaps. */ |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
77 Lisp_Object Vminor_mode_overriding_map_alist; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
78 |
517 | 79 /* Keymap mapping ASCII function key sequences onto their preferred forms. |
80 Initialized by the terminal-specific lisp files. See DEFVAR for more | |
81 documentation. */ | |
82 Lisp_Object Vfunction_key_map; | |
83 | |
12710
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
84 /* Keymap mapping ASCII function key sequences onto their preferred forms. */ |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
85 Lisp_Object Vkey_translation_map; |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
86 |
12297
fe458a8ecfa2
(Vdefine_key_rebound_commands): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
12262
diff
changeset
|
87 /* A list of all commands given new bindings since a certain time |
fe458a8ecfa2
(Vdefine_key_rebound_commands): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
12262
diff
changeset
|
88 when nil was stored here. |
fe458a8ecfa2
(Vdefine_key_rebound_commands): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
12262
diff
changeset
|
89 This is used to speed up recomputation of menu key equivalents |
fe458a8ecfa2
(Vdefine_key_rebound_commands): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
12262
diff
changeset
|
90 when Emacs starts up. t means don't record anything here. */ |
fe458a8ecfa2
(Vdefine_key_rebound_commands): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
12262
diff
changeset
|
91 Lisp_Object Vdefine_key_rebound_commands; |
fe458a8ecfa2
(Vdefine_key_rebound_commands): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
12262
diff
changeset
|
92 |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
93 Lisp_Object Qkeymapp, Qkeymap, Qnon_ascii, Qmenu_item; |
250 | 94 |
2886 | 95 /* A char with the CHAR_META bit set in a vector or the 0200 bit set |
96 in a string key sequence is equivalent to prefixing with this | |
97 character. */ | |
250 | 98 extern Lisp_Object meta_prefix_char; |
99 | |
5613
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
100 extern Lisp_Object Voverriding_local_map; |
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
101 |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
102 /* Hash table used to cache a reverse-map to speed up calls to where-is. */ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
103 static Lisp_Object where_is_cache; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
104 /* Which keymaps are reverse-stored in the cache. */ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
105 static Lisp_Object where_is_cache_keymaps; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
106 |
31208
442d40fce0db
(store_in_keymap, fix_submap_inheritance): New prototypes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30780
diff
changeset
|
107 static Lisp_Object store_in_keymap P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); |
442d40fce0db
(store_in_keymap, fix_submap_inheritance): New prototypes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30780
diff
changeset
|
108 static void fix_submap_inheritance P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); |
442d40fce0db
(store_in_keymap, fix_submap_inheritance): New prototypes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30780
diff
changeset
|
109 |
442d40fce0db
(store_in_keymap, fix_submap_inheritance): New prototypes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30780
diff
changeset
|
110 static Lisp_Object define_as_prefix P_ ((Lisp_Object, Lisp_Object)); |
442d40fce0db
(store_in_keymap, fix_submap_inheritance): New prototypes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30780
diff
changeset
|
111 static Lisp_Object describe_buffer_bindings P_ ((Lisp_Object)); |
442d40fce0db
(store_in_keymap, fix_submap_inheritance): New prototypes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30780
diff
changeset
|
112 static void describe_command P_ ((Lisp_Object)); |
442d40fce0db
(store_in_keymap, fix_submap_inheritance): New prototypes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30780
diff
changeset
|
113 static void describe_translation P_ ((Lisp_Object)); |
442d40fce0db
(store_in_keymap, fix_submap_inheritance): New prototypes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30780
diff
changeset
|
114 static void describe_map P_ ((Lisp_Object, Lisp_Object, |
442d40fce0db
(store_in_keymap, fix_submap_inheritance): New prototypes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30780
diff
changeset
|
115 void (*) P_ ((Lisp_Object)), |
442d40fce0db
(store_in_keymap, fix_submap_inheritance): New prototypes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30780
diff
changeset
|
116 int, Lisp_Object, Lisp_Object*, int)); |
250 | 117 |
465 | 118 /* Keymap object support - constructors and predicates. */ |
119 | |
1095
6578f07e9eb8
(Fmake_sparse_keymap, Fmake_keymap): New optional arg. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
647
diff
changeset
|
120 DEFUN ("make-keymap", Fmake_keymap, Smake_keymap, 0, 1, 0, |
23758
e6bdd4559dc7
(Fmake_keymap): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
23734
diff
changeset
|
121 "Construct and return a new keymap, of the form (keymap CHARTABLE . ALIST).\n\ |
e6bdd4559dc7
(Fmake_keymap): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
23734
diff
changeset
|
122 CHARTABLE is a char-table that holds the bindings for the ASCII\n\ |
250 | 123 characters. ALIST is an assoc-list which holds bindings for function keys,\n\ |
124 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
|
125 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
|
126 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
|
127 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
|
128 (string) |
6578f07e9eb8
(Fmake_sparse_keymap, Fmake_keymap): New optional arg. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
647
diff
changeset
|
129 Lisp_Object string; |
250 | 130 { |
1095
6578f07e9eb8
(Fmake_sparse_keymap, Fmake_keymap): New optional arg. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
647
diff
changeset
|
131 Lisp_Object tail; |
6578f07e9eb8
(Fmake_sparse_keymap, Fmake_keymap): New optional arg. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
647
diff
changeset
|
132 if (!NILP (string)) |
6578f07e9eb8
(Fmake_sparse_keymap, Fmake_keymap): New optional arg. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
647
diff
changeset
|
133 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
|
134 else |
6578f07e9eb8
(Fmake_sparse_keymap, Fmake_keymap): New optional arg. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
647
diff
changeset
|
135 tail = Qnil; |
250 | 136 return Fcons (Qkeymap, |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
137 Fcons (Fmake_char_table (Qkeymap, Qnil), tail)); |
250 | 138 } |
139 | |
1095
6578f07e9eb8
(Fmake_sparse_keymap, Fmake_keymap): New optional arg. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
647
diff
changeset
|
140 DEFUN ("make-sparse-keymap", Fmake_sparse_keymap, Smake_sparse_keymap, 0, 1, 0, |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
141 "Construct and return a new sparse keymap.\n\ |
250 | 142 Its car is `keymap' and its cdr is an alist of (CHAR . DEFINITION),\n\ |
143 which binds the character CHAR to DEFINITION, or (SYMBOL . DEFINITION),\n\ | |
144 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
|
145 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
|
146 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
|
147 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
|
148 (string) |
6578f07e9eb8
(Fmake_sparse_keymap, Fmake_keymap): New optional arg. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
647
diff
changeset
|
149 Lisp_Object string; |
250 | 150 { |
1095
6578f07e9eb8
(Fmake_sparse_keymap, Fmake_keymap): New optional arg. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
647
diff
changeset
|
151 if (!NILP (string)) |
6578f07e9eb8
(Fmake_sparse_keymap, Fmake_keymap): New optional arg. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
647
diff
changeset
|
152 return Fcons (Qkeymap, Fcons (string, Qnil)); |
250 | 153 return Fcons (Qkeymap, Qnil); |
154 } | |
155 | |
156 /* This function is used for installing the standard key bindings | |
157 at initialization time. | |
158 | |
159 For example: | |
160 | |
1388
02226bff1476
* keymap.c (initial_define_lispy_key): New function, for defining
Jim Blandy <jimb@redhat.com>
parents:
1315
diff
changeset
|
161 initial_define_key (control_x_map, Ctl('X'), "exchange-point-and-mark"); */ |
250 | 162 |
163 void | |
164 initial_define_key (keymap, key, defname) | |
165 Lisp_Object keymap; | |
166 int key; | |
167 char *defname; | |
168 { | |
169 store_in_keymap (keymap, make_number (key), intern (defname)); | |
170 } | |
171 | |
1388
02226bff1476
* keymap.c (initial_define_lispy_key): New function, for defining
Jim Blandy <jimb@redhat.com>
parents:
1315
diff
changeset
|
172 void |
02226bff1476
* keymap.c (initial_define_lispy_key): New function, for defining
Jim Blandy <jimb@redhat.com>
parents:
1315
diff
changeset
|
173 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
|
174 Lisp_Object keymap; |
02226bff1476
* keymap.c (initial_define_lispy_key): New function, for defining
Jim Blandy <jimb@redhat.com>
parents:
1315
diff
changeset
|
175 char *keyname; |
02226bff1476
* keymap.c (initial_define_lispy_key): New function, for defining
Jim Blandy <jimb@redhat.com>
parents:
1315
diff
changeset
|
176 char *defname; |
02226bff1476
* keymap.c (initial_define_lispy_key): New function, for defining
Jim Blandy <jimb@redhat.com>
parents:
1315
diff
changeset
|
177 { |
02226bff1476
* keymap.c (initial_define_lispy_key): New function, for defining
Jim Blandy <jimb@redhat.com>
parents:
1315
diff
changeset
|
178 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
|
179 } |
02226bff1476
* keymap.c (initial_define_lispy_key): New function, for defining
Jim Blandy <jimb@redhat.com>
parents:
1315
diff
changeset
|
180 |
250 | 181 DEFUN ("keymapp", Fkeymapp, Skeymapp, 1, 1, 0, |
14080
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
182 "Return t if OBJECT is a keymap.\n\ |
362 | 183 \n\ |
2790
cf431814ce6a
(access_keymap): Handle any length vector.
Richard M. Stallman <rms@gnu.org>
parents:
2755
diff
changeset
|
184 A keymap is a list (keymap . ALIST),\n\ |
6457 | 185 or a symbol whose function definition is itself a keymap.\n\ |
362 | 186 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
|
187 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
|
188 is also allowed as an element.") |
250 | 189 (object) |
190 Lisp_Object object; | |
191 { | |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
192 return (KEYMAPP (object) ? Qt : Qnil); |
250 | 193 } |
194 | |
195 /* 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
|
196 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
|
197 |
72b7bbcaf7d8
* keymap.c (Fdefine_key, Flookup_key, describe_map): Don't assume
Jim Blandy <jimb@redhat.com>
parents:
1441
diff
changeset
|
198 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
|
199 is an autoload form, do the autoload and try again. |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
200 If AUTOLOAD is nonzero, callers must assume GC is possible. |
1517
72b7bbcaf7d8
* keymap.c (Fdefine_key, Flookup_key, describe_map): Don't assume
Jim Blandy <jimb@redhat.com>
parents:
1441
diff
changeset
|
201 |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
202 If the map needs to be autoloaded, but AUTOLOAD is zero (and ERROR |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
203 is zero as well), return Qt. |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
204 |
1517
72b7bbcaf7d8
* keymap.c (Fdefine_key, Flookup_key, describe_map): Don't assume
Jim Blandy <jimb@redhat.com>
parents:
1441
diff
changeset
|
205 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
|
206 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
|
207 |
72b7bbcaf7d8
* keymap.c (Fdefine_key, Flookup_key, describe_map): Don't assume
Jim Blandy <jimb@redhat.com>
parents:
1441
diff
changeset
|
208 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
|
209 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
|
210 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
|
211 but it seems to me that only read_key_sequence, Flookup_key, and |
30134
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
212 Fdefine_key should cause keymaps to be autoloaded. |
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
213 |
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
214 This function can GC when AUTOLOAD is non-zero, because it calls |
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
215 do_autoload which can GC. */ |
1517
72b7bbcaf7d8
* keymap.c (Fdefine_key, Flookup_key, describe_map): Don't assume
Jim Blandy <jimb@redhat.com>
parents:
1441
diff
changeset
|
216 |
250 | 217 Lisp_Object |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
218 get_keymap (object, error, autoload) |
250 | 219 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
|
220 int error, autoload; |
250 | 221 { |
1517
72b7bbcaf7d8
* keymap.c (Fdefine_key, Flookup_key, describe_map): Don't assume
Jim Blandy <jimb@redhat.com>
parents:
1441
diff
changeset
|
222 Lisp_Object tem; |
250 | 223 |
1517
72b7bbcaf7d8
* keymap.c (Fdefine_key, Flookup_key, describe_map): Don't assume
Jim Blandy <jimb@redhat.com>
parents:
1441
diff
changeset
|
224 autoload_retry: |
25128
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
225 if (NILP (object)) |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
226 goto end; |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
227 if (CONSP (object) && EQ (XCAR (object), Qkeymap)) |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
228 return object; |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
229 |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
230 tem = indirect_function (object); |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
231 if (CONSP (tem)) |
25128
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
232 { |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
233 if (EQ (XCAR (tem), Qkeymap)) |
25128
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
234 return tem; |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
235 |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
236 /* Should we do an autoload? Autoload forms for keymaps have |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
237 Qkeymap as their fifth element. */ |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
238 if ((autoload || !error) && EQ (XCAR (tem), Qautoload)) |
1566
892c9f61217a
* keymap.c (get_keymap_1): Don't try to autoload OBJECT's function
Jim Blandy <jimb@redhat.com>
parents:
1517
diff
changeset
|
239 { |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
240 Lisp_Object tail; |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
241 |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
242 tail = Fnth (make_number (4), tem); |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
243 if (EQ (tail, Qkeymap)) |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
244 { |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
245 if (autoload) |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
246 { |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
247 struct gcpro gcpro1, gcpro2; |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
248 |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
249 GCPRO2 (tem, object); |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
250 do_autoload (tem, object); |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
251 UNGCPRO; |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
252 |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
253 goto autoload_retry; |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
254 } |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
255 else |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
256 return Qt; |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
257 } |
1566
892c9f61217a
* keymap.c (get_keymap_1): Don't try to autoload OBJECT's function
Jim Blandy <jimb@redhat.com>
parents:
1517
diff
changeset
|
258 } |
1517
72b7bbcaf7d8
* keymap.c (Fdefine_key, Flookup_key, describe_map): Don't assume
Jim Blandy <jimb@redhat.com>
parents:
1441
diff
changeset
|
259 } |
72b7bbcaf7d8
* keymap.c (Fdefine_key, Flookup_key, describe_map): Don't assume
Jim Blandy <jimb@redhat.com>
parents:
1441
diff
changeset
|
260 |
25128
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
261 end: |
250 | 262 if (error) |
263 wrong_type_argument (Qkeymapp, object); | |
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31496
diff
changeset
|
264 return Qnil; |
250 | 265 } |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
266 |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
267 /* Return the parent map of the keymap MAP, or nil if it has none. |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
268 We assume that MAP is a valid keymap. */ |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
269 |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
270 DEFUN ("keymap-parent", Fkeymap_parent, Skeymap_parent, 1, 1, 0, |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
271 "Return the parent keymap of KEYMAP.") |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
272 (keymap) |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
273 Lisp_Object keymap; |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
274 { |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
275 Lisp_Object list; |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
276 |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
277 keymap = get_keymap (keymap, 1, 1); |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
278 |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
279 /* Skip past the initial element `keymap'. */ |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
280 list = XCDR (keymap); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
281 for (; CONSP (list); list = XCDR (list)) |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
282 { |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
283 /* See if there is another `keymap'. */ |
31208
442d40fce0db
(store_in_keymap, fix_submap_inheritance): New prototypes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30780
diff
changeset
|
284 if (KEYMAPP (list)) |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
285 return list; |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
286 } |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
287 |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
288 return get_keymap (list, 0, 1); |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
289 } |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
290 |
31496
946e1ba42cc9
(Fset_keymap_parent): Check for cycles in keymap
Gerd Moellmann <gerd@gnu.org>
parents:
31232
diff
changeset
|
291 |
32038
0cb9cab990cb
(keymap_memberp): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
31989
diff
changeset
|
292 /* Check whether MAP is one of MAPS parents. */ |
0cb9cab990cb
(keymap_memberp): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
31989
diff
changeset
|
293 int |
0cb9cab990cb
(keymap_memberp): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
31989
diff
changeset
|
294 keymap_memberp (map, maps) |
0cb9cab990cb
(keymap_memberp): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
31989
diff
changeset
|
295 Lisp_Object map, maps; |
0cb9cab990cb
(keymap_memberp): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
31989
diff
changeset
|
296 { |
32559
bc60bd171784
(keymap_memberp): Ensure that nil is not a member.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32478
diff
changeset
|
297 if (NILP (map)) return 0; |
32038
0cb9cab990cb
(keymap_memberp): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
31989
diff
changeset
|
298 while (KEYMAPP (maps) && !EQ (map, maps)) |
0cb9cab990cb
(keymap_memberp): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
31989
diff
changeset
|
299 maps = Fkeymap_parent (maps); |
0cb9cab990cb
(keymap_memberp): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
31989
diff
changeset
|
300 return (EQ (map, maps)); |
0cb9cab990cb
(keymap_memberp): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
31989
diff
changeset
|
301 } |
0cb9cab990cb
(keymap_memberp): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
31989
diff
changeset
|
302 |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
303 /* Set the parent keymap of MAP to PARENT. */ |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
304 |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
305 DEFUN ("set-keymap-parent", Fset_keymap_parent, Sset_keymap_parent, 2, 2, 0, |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
306 "Modify KEYMAP to set its parent map to PARENT.\n\ |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
307 PARENT should be nil or another keymap.") |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
308 (keymap, parent) |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
309 Lisp_Object keymap, parent; |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
310 { |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
311 Lisp_Object list, prev; |
30134
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
312 struct gcpro gcpro1; |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
313 int i; |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
314 |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
315 /* Force a keymap flush for the next call to where-is. |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
316 Since this can be called from within where-is, we don't set where_is_cache |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
317 directly but only where_is_cache_keymaps, since where_is_cache shouldn't |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
318 be changed during where-is, while where_is_cache_keymaps is only used at |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
319 the very beginning of where-is and can thus be changed here without any |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
320 adverse effect. |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
321 This is a very minor correctness (rather than safety) issue. */ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
322 where_is_cache_keymaps = Qt; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
323 |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
324 keymap = get_keymap (keymap, 1, 1); |
30134
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
325 GCPRO1 (keymap); |
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
326 |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
327 if (!NILP (parent)) |
31496
946e1ba42cc9
(Fset_keymap_parent): Check for cycles in keymap
Gerd Moellmann <gerd@gnu.org>
parents:
31232
diff
changeset
|
328 { |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
329 parent = get_keymap (parent, 1, 1); |
31496
946e1ba42cc9
(Fset_keymap_parent): Check for cycles in keymap
Gerd Moellmann <gerd@gnu.org>
parents:
31232
diff
changeset
|
330 |
946e1ba42cc9
(Fset_keymap_parent): Check for cycles in keymap
Gerd Moellmann <gerd@gnu.org>
parents:
31232
diff
changeset
|
331 /* Check for cycles. */ |
32038
0cb9cab990cb
(keymap_memberp): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
31989
diff
changeset
|
332 if (keymap_memberp (keymap, parent)) |
31496
946e1ba42cc9
(Fset_keymap_parent): Check for cycles in keymap
Gerd Moellmann <gerd@gnu.org>
parents:
31232
diff
changeset
|
333 error ("Cyclic keymap inheritance"); |
946e1ba42cc9
(Fset_keymap_parent): Check for cycles in keymap
Gerd Moellmann <gerd@gnu.org>
parents:
31232
diff
changeset
|
334 } |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
335 |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
336 /* Skip past the initial element `keymap'. */ |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
337 prev = keymap; |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
338 while (1) |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
339 { |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
340 list = XCDR (prev); |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
341 /* If there is a parent keymap here, replace it. |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
342 If we came to the end, add the parent in PREV. */ |
31208
442d40fce0db
(store_in_keymap, fix_submap_inheritance): New prototypes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30780
diff
changeset
|
343 if (! CONSP (list) || KEYMAPP (list)) |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
344 { |
15422
dd639432a55a
(Fset_keymap_parent): Return early if KEYMAP already has the proper parent.
Richard M. Stallman <rms@gnu.org>
parents:
15378
diff
changeset
|
345 /* If we already have the right parent, return now |
dd639432a55a
(Fset_keymap_parent): Return early if KEYMAP already has the proper parent.
Richard M. Stallman <rms@gnu.org>
parents:
15378
diff
changeset
|
346 so that we avoid the loops below. */ |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
347 if (EQ (XCDR (prev), parent)) |
30134
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
348 RETURN_UNGCPRO (parent); |
15422
dd639432a55a
(Fset_keymap_parent): Return early if KEYMAP already has the proper parent.
Richard M. Stallman <rms@gnu.org>
parents:
15378
diff
changeset
|
349 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
350 XCDR (prev) = parent; |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
351 break; |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
352 } |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
353 prev = list; |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
354 } |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
355 |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
356 /* Scan through for submaps, and set their parents too. */ |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
357 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
358 for (list = XCDR (keymap); CONSP (list); list = XCDR (list)) |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
359 { |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
360 /* Stop the scan when we come to the parent. */ |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
361 if (EQ (XCAR (list), Qkeymap)) |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
362 break; |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
363 |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
364 /* If this element holds a prefix map, deal with it. */ |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
365 if (CONSP (XCAR (list)) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
366 && CONSP (XCDR (XCAR (list)))) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
367 fix_submap_inheritance (keymap, XCAR (XCAR (list)), |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
368 XCDR (XCAR (list))); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
369 |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
370 if (VECTORP (XCAR (list))) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
371 for (i = 0; i < XVECTOR (XCAR (list))->size; i++) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
372 if (CONSP (XVECTOR (XCAR (list))->contents[i])) |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
373 fix_submap_inheritance (keymap, make_number (i), |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
374 XVECTOR (XCAR (list))->contents[i]); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
375 |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
376 if (CHAR_TABLE_P (XCAR (list))) |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
377 { |
20076
374e09781f08
(Faccessible_keymaps): Avoid alloca for fixed-size array.
Karl Heuer <kwzh@gnu.org>
parents:
20070
diff
changeset
|
378 Lisp_Object indices[3]; |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
379 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
380 map_char_table (fix_submap_inheritance, Qnil, XCAR (list), |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
381 keymap, 0, indices); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
382 } |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
383 } |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
384 |
30134
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
385 RETURN_UNGCPRO (parent); |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
386 } |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
387 |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
388 /* EVENT is defined in MAP as a prefix, and SUBMAP is its definition. |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
389 if EVENT is also a prefix in MAP's parent, |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
390 make sure that SUBMAP inherits that definition as its own parent. */ |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
391 |
31208
442d40fce0db
(store_in_keymap, fix_submap_inheritance): New prototypes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30780
diff
changeset
|
392 static void |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
393 fix_submap_inheritance (map, event, submap) |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
394 Lisp_Object map, event, submap; |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
395 { |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
396 Lisp_Object map_parent, parent_entry; |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
397 |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
398 /* SUBMAP is a cons that we found as a key binding. |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
399 Discard the other things found in a menu key binding. */ |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
400 |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
401 submap = get_keymap (get_keyelt (submap, 0), 0, 0); |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
402 |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
403 /* If it isn't a keymap now, there's no work to do. */ |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
404 if (!CONSP (submap)) |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
405 return; |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
406 |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
407 map_parent = Fkeymap_parent (map); |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
408 if (!NILP (map_parent)) |
32844
5aa0846c2995
(fix_submap_inheritance): Use get_keymap_1 on parent_entry
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32818
diff
changeset
|
409 parent_entry = |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
410 get_keymap (access_keymap (map_parent, event, 0, 0, 0), 0, 0); |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
411 else |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
412 parent_entry = Qnil; |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
413 |
15378
ecfc288350ab
(fix_submap_inheritance): If parent_entry is not a keymap, use nil instead.
Richard M. Stallman <rms@gnu.org>
parents:
15344
diff
changeset
|
414 /* If MAP's parent has something other than a keymap, |
32739
5ce157b2eaa9
(fix_submap_inheritance): Don't do anything if parent_entry
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32615
diff
changeset
|
415 our own submap shadows it completely. */ |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
416 if (!CONSP (parent_entry)) |
32739
5ce157b2eaa9
(fix_submap_inheritance): Don't do anything if parent_entry
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32615
diff
changeset
|
417 return; |
15378
ecfc288350ab
(fix_submap_inheritance): If parent_entry is not a keymap, use nil instead.
Richard M. Stallman <rms@gnu.org>
parents:
15344
diff
changeset
|
418 |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
419 if (! EQ (parent_entry, submap)) |
25600
6cea4c28fc1c
(fix_submap_inheritance): Do nothing if the proper parent is an
Richard M. Stallman <rms@gnu.org>
parents:
25128
diff
changeset
|
420 { |
6cea4c28fc1c
(fix_submap_inheritance): Do nothing if the proper parent is an
Richard M. Stallman <rms@gnu.org>
parents:
25128
diff
changeset
|
421 Lisp_Object submap_parent; |
6cea4c28fc1c
(fix_submap_inheritance): Do nothing if the proper parent is an
Richard M. Stallman <rms@gnu.org>
parents:
25128
diff
changeset
|
422 submap_parent = submap; |
6cea4c28fc1c
(fix_submap_inheritance): Do nothing if the proper parent is an
Richard M. Stallman <rms@gnu.org>
parents:
25128
diff
changeset
|
423 while (1) |
6cea4c28fc1c
(fix_submap_inheritance): Do nothing if the proper parent is an
Richard M. Stallman <rms@gnu.org>
parents:
25128
diff
changeset
|
424 { |
6cea4c28fc1c
(fix_submap_inheritance): Do nothing if the proper parent is an
Richard M. Stallman <rms@gnu.org>
parents:
25128
diff
changeset
|
425 Lisp_Object tem; |
32739
5ce157b2eaa9
(fix_submap_inheritance): Don't do anything if parent_entry
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32615
diff
changeset
|
426 |
25600
6cea4c28fc1c
(fix_submap_inheritance): Do nothing if the proper parent is an
Richard M. Stallman <rms@gnu.org>
parents:
25128
diff
changeset
|
427 tem = Fkeymap_parent (submap_parent); |
32739
5ce157b2eaa9
(fix_submap_inheritance): Don't do anything if parent_entry
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32615
diff
changeset
|
428 |
5ce157b2eaa9
(fix_submap_inheritance): Don't do anything if parent_entry
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32615
diff
changeset
|
429 if (KEYMAPP (tem)) |
5ce157b2eaa9
(fix_submap_inheritance): Don't do anything if parent_entry
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32615
diff
changeset
|
430 { |
5ce157b2eaa9
(fix_submap_inheritance): Don't do anything if parent_entry
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32615
diff
changeset
|
431 if (keymap_memberp (tem, parent_entry)) |
5ce157b2eaa9
(fix_submap_inheritance): Don't do anything if parent_entry
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32615
diff
changeset
|
432 /* Fset_keymap_parent could create a cycle. */ |
5ce157b2eaa9
(fix_submap_inheritance): Don't do anything if parent_entry
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32615
diff
changeset
|
433 return; |
5ce157b2eaa9
(fix_submap_inheritance): Don't do anything if parent_entry
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32615
diff
changeset
|
434 submap_parent = tem; |
5ce157b2eaa9
(fix_submap_inheritance): Don't do anything if parent_entry
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32615
diff
changeset
|
435 } |
25600
6cea4c28fc1c
(fix_submap_inheritance): Do nothing if the proper parent is an
Richard M. Stallman <rms@gnu.org>
parents:
25128
diff
changeset
|
436 else |
6cea4c28fc1c
(fix_submap_inheritance): Do nothing if the proper parent is an
Richard M. Stallman <rms@gnu.org>
parents:
25128
diff
changeset
|
437 break; |
6cea4c28fc1c
(fix_submap_inheritance): Do nothing if the proper parent is an
Richard M. Stallman <rms@gnu.org>
parents:
25128
diff
changeset
|
438 } |
6cea4c28fc1c
(fix_submap_inheritance): Do nothing if the proper parent is an
Richard M. Stallman <rms@gnu.org>
parents:
25128
diff
changeset
|
439 Fset_keymap_parent (submap_parent, parent_entry); |
6cea4c28fc1c
(fix_submap_inheritance): Do nothing if the proper parent is an
Richard M. Stallman <rms@gnu.org>
parents:
25128
diff
changeset
|
440 } |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
441 } |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
442 |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
443 /* 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
|
444 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
|
445 event, not a sequence. |
02226bff1476
* keymap.c (initial_define_lispy_key): New function, for defining
Jim Blandy <jimb@redhat.com>
parents:
1315
diff
changeset
|
446 |
02226bff1476
* keymap.c (initial_define_lispy_key): New function, for defining
Jim Blandy <jimb@redhat.com>
parents:
1315
diff
changeset
|
447 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
|
448 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
|
449 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
|
450 |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
451 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
|
452 |
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
453 If NOINHERIT, don't accept a subkeymap found in an inherited keymap. */ |
250 | 454 |
455 Lisp_Object | |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
456 access_keymap (map, idx, t_ok, noinherit, autoload) |
250 | 457 Lisp_Object map; |
458 Lisp_Object idx; | |
1388
02226bff1476
* keymap.c (initial_define_lispy_key): New function, for defining
Jim Blandy <jimb@redhat.com>
parents:
1315
diff
changeset
|
459 int t_ok; |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
460 int noinherit; |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
461 int autoload; |
250 | 462 { |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
463 int noprefix = 0; |
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
464 Lisp_Object val; |
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
465 |
250 | 466 /* If idx is a list (some sort of mouse click, perhaps?), |
467 the index we want to use is the car of the list, which | |
468 ought to be a symbol. */ | |
1315
884c3d7e7172
* keymap.c (access_keymap, store_in_keymap,
Jim Blandy <jimb@redhat.com>
parents:
1264
diff
changeset
|
469 idx = EVENT_HEAD (idx); |
250 | 470 |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
471 /* 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
|
472 be put in the canonical order. */ |
8866
48a0ea73a9d7
(Fkey_description): Give error if KEYS not an array.
Richard M. Stallman <rms@gnu.org>
parents:
8731
diff
changeset
|
473 if (SYMBOLP (idx)) |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
474 idx = reorder_modifiers (idx); |
3515
9d0af0f2dc0d
(access_keymap, store_in_keymap): Discard meaningless
Richard M. Stallman <rms@gnu.org>
parents:
3425
diff
changeset
|
475 else if (INTEGERP (idx)) |
9d0af0f2dc0d
(access_keymap, store_in_keymap): Discard meaningless
Richard M. Stallman <rms@gnu.org>
parents:
3425
diff
changeset
|
476 /* 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
|
477 with more than 24 bits of integer. */ |
9312
dfaf1d41e53d
(synkey, access_keymap, store_in_keymap, Faccessible_keymaps,
Karl Heuer <kwzh@gnu.org>
parents:
9273
diff
changeset
|
478 XSETFASTINT (idx, XINT (idx) & (CHAR_META | (CHAR_META - 1))); |
250 | 479 |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
480 /* Handle the special meta -> esc mapping. */ |
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
481 if (INTEGERP (idx) && XUINT (idx) & meta_modifier) |
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
482 { |
32615
5f6178a60e6b
(access_keymap): If IDX has a meta prefix, and there's
Gerd Moellmann <gerd@gnu.org>
parents:
32559
diff
changeset
|
483 /* See if there is a meta-map. If there's none, there is |
5f6178a60e6b
(access_keymap): If IDX has a meta prefix, and there's
Gerd Moellmann <gerd@gnu.org>
parents:
32559
diff
changeset
|
484 no binding for IDX, unless a default binding exists in MAP. */ |
32739
5ce157b2eaa9
(fix_submap_inheritance): Don't do anything if parent_entry
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32615
diff
changeset
|
485 Lisp_Object meta_map = |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
486 get_keymap (access_keymap (map, meta_prefix_char, |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
487 t_ok, noinherit, autoload), |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
488 0, autoload); |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
489 if (CONSP (meta_map)) |
32615
5f6178a60e6b
(access_keymap): If IDX has a meta prefix, and there's
Gerd Moellmann <gerd@gnu.org>
parents:
32559
diff
changeset
|
490 { |
32739
5ce157b2eaa9
(fix_submap_inheritance): Don't do anything if parent_entry
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32615
diff
changeset
|
491 map = meta_map; |
32615
5f6178a60e6b
(access_keymap): If IDX has a meta prefix, and there's
Gerd Moellmann <gerd@gnu.org>
parents:
32559
diff
changeset
|
492 idx = make_number (XUINT (idx) & ~meta_modifier); |
5f6178a60e6b
(access_keymap): If IDX has a meta prefix, and there's
Gerd Moellmann <gerd@gnu.org>
parents:
32559
diff
changeset
|
493 } |
5f6178a60e6b
(access_keymap): If IDX has a meta prefix, and there's
Gerd Moellmann <gerd@gnu.org>
parents:
32559
diff
changeset
|
494 else if (t_ok) |
5f6178a60e6b
(access_keymap): If IDX has a meta prefix, and there's
Gerd Moellmann <gerd@gnu.org>
parents:
32559
diff
changeset
|
495 /* Set IDX to t, so that we only find a default binding. */ |
5f6178a60e6b
(access_keymap): If IDX has a meta prefix, and there's
Gerd Moellmann <gerd@gnu.org>
parents:
32559
diff
changeset
|
496 idx = Qt; |
5f6178a60e6b
(access_keymap): If IDX has a meta prefix, and there's
Gerd Moellmann <gerd@gnu.org>
parents:
32559
diff
changeset
|
497 else |
5f6178a60e6b
(access_keymap): If IDX has a meta prefix, and there's
Gerd Moellmann <gerd@gnu.org>
parents:
32559
diff
changeset
|
498 /* We know there is no binding. */ |
5f6178a60e6b
(access_keymap): If IDX has a meta prefix, and there's
Gerd Moellmann <gerd@gnu.org>
parents:
32559
diff
changeset
|
499 return Qnil; |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
500 } |
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
501 |
250 | 502 { |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
503 Lisp_Object tail; |
6502
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
504 Lisp_Object t_binding; |
250 | 505 |
6502
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
506 t_binding = Qnil; |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
507 for (tail = XCDR (map); |
32615
5f6178a60e6b
(access_keymap): If IDX has a meta prefix, and there's
Gerd Moellmann <gerd@gnu.org>
parents:
32559
diff
changeset
|
508 (CONSP (tail) |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
509 || (tail = get_keymap (tail, 0, autoload), CONSP (tail))); |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
510 tail = XCDR (tail)) |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
511 { |
6502
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
512 Lisp_Object binding; |
250 | 513 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
514 binding = XCAR (tail); |
9973
1d5a908f201e
(access_keymap): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9957
diff
changeset
|
515 if (SYMBOLP (binding)) |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
516 { |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
517 /* If NOINHERIT, stop finding prefix definitions |
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
518 after we pass a second occurrence of the `keymap' symbol. */ |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
519 if (noinherit && EQ (binding, Qkeymap)) |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
520 noprefix = 1; |
9973
1d5a908f201e
(access_keymap): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9957
diff
changeset
|
521 } |
1d5a908f201e
(access_keymap): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9957
diff
changeset
|
522 else if (CONSP (binding)) |
1d5a908f201e
(access_keymap): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9957
diff
changeset
|
523 { |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
524 if (EQ (XCAR (binding), idx)) |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
525 { |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
526 val = XCDR (binding); |
32038
0cb9cab990cb
(keymap_memberp): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
31989
diff
changeset
|
527 if (noprefix && KEYMAPP (val)) |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
528 return Qnil; |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
529 if (CONSP (val)) |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
530 fix_submap_inheritance (map, idx, val); |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
531 return get_keyelt (val, autoload); |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
532 } |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
533 if (t_ok && EQ (XCAR (binding), Qt)) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
534 t_binding = XCDR (binding); |
9973
1d5a908f201e
(access_keymap): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9957
diff
changeset
|
535 } |
1d5a908f201e
(access_keymap): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9957
diff
changeset
|
536 else if (VECTORP (binding)) |
1d5a908f201e
(access_keymap): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9957
diff
changeset
|
537 { |
9957
940847846909
(access_keymap, store_in_keymap): Use NATNUMP instead of its expansion.
Karl Heuer <kwzh@gnu.org>
parents:
9946
diff
changeset
|
538 if (NATNUMP (idx) && XFASTINT (idx) < XVECTOR (binding)->size) |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
539 { |
9973
1d5a908f201e
(access_keymap): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9957
diff
changeset
|
540 val = XVECTOR (binding)->contents[XFASTINT (idx)]; |
32038
0cb9cab990cb
(keymap_memberp): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
31989
diff
changeset
|
541 if (noprefix && KEYMAPP (val)) |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
542 return Qnil; |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
543 if (CONSP (val)) |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
544 fix_submap_inheritance (map, idx, val); |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
545 return get_keyelt (val, autoload); |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
546 } |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
547 } |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
548 else if (CHAR_TABLE_P (binding)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
549 { |
17932
78a128b99e05
(access_keymap, store_in_keymap): Don't look in a char-table
Richard M. Stallman <rms@gnu.org>
parents:
17861
diff
changeset
|
550 /* Character codes with modifiers |
78a128b99e05
(access_keymap, store_in_keymap): Don't look in a char-table
Richard M. Stallman <rms@gnu.org>
parents:
17861
diff
changeset
|
551 are not included in a char-table. |
78a128b99e05
(access_keymap, store_in_keymap): Don't look in a char-table
Richard M. Stallman <rms@gnu.org>
parents:
17861
diff
changeset
|
552 All character codes without modifiers are included. */ |
78a128b99e05
(access_keymap, store_in_keymap): Don't look in a char-table
Richard M. Stallman <rms@gnu.org>
parents:
17861
diff
changeset
|
553 if (NATNUMP (idx) |
78a128b99e05
(access_keymap, store_in_keymap): Don't look in a char-table
Richard M. Stallman <rms@gnu.org>
parents:
17861
diff
changeset
|
554 && ! (XFASTINT (idx) |
78a128b99e05
(access_keymap, store_in_keymap): Don't look in a char-table
Richard M. Stallman <rms@gnu.org>
parents:
17861
diff
changeset
|
555 & (CHAR_ALT | CHAR_SUPER | CHAR_HYPER |
78a128b99e05
(access_keymap, store_in_keymap): Don't look in a char-table
Richard M. Stallman <rms@gnu.org>
parents:
17861
diff
changeset
|
556 | CHAR_SHIFT | CHAR_CTL | CHAR_META))) |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
557 { |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
558 val = Faref (binding, idx); |
32038
0cb9cab990cb
(keymap_memberp): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
31989
diff
changeset
|
559 if (noprefix && KEYMAPP (val)) |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
560 return Qnil; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
561 if (CONSP (val)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
562 fix_submap_inheritance (map, idx, val); |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
563 return get_keyelt (val, autoload); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
564 } |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
565 } |
1264
6ba9d5aaace6
* keymap.c (access_keymap): Don't forget to QUIT while scanning
Jim Blandy <jimb@redhat.com>
parents:
1236
diff
changeset
|
566 |
6ba9d5aaace6
* keymap.c (access_keymap): Don't forget to QUIT while scanning
Jim Blandy <jimb@redhat.com>
parents:
1236
diff
changeset
|
567 QUIT; |
250 | 568 } |
1388
02226bff1476
* keymap.c (initial_define_lispy_key): New function, for defining
Jim Blandy <jimb@redhat.com>
parents:
1315
diff
changeset
|
569 |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
570 return get_keyelt (t_binding, autoload); |
1236
5e8c234e5f03
* keymap.c (access_keymap): Remove code to notice bindings for
Jim Blandy <jimb@redhat.com>
parents:
1209
diff
changeset
|
571 } |
250 | 572 } |
573 | |
574 /* Given OBJECT which was found in a slot in a keymap, | |
575 trace indirect definitions to get the actual definition of that slot. | |
576 An indirect definition is a list of the form | |
577 (KEYMAP . INDEX), where KEYMAP is a keymap or a symbol defined as one | |
578 and INDEX is the object to look up in KEYMAP to yield the definition. | |
579 | |
580 Also if OBJECT has a menu string as the first element, | |
6774
a29237d1fdca
(get_keymap): Pass 1 as ERROR to get_keymap_1.
Richard M. Stallman <rms@gnu.org>
parents:
6695
diff
changeset
|
581 remove that. Also remove a menu help string as second element. |
a29237d1fdca
(get_keymap): Pass 1 as ERROR to get_keymap_1.
Richard M. Stallman <rms@gnu.org>
parents:
6695
diff
changeset
|
582 |
a29237d1fdca
(get_keymap): Pass 1 as ERROR to get_keymap_1.
Richard M. Stallman <rms@gnu.org>
parents:
6695
diff
changeset
|
583 If AUTOLOAD is nonzero, load autoloadable keymaps |
a29237d1fdca
(get_keymap): Pass 1 as ERROR to get_keymap_1.
Richard M. Stallman <rms@gnu.org>
parents:
6695
diff
changeset
|
584 that are referred to with indirection. */ |
250 | 585 |
586 Lisp_Object | |
6774
a29237d1fdca
(get_keymap): Pass 1 as ERROR to get_keymap_1.
Richard M. Stallman <rms@gnu.org>
parents:
6695
diff
changeset
|
587 get_keyelt (object, autoload) |
250 | 588 register Lisp_Object object; |
6774
a29237d1fdca
(get_keymap): Pass 1 as ERROR to get_keymap_1.
Richard M. Stallman <rms@gnu.org>
parents:
6695
diff
changeset
|
589 int autoload; |
250 | 590 { |
591 while (1) | |
592 { | |
25128
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
593 if (!(CONSP (object))) |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
594 /* This is really the value. */ |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
595 return object; |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
596 |
25128
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
597 /* If the keymap contents looks like (keymap ...) or (lambda ...) |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
598 then use itself. */ |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
599 else if (EQ (XCAR (object), Qkeymap) || EQ (XCAR (object), Qlambda)) |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
600 return object; |
250 | 601 |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
602 /* If the keymap contents looks like (menu-item name . DEFN) |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
603 or (menu-item name DEFN ...) then use DEFN. |
29941
0c77254c90b8
(get_keyelt): For menu-items containing a `:filter
Gerd Moellmann <gerd@gnu.org>
parents:
29726
diff
changeset
|
604 This is a new format menu item. */ |
25128
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
605 else if (EQ (XCAR (object), Qmenu_item)) |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
606 { |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
607 if (CONSP (XCDR (object))) |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
608 { |
29941
0c77254c90b8
(get_keyelt): For menu-items containing a `:filter
Gerd Moellmann <gerd@gnu.org>
parents:
29726
diff
changeset
|
609 Lisp_Object tem; |
0c77254c90b8
(get_keyelt): For menu-items containing a `:filter
Gerd Moellmann <gerd@gnu.org>
parents:
29726
diff
changeset
|
610 |
25128
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
611 object = XCDR (XCDR (object)); |
29941
0c77254c90b8
(get_keyelt): For menu-items containing a `:filter
Gerd Moellmann <gerd@gnu.org>
parents:
29726
diff
changeset
|
612 tem = object; |
25128
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
613 if (CONSP (object)) |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
614 object = XCAR (object); |
29941
0c77254c90b8
(get_keyelt): For menu-items containing a `:filter
Gerd Moellmann <gerd@gnu.org>
parents:
29726
diff
changeset
|
615 |
0c77254c90b8
(get_keyelt): For menu-items containing a `:filter
Gerd Moellmann <gerd@gnu.org>
parents:
29726
diff
changeset
|
616 /* If there's a `:filter FILTER', apply FILTER to the |
0c77254c90b8
(get_keyelt): For menu-items containing a `:filter
Gerd Moellmann <gerd@gnu.org>
parents:
29726
diff
changeset
|
617 menu-item's definition to get the real definition to |
34515
35d7808fe9f6
(get_keyelt): Only eval the filter if `autoload' is set.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
34442
diff
changeset
|
618 use. */ |
29941
0c77254c90b8
(get_keyelt): For menu-items containing a `:filter
Gerd Moellmann <gerd@gnu.org>
parents:
29726
diff
changeset
|
619 for (; CONSP (tem) && CONSP (XCDR (tem)); tem = XCDR (tem)) |
34515
35d7808fe9f6
(get_keyelt): Only eval the filter if `autoload' is set.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
34442
diff
changeset
|
620 if (EQ (XCAR (tem), QCfilter) && autoload) |
29941
0c77254c90b8
(get_keyelt): For menu-items containing a `:filter
Gerd Moellmann <gerd@gnu.org>
parents:
29726
diff
changeset
|
621 { |
0c77254c90b8
(get_keyelt): For menu-items containing a `:filter
Gerd Moellmann <gerd@gnu.org>
parents:
29726
diff
changeset
|
622 Lisp_Object filter; |
0c77254c90b8
(get_keyelt): For menu-items containing a `:filter
Gerd Moellmann <gerd@gnu.org>
parents:
29726
diff
changeset
|
623 filter = XCAR (XCDR (tem)); |
0c77254c90b8
(get_keyelt): For menu-items containing a `:filter
Gerd Moellmann <gerd@gnu.org>
parents:
29726
diff
changeset
|
624 filter = list2 (filter, list2 (Qquote, object)); |
0c77254c90b8
(get_keyelt): For menu-items containing a `:filter
Gerd Moellmann <gerd@gnu.org>
parents:
29726
diff
changeset
|
625 object = menu_item_eval_property (filter); |
0c77254c90b8
(get_keyelt): For menu-items containing a `:filter
Gerd Moellmann <gerd@gnu.org>
parents:
29726
diff
changeset
|
626 break; |
0c77254c90b8
(get_keyelt): For menu-items containing a `:filter
Gerd Moellmann <gerd@gnu.org>
parents:
29726
diff
changeset
|
627 } |
25128
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
628 } |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
629 else |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
630 /* Invalid keymap */ |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
631 return object; |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
632 } |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
633 |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
634 /* If the keymap contents looks like (STRING . DEFN), use DEFN. |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
635 Keymap alist elements like (CHAR MENUSTRING . DEFN) |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
636 will be used by HierarKey menus. */ |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
637 else if (STRINGP (XCAR (object))) |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
638 { |
25128
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
639 object = XCDR (object); |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
640 /* Also remove a menu help string, if any, |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
641 following the menu item name. */ |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
642 if (CONSP (object) && STRINGP (XCAR (object))) |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
643 object = XCDR (object); |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
644 /* Also remove the sublist that caches key equivalences, if any. */ |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
645 if (CONSP (object) && CONSP (XCAR (object))) |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
646 { |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
647 Lisp_Object carcar; |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
648 carcar = XCAR (XCAR (object)); |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
649 if (NILP (carcar) || VECTORP (carcar)) |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
650 object = XCDR (object); |
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
651 } |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
652 } |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
653 |
25128
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
654 /* If the contents are (KEYMAP . ELEMENT), go indirect. */ |
250 | 655 else |
25128
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
656 { |
30134
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
657 Lisp_Object map; |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
658 map = get_keymap (Fcar_safe (object), 0, autoload); |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
659 return (!CONSP (map) ? object /* Invalid keymap */ |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
660 : access_keymap (map, Fcdr (object), 0, 0, autoload)); |
25128
2563b35e613f
(get_keymap_1, get_keyelt): Check the type of OBJECT
Karl Heuer <kwzh@gnu.org>
parents:
24572
diff
changeset
|
661 } |
250 | 662 } |
663 } | |
664 | |
31232
5213900983ed
(store_in_keymap): Add `static' to declaration.
Dave Love <fx@gnu.org>
parents:
31208
diff
changeset
|
665 static Lisp_Object |
250 | 666 store_in_keymap (keymap, idx, def) |
667 Lisp_Object keymap; | |
668 register Lisp_Object idx; | |
669 register Lisp_Object def; | |
670 { | |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
671 /* Flush any reverse-map cache. */ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
672 where_is_cache = Qnil; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
673 where_is_cache_keymaps = Qt; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
674 |
10367
e1c7a3f0c15f
(store_in_keymap): Copy a cons only if car is a string.
Richard M. Stallman <rms@gnu.org>
parents:
10305
diff
changeset
|
675 /* If we are preparing to dump, and DEF is a menu element |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
676 with a menu item indicator, copy it to ensure it is not pure. */ |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
677 if (CONSP (def) && PURE_P (def) |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
678 && (EQ (XCAR (def), Qmenu_item) || STRINGP (XCAR (def)))) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
679 def = Fcons (XCAR (def), XCDR (def)); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
680 |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
681 if (!CONSP (keymap) || ! EQ (XCAR (keymap), Qkeymap)) |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
682 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
|
683 |
250 | 684 /* If idx is a list (some sort of mouse click, perhaps?), |
685 the index we want to use is the car of the list, which | |
686 ought to be a symbol. */ | |
1315
884c3d7e7172
* keymap.c (access_keymap, store_in_keymap,
Jim Blandy <jimb@redhat.com>
parents:
1264
diff
changeset
|
687 idx = EVENT_HEAD (idx); |
250 | 688 |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
689 /* 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
|
690 be put in the canonical order. */ |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
691 if (SYMBOLP (idx)) |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
692 idx = reorder_modifiers (idx); |
3515
9d0af0f2dc0d
(access_keymap, store_in_keymap): Discard meaningless
Richard M. Stallman <rms@gnu.org>
parents:
3425
diff
changeset
|
693 else if (INTEGERP (idx)) |
9d0af0f2dc0d
(access_keymap, store_in_keymap): Discard meaningless
Richard M. Stallman <rms@gnu.org>
parents:
3425
diff
changeset
|
694 /* 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
|
695 with more than 24 bits of integer. */ |
9312
dfaf1d41e53d
(synkey, access_keymap, store_in_keymap, Faccessible_keymaps,
Karl Heuer <kwzh@gnu.org>
parents:
9273
diff
changeset
|
696 XSETFASTINT (idx, XINT (idx) & (CHAR_META | (CHAR_META - 1))); |
250 | 697 |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
698 /* 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
|
699 { |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
700 Lisp_Object tail; |
250 | 701 |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
702 /* 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
|
703 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
|
704 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
|
705 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
|
706 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
|
707 front of the keymap. */ |
6502
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
708 Lisp_Object insertion_point; |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
709 |
6502
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
710 insertion_point = keymap; |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
711 for (tail = XCDR (keymap); CONSP (tail); tail = XCDR (tail)) |
250 | 712 { |
6502
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
713 Lisp_Object elt; |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
714 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
715 elt = XCAR (tail); |
9973
1d5a908f201e
(access_keymap): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9957
diff
changeset
|
716 if (VECTORP (elt)) |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
717 { |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
718 if (NATNUMP (idx) && XFASTINT (idx) < ASIZE (elt)) |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
719 { |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
720 ASET (elt, XFASTINT (idx), def); |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
721 return def; |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
722 } |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
723 insertion_point = tail; |
9973
1d5a908f201e
(access_keymap): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9957
diff
changeset
|
724 } |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
725 else if (CHAR_TABLE_P (elt)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
726 { |
17932
78a128b99e05
(access_keymap, store_in_keymap): Don't look in a char-table
Richard M. Stallman <rms@gnu.org>
parents:
17861
diff
changeset
|
727 /* Character codes with modifiers |
78a128b99e05
(access_keymap, store_in_keymap): Don't look in a char-table
Richard M. Stallman <rms@gnu.org>
parents:
17861
diff
changeset
|
728 are not included in a char-table. |
78a128b99e05
(access_keymap, store_in_keymap): Don't look in a char-table
Richard M. Stallman <rms@gnu.org>
parents:
17861
diff
changeset
|
729 All character codes without modifiers are included. */ |
78a128b99e05
(access_keymap, store_in_keymap): Don't look in a char-table
Richard M. Stallman <rms@gnu.org>
parents:
17861
diff
changeset
|
730 if (NATNUMP (idx) |
78a128b99e05
(access_keymap, store_in_keymap): Don't look in a char-table
Richard M. Stallman <rms@gnu.org>
parents:
17861
diff
changeset
|
731 && ! (XFASTINT (idx) |
78a128b99e05
(access_keymap, store_in_keymap): Don't look in a char-table
Richard M. Stallman <rms@gnu.org>
parents:
17861
diff
changeset
|
732 & (CHAR_ALT | CHAR_SUPER | CHAR_HYPER |
78a128b99e05
(access_keymap, store_in_keymap): Don't look in a char-table
Richard M. Stallman <rms@gnu.org>
parents:
17861
diff
changeset
|
733 | CHAR_SHIFT | CHAR_CTL | CHAR_META))) |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
734 { |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
735 Faset (elt, idx, def); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
736 return def; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
737 } |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
738 insertion_point = tail; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
739 } |
9973
1d5a908f201e
(access_keymap): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9957
diff
changeset
|
740 else if (CONSP (elt)) |
1d5a908f201e
(access_keymap): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9957
diff
changeset
|
741 { |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
742 if (EQ (idx, XCAR (elt))) |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
743 { |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
744 XCDR (elt) = def; |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
745 return def; |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
746 } |
9973
1d5a908f201e
(access_keymap): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9957
diff
changeset
|
747 } |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
748 else if (EQ (elt, Qkeymap)) |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
749 /* If we find a 'keymap' symbol in the spine of KEYMAP, |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
750 then we must have found the start of a second keymap |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
751 being used as the tail of KEYMAP, and a binding for IDX |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
752 should be inserted before it. */ |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
753 goto keymap_end; |
1441
929409595312
* keymap.c (store_in_keymap): Don't forget to QUIT in the
Jim Blandy <jimb@redhat.com>
parents:
1388
diff
changeset
|
754 |
929409595312
* keymap.c (store_in_keymap): Don't forget to QUIT in the
Jim Blandy <jimb@redhat.com>
parents:
1388
diff
changeset
|
755 QUIT; |
250 | 756 } |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
757 |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
758 keymap_end: |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
759 /* 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
|
760 IDX. Let's add one. */ |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
761 XCDR (insertion_point) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
762 = Fcons (Fcons (idx, def), XCDR (insertion_point)); |
250 | 763 } |
32038
0cb9cab990cb
(keymap_memberp): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
31989
diff
changeset
|
764 |
250 | 765 return def; |
766 } | |
767 | |
20319
81424cf4d446
(copy_keymap_1): Fix return type.
Andreas Schwab <schwab@suse.de>
parents:
20076
diff
changeset
|
768 void |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
769 copy_keymap_1 (chartable, idx, elt) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
770 Lisp_Object chartable, idx, elt; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
771 { |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
772 if (CONSP (elt) && EQ (XCAR (elt), Qkeymap)) |
17861
f84a12392eab
(copy_keymap_1): Do nothing if ELT isn't a keymap.
Richard M. Stallman <rms@gnu.org>
parents:
17832
diff
changeset
|
773 Faset (chartable, idx, Fcopy_keymap (elt)); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
774 } |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
775 |
250 | 776 DEFUN ("copy-keymap", Fcopy_keymap, Scopy_keymap, 1, 1, 0, |
777 "Return a copy of the keymap KEYMAP.\n\ | |
778 The copy starts out with the same definitions of KEYMAP,\n\ | |
779 but changing either the copy or KEYMAP does not affect the other.\n\ | |
362 | 780 Any key definitions that are subkeymaps are recursively copied.\n\ |
781 However, a key definition which is a symbol whose definition is a keymap\n\ | |
782 is not copied.") | |
250 | 783 (keymap) |
784 Lisp_Object keymap; | |
785 { | |
786 register Lisp_Object copy, tail; | |
787 | |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
788 copy = Fcopy_alist (get_keymap (keymap, 1, 0)); |
250 | 789 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
790 for (tail = copy; CONSP (tail); tail = XCDR (tail)) |
250 | 791 { |
6502
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
792 Lisp_Object elt; |
250 | 793 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
794 elt = XCAR (tail); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
795 if (CHAR_TABLE_P (elt)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
796 { |
20076
374e09781f08
(Faccessible_keymaps): Avoid alloca for fixed-size array.
Karl Heuer <kwzh@gnu.org>
parents:
20070
diff
changeset
|
797 Lisp_Object indices[3]; |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
798 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
799 elt = Fcopy_sequence (elt); |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
800 XCAR (tail) = elt; |
18142
c9bd973ca168
(Fcopy_keymap): After copying a sub-char-table, do store the copy.
Richard M. Stallman <rms@gnu.org>
parents:
17932
diff
changeset
|
801 |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
802 map_char_table (copy_keymap_1, Qnil, elt, elt, 0, indices); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
803 } |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
804 else if (VECTORP (elt)) |
250 | 805 { |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
806 int i; |
250 | 807 |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
808 elt = Fcopy_sequence (elt); |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
809 XCAR (tail) = elt; |
250 | 810 |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
811 for (i = 0; i < ASIZE (elt); i++) |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
812 if (CONSP (AREF (elt, i)) && EQ (XCAR (AREF (elt, i)), Qkeymap)) |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
813 ASET (elt, i, Fcopy_keymap (AREF (elt, i))); |
250 | 814 } |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
815 else if (CONSP (elt) && CONSP (XCDR (elt))) |
6456
9854df0e91e1
(Fcopy_keymap): Account for menus and equiv-key cache.
Karl Heuer <kwzh@gnu.org>
parents:
6021
diff
changeset
|
816 { |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
817 Lisp_Object tem; |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
818 tem = XCDR (elt); |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
819 |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
820 /* Is this a new format menu item. */ |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
821 if (EQ (XCAR (tem),Qmenu_item)) |
6456
9854df0e91e1
(Fcopy_keymap): Account for menus and equiv-key cache.
Karl Heuer <kwzh@gnu.org>
parents:
6021
diff
changeset
|
822 { |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
823 /* Copy cell with menu-item marker. */ |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
824 XCDR (elt) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
825 = Fcons (XCAR (tem), XCDR (tem)); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
826 elt = XCDR (elt); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
827 tem = XCDR (elt); |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
828 if (CONSP (tem)) |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
829 { |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
830 /* Copy cell with menu-item name. */ |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
831 XCDR (elt) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
832 = Fcons (XCAR (tem), XCDR (tem)); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
833 elt = XCDR (elt); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
834 tem = XCDR (elt); |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
835 }; |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
836 if (CONSP (tem)) |
6456
9854df0e91e1
(Fcopy_keymap): Account for menus and equiv-key cache.
Karl Heuer <kwzh@gnu.org>
parents:
6021
diff
changeset
|
837 { |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
838 /* Copy cell with binding and if the binding is a keymap, |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
839 copy that. */ |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
840 XCDR (elt) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
841 = Fcons (XCAR (tem), XCDR (tem)); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
842 elt = XCDR (elt); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
843 tem = XCAR (elt); |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
844 if (CONSP (tem) && EQ (XCAR (tem), Qkeymap)) |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
845 XCAR (elt) = Fcopy_keymap (tem); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
846 tem = XCDR (elt); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
847 if (CONSP (tem) && CONSP (XCAR (tem))) |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
848 /* Delete cache for key equivalences. */ |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
849 XCDR (elt) = XCDR (tem); |
6456
9854df0e91e1
(Fcopy_keymap): Account for menus and equiv-key cache.
Karl Heuer <kwzh@gnu.org>
parents:
6021
diff
changeset
|
850 } |
9854df0e91e1
(Fcopy_keymap): Account for menus and equiv-key cache.
Karl Heuer <kwzh@gnu.org>
parents:
6021
diff
changeset
|
851 } |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
852 else |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
853 { |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
854 /* It may be an old fomat menu item. |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
855 Skip the optional menu string. |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
856 */ |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
857 if (STRINGP (XCAR (tem))) |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
858 { |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
859 /* Copy the cell, since copy-alist didn't go this deep. */ |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
860 XCDR (elt) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
861 = Fcons (XCAR (tem), XCDR (tem)); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
862 elt = XCDR (elt); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
863 tem = XCDR (elt); |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
864 /* Also skip the optional menu help string. */ |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
865 if (CONSP (tem) && STRINGP (XCAR (tem))) |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
866 { |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
867 XCDR (elt) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
868 = Fcons (XCAR (tem), XCDR (tem)); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
869 elt = XCDR (elt); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
870 tem = XCDR (elt); |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
871 } |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
872 /* There may also be a list that caches key equivalences. |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
873 Just delete it for the new keymap. */ |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
874 if (CONSP (tem) |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
875 && CONSP (XCAR (tem)) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
876 && (NILP (XCAR (XCAR (tem))) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
877 || VECTORP (XCAR (XCAR (tem))))) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
878 XCDR (elt) = XCDR (tem); |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
879 } |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
880 if (CONSP (elt) |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
881 && CONSP (XCDR (elt)) |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
882 && EQ (XCAR (XCDR (elt)), Qkeymap)) |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
883 XCDR (elt) = Fcopy_keymap (XCDR (elt)); |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
884 } |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
885 |
6456
9854df0e91e1
(Fcopy_keymap): Account for menus and equiv-key cache.
Karl Heuer <kwzh@gnu.org>
parents:
6021
diff
changeset
|
886 } |
250 | 887 } |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
888 |
250 | 889 return copy; |
890 } | |
891 | |
465 | 892 /* Simple Keymap mutators and accessors. */ |
893 | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
894 /* GC is possible in this function if it autoloads a keymap. */ |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
895 |
250 | 896 DEFUN ("define-key", Fdefine_key, Sdefine_key, 3, 3, 0, |
897 "Args KEYMAP, KEY, DEF. Define key sequence KEY, in KEYMAP, as DEF.\n\ | |
898 KEYMAP is a keymap. KEY is a string or a vector of symbols and characters\n\ | |
899 meaning a sequence of keystrokes and events.\n\ | |
5100 | 900 Non-ASCII characters with codes above 127 (such as ISO Latin-1)\n\ |
901 can be included if you use a vector.\n\ | |
250 | 902 DEF is anything that can be a key's definition:\n\ |
903 nil (means key is undefined in this keymap),\n\ | |
904 a command (a Lisp function suitable for interactive calling)\n\ | |
905 a string (treated as a keyboard macro),\n\ | |
906 a keymap (to define a prefix key),\n\ | |
907 a symbol. When the key is looked up, the symbol will stand for its\n\ | |
908 function definition, which should at that time be one of the above,\n\ | |
909 or another symbol whose function definition is used, etc.\n\ | |
910 a cons (STRING . DEFN), meaning that DEFN is the definition\n\ | |
911 (DEFN should be a valid definition in its own right),\n\ | |
368 | 912 or a cons (KEYMAP . CHAR), meaning use definition of CHAR in map KEYMAP.\n\ |
913 \n\ | |
914 If KEYMAP is a sparse keymap, the pair binding KEY to DEF is added at\n\ | |
915 the front of KEYMAP.") | |
250 | 916 (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
|
917 Lisp_Object keymap; |
250 | 918 Lisp_Object key; |
919 Lisp_Object def; | |
920 { | |
921 register int idx; | |
922 register Lisp_Object c; | |
923 register Lisp_Object cmd; | |
924 int metized = 0; | |
2059 | 925 int meta_bit; |
250 | 926 int length; |
1517
72b7bbcaf7d8
* keymap.c (Fdefine_key, Flookup_key, describe_map): Don't assume
Jim Blandy <jimb@redhat.com>
parents:
1441
diff
changeset
|
927 struct gcpro gcpro1, gcpro2, gcpro3; |
250 | 928 |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
929 keymap = get_keymap (keymap, 1, 1); |
250 | 930 |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
931 if (!VECTORP (key) && !STRINGP (key)) |
250 | 932 key = wrong_type_argument (Qarrayp, key); |
933 | |
1517
72b7bbcaf7d8
* keymap.c (Fdefine_key, Flookup_key, describe_map): Don't assume
Jim Blandy <jimb@redhat.com>
parents:
1441
diff
changeset
|
934 length = XFASTINT (Flength (key)); |
250 | 935 if (length == 0) |
936 return Qnil; | |
937 | |
12297
fe458a8ecfa2
(Vdefine_key_rebound_commands): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
12262
diff
changeset
|
938 if (SYMBOLP (def) && !EQ (Vdefine_key_rebound_commands, Qt)) |
fe458a8ecfa2
(Vdefine_key_rebound_commands): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
12262
diff
changeset
|
939 Vdefine_key_rebound_commands = Fcons (def, Vdefine_key_rebound_commands); |
fe458a8ecfa2
(Vdefine_key_rebound_commands): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
12262
diff
changeset
|
940 |
1517
72b7bbcaf7d8
* keymap.c (Fdefine_key, Flookup_key, describe_map): Don't assume
Jim Blandy <jimb@redhat.com>
parents:
1441
diff
changeset
|
941 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
|
942 |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
943 if (VECTORP (key)) |
2059 | 944 meta_bit = meta_modifier; |
945 else | |
946 meta_bit = 0x80; | |
947 | |
250 | 948 idx = 0; |
949 while (1) | |
950 { | |
951 c = Faref (key, make_number (idx)); | |
952 | |
10840
3a7336f191b9
(Fdefine_key): Handle Lucid-style (crtl backspace) etc.
Richard M. Stallman <rms@gnu.org>
parents:
10810
diff
changeset
|
953 if (CONSP (c) && lucid_event_type_list_p (c)) |
12151
43b030e896eb
(Flookup_key, Fdefine_key): Use Fevent_convert_list.
Karl Heuer <kwzh@gnu.org>
parents:
11973
diff
changeset
|
954 c = Fevent_convert_list (c); |
10840
3a7336f191b9
(Fdefine_key): Handle Lucid-style (crtl backspace) etc.
Richard M. Stallman <rms@gnu.org>
parents:
10810
diff
changeset
|
955 |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
956 if (INTEGERP (c) |
2059 | 957 && (XINT (c) & meta_bit) |
250 | 958 && !metized) |
959 { | |
960 c = meta_prefix_char; | |
961 metized = 1; | |
962 } | |
963 else | |
964 { | |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
965 if (INTEGERP (c)) |
2093
ce8bad247b1a
(Fdefine_key): Use proper meta-bit to clear.
Richard M. Stallman <rms@gnu.org>
parents:
2059
diff
changeset
|
966 XSETINT (c, XINT (c) & ~meta_bit); |
250 | 967 |
968 metized = 0; | |
969 idx++; | |
970 } | |
971 | |
6473
76bb655df959
(Fdefine_key): Check for non-events in keyvector.
Karl Heuer <kwzh@gnu.org>
parents:
6457
diff
changeset
|
972 if (! INTEGERP (c) && ! SYMBOLP (c) && ! CONSP (c)) |
8517
a7fe53588b6f
(Fdefine_key): Fix error message.
Richard M. Stallman <rms@gnu.org>
parents:
8473
diff
changeset
|
973 error ("Key sequence contains invalid events"); |
6473
76bb655df959
(Fdefine_key): Check for non-events in keyvector.
Karl Heuer <kwzh@gnu.org>
parents:
6457
diff
changeset
|
974 |
250 | 975 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
|
976 RETURN_UNGCPRO (store_in_keymap (keymap, c, def)); |
250 | 977 |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
978 cmd = access_keymap (keymap, c, 0, 1, 1); |
250 | 979 |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
980 /* If this key is undefined, make it a prefix. */ |
485 | 981 if (NILP (cmd)) |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
982 cmd = define_as_prefix (keymap, c); |
250 | 983 |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
984 keymap = get_keymap (cmd, 0, 1); |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
985 if (!CONSP (keymap)) |
6502
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
986 /* We must use Fkey_description rather than just passing key to |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
987 error; key might be a vector, not a string. */ |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
988 error ("Key sequence %s uses invalid prefix characters", |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
989 XSTRING (Fkey_description (key))->data); |
250 | 990 } |
991 } | |
992 | |
993 /* Value is number if KEY is too long; NIL if valid but has no definition. */ | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
994 /* GC is possible in this function if it autoloads a keymap. */ |
250 | 995 |
1871
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
996 DEFUN ("lookup-key", Flookup_key, Slookup_key, 2, 3, 0, |
250 | 997 "In keymap KEYMAP, look up key sequence KEY. Return the definition.\n\ |
998 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
|
999 \n\ |
250 | 1000 A number as value means KEY is \"too long\";\n\ |
1001 that is, characters or symbols in it except for the last one\n\ | |
1002 fail to be a valid sequence of prefix characters in KEYMAP.\n\ | |
1003 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
|
1004 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
|
1005 \n\ |
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1006 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
|
1007 bindings, used when nothing else in the keymap applies; this makes it\n\ |
13947 | 1008 usable as a general function for probing keymaps. However, if the\n\ |
1871
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1009 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
|
1010 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
|
1011 (keymap, key, accept_default) |
250 | 1012 register Lisp_Object keymap; |
1013 Lisp_Object key; | |
1871
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1014 Lisp_Object accept_default; |
250 | 1015 { |
1016 register int idx; | |
1017 register Lisp_Object cmd; | |
1018 register Lisp_Object c; | |
1019 int length; | |
1871
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1020 int t_ok = ! NILP (accept_default); |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1021 struct gcpro gcpro1; |
250 | 1022 |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1023 keymap = get_keymap (keymap, 1, 1); |
250 | 1024 |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
1025 if (!VECTORP (key) && !STRINGP (key)) |
250 | 1026 key = wrong_type_argument (Qarrayp, key); |
1027 | |
1517
72b7bbcaf7d8
* keymap.c (Fdefine_key, Flookup_key, describe_map): Don't assume
Jim Blandy <jimb@redhat.com>
parents:
1441
diff
changeset
|
1028 length = XFASTINT (Flength (key)); |
250 | 1029 if (length == 0) |
1030 return keymap; | |
1031 | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1032 GCPRO1 (key); |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1033 |
250 | 1034 idx = 0; |
1035 while (1) | |
1036 { | |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
1037 c = Faref (key, make_number (idx++)); |
250 | 1038 |
10840
3a7336f191b9
(Fdefine_key): Handle Lucid-style (crtl backspace) etc.
Richard M. Stallman <rms@gnu.org>
parents:
10810
diff
changeset
|
1039 if (CONSP (c) && lucid_event_type_list_p (c)) |
12151
43b030e896eb
(Flookup_key, Fdefine_key): Use Fevent_convert_list.
Karl Heuer <kwzh@gnu.org>
parents:
11973
diff
changeset
|
1040 c = Fevent_convert_list (c); |
10840
3a7336f191b9
(Fdefine_key): Handle Lucid-style (crtl backspace) etc.
Richard M. Stallman <rms@gnu.org>
parents:
10810
diff
changeset
|
1041 |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
1042 /* Turn the 8th bit of string chars into a meta modifier. */ |
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
1043 if (XINT (c) & 0x80 && STRINGP (key)) |
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
1044 XSETINT (c, (XINT (c) | meta_modifier) & ~0x80); |
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
1045 |
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
1046 cmd = access_keymap (keymap, c, t_ok, 0, 1); |
250 | 1047 if (idx == length) |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1048 RETURN_UNGCPRO (cmd); |
250 | 1049 |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1050 keymap = get_keymap (cmd, 0, 1); |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1051 if (!CONSP (keymap)) |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1052 RETURN_UNGCPRO (make_number (idx)); |
250 | 1053 |
1054 QUIT; | |
1055 } | |
1056 } | |
1057 | |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
1058 /* 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
|
1059 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
|
1060 Return the keymap. */ |
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
1061 |
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
1062 static Lisp_Object |
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
1063 define_as_prefix (keymap, c) |
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
1064 Lisp_Object keymap, c; |
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
1065 { |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
1066 Lisp_Object cmd; |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
1067 |
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
1068 cmd = Fmake_sparse_keymap (Qnil); |
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
1069 /* 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
|
1070 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
|
1071 inherit the other prefix definition. */ |
32476
9b2a0dc393a4
* keymap.c (access_keymap): Add AUTOLOAD parameter.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32145
diff
changeset
|
1072 cmd = nconc2 (cmd, access_keymap (keymap, c, 0, 0, 0)); |
3735
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
1073 store_in_keymap (keymap, c, cmd); |
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
1074 |
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
1075 return cmd; |
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
1076 } |
7193a99a87c1
Make prefix keys work with keymap inheritance
Richard M. Stallman <rms@gnu.org>
parents:
3691
diff
changeset
|
1077 |
2093
ce8bad247b1a
(Fdefine_key): Use proper meta-bit to clear.
Richard M. Stallman <rms@gnu.org>
parents:
2059
diff
changeset
|
1078 /* 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
|
1079 |
250 | 1080 Lisp_Object |
1081 append_key (key_sequence, key) | |
1082 Lisp_Object key_sequence, key; | |
1083 { | |
1084 Lisp_Object args[2]; | |
1085 | |
1086 args[0] = key_sequence; | |
1087 | |
2093
ce8bad247b1a
(Fdefine_key): Use proper meta-bit to clear.
Richard M. Stallman <rms@gnu.org>
parents:
2059
diff
changeset
|
1088 args[1] = Fcons (key, Qnil); |
ce8bad247b1a
(Fdefine_key): Use proper meta-bit to clear.
Richard M. Stallman <rms@gnu.org>
parents:
2059
diff
changeset
|
1089 return Fvconcat (2, args); |
250 | 1090 } |
1091 | |
1092 | |
465 | 1093 /* Global, local, and minor mode keymap stuff. */ |
1094 | |
485 | 1095 /* We can't put these variables inside current_minor_maps, since under |
517 | 1096 some systems, static gets macro-defined to be the empty string. |
1097 Ickypoo. */ | |
485 | 1098 static Lisp_Object *cmm_modes, *cmm_maps; |
1099 static int cmm_size; | |
1100 | |
12542
f86a10208f7e
(current_minor_maps): Catch errors in Findirect_function.
Karl Heuer <kwzh@gnu.org>
parents:
12297
diff
changeset
|
1101 /* Error handler used in current_minor_maps. */ |
f86a10208f7e
(current_minor_maps): Catch errors in Findirect_function.
Karl Heuer <kwzh@gnu.org>
parents:
12297
diff
changeset
|
1102 static Lisp_Object |
f86a10208f7e
(current_minor_maps): Catch errors in Findirect_function.
Karl Heuer <kwzh@gnu.org>
parents:
12297
diff
changeset
|
1103 current_minor_maps_error () |
f86a10208f7e
(current_minor_maps): Catch errors in Findirect_function.
Karl Heuer <kwzh@gnu.org>
parents:
12297
diff
changeset
|
1104 { |
f86a10208f7e
(current_minor_maps): Catch errors in Findirect_function.
Karl Heuer <kwzh@gnu.org>
parents:
12297
diff
changeset
|
1105 return Qnil; |
f86a10208f7e
(current_minor_maps): Catch errors in Findirect_function.
Karl Heuer <kwzh@gnu.org>
parents:
12297
diff
changeset
|
1106 } |
f86a10208f7e
(current_minor_maps): Catch errors in Findirect_function.
Karl Heuer <kwzh@gnu.org>
parents:
12297
diff
changeset
|
1107 |
465 | 1108 /* Store a pointer to an array of the keymaps of the currently active |
1109 minor modes in *buf, and return the number of maps it contains. | |
1110 | |
1111 This function always returns a pointer to the same buffer, and may | |
1112 free or reallocate it, so if you want to keep it for a long time or | |
1113 hand it out to lisp code, copy it. This procedure will be called | |
1114 for every key sequence read, so the nice lispy approach (return a | |
1115 new assoclist, list, what have you) for each invocation would | |
1116 result in a lot of consing over time. | |
1117 | |
1118 If we used xrealloc/xmalloc and ran out of memory, they would throw | |
1119 back to the command loop, which would try to read a key sequence, | |
1120 which would call this function again, resulting in an infinite | |
1121 loop. Instead, we'll use realloc/malloc and silently truncate the | |
1122 list, let the key sequence be read, and hope some other piece of | |
1123 code signals the error. */ | |
1124 int | |
1125 current_minor_maps (modeptr, mapptr) | |
1126 Lisp_Object **modeptr, **mapptr; | |
1127 { | |
1128 int i = 0; | |
20517
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1129 int list_number = 0; |
517 | 1130 Lisp_Object alist, assoc, var, val; |
20517
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1131 Lisp_Object lists[2]; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1132 |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1133 lists[0] = Vminor_mode_overriding_map_alist; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1134 lists[1] = Vminor_mode_map_alist; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1135 |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1136 for (list_number = 0; list_number < 2; list_number++) |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1137 for (alist = lists[list_number]; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1138 CONSP (alist); |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1139 alist = XCDR (alist)) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1140 if ((assoc = XCAR (alist), CONSP (assoc)) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1141 && (var = XCAR (assoc), SYMBOLP (var)) |
20517
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1142 && (val = find_symbol_value (var), ! EQ (val, Qunbound)) |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1143 && ! NILP (val)) |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1144 { |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1145 Lisp_Object temp; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1146 |
20576 | 1147 /* If a variable has an entry in Vminor_mode_overriding_map_alist, |
1148 and also an entry in Vminor_mode_map_alist, | |
1149 ignore the latter. */ | |
1150 if (list_number == 1) | |
1151 { | |
1152 val = assq_no_quit (var, lists[0]); | |
1153 if (!NILP (val)) | |
1154 break; | |
1155 } | |
1156 | |
20517
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1157 if (i >= cmm_size) |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1158 { |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1159 Lisp_Object *newmodes, *newmaps; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1160 |
34359
09d0a988515c
(current_minor_maps): Use malloc. Prevent a leak.
Gerd Moellmann <gerd@gnu.org>
parents:
32992
diff
changeset
|
1161 /* Use malloc/realloc here. See the comment above |
09d0a988515c
(current_minor_maps): Use malloc. Prevent a leak.
Gerd Moellmann <gerd@gnu.org>
parents:
32992
diff
changeset
|
1162 this function. */ |
20517
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1163 if (cmm_maps) |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1164 { |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1165 BLOCK_INPUT; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1166 cmm_size *= 2; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1167 newmodes |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1168 = (Lisp_Object *) realloc (cmm_modes, |
34359
09d0a988515c
(current_minor_maps): Use malloc. Prevent a leak.
Gerd Moellmann <gerd@gnu.org>
parents:
32992
diff
changeset
|
1169 cmm_size * sizeof *newmodes); |
20517
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1170 newmaps |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1171 = (Lisp_Object *) realloc (cmm_maps, |
34359
09d0a988515c
(current_minor_maps): Use malloc. Prevent a leak.
Gerd Moellmann <gerd@gnu.org>
parents:
32992
diff
changeset
|
1172 cmm_size * sizeof *newmaps); |
20517
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1173 UNBLOCK_INPUT; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1174 } |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1175 else |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1176 { |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1177 BLOCK_INPUT; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1178 cmm_size = 30; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1179 newmodes |
34359
09d0a988515c
(current_minor_maps): Use malloc. Prevent a leak.
Gerd Moellmann <gerd@gnu.org>
parents:
32992
diff
changeset
|
1180 = (Lisp_Object *) malloc (cmm_size * sizeof *newmodes); |
20517
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1181 newmaps |
34359
09d0a988515c
(current_minor_maps): Use malloc. Prevent a leak.
Gerd Moellmann <gerd@gnu.org>
parents:
32992
diff
changeset
|
1182 = (Lisp_Object *) malloc (cmm_size * sizeof *newmaps); |
20517
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1183 UNBLOCK_INPUT; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1184 } |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1185 |
34359
09d0a988515c
(current_minor_maps): Use malloc. Prevent a leak.
Gerd Moellmann <gerd@gnu.org>
parents:
32992
diff
changeset
|
1186 if (newmodes) |
09d0a988515c
(current_minor_maps): Use malloc. Prevent a leak.
Gerd Moellmann <gerd@gnu.org>
parents:
32992
diff
changeset
|
1187 cmm_modes = newmodes; |
09d0a988515c
(current_minor_maps): Use malloc. Prevent a leak.
Gerd Moellmann <gerd@gnu.org>
parents:
32992
diff
changeset
|
1188 if (newmaps) |
09d0a988515c
(current_minor_maps): Use malloc. Prevent a leak.
Gerd Moellmann <gerd@gnu.org>
parents:
32992
diff
changeset
|
1189 cmm_maps = newmaps; |
09d0a988515c
(current_minor_maps): Use malloc. Prevent a leak.
Gerd Moellmann <gerd@gnu.org>
parents:
32992
diff
changeset
|
1190 |
09d0a988515c
(current_minor_maps): Use malloc. Prevent a leak.
Gerd Moellmann <gerd@gnu.org>
parents:
32992
diff
changeset
|
1191 if (newmodes == NULL || newmaps == NULL) |
20517
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1192 break; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1193 } |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1194 |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1195 /* Get the keymap definition--or nil if it is not defined. */ |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1196 temp = internal_condition_case_1 (Findirect_function, |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1197 XCDR (assoc), |
20517
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1198 Qerror, current_minor_maps_error); |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1199 if (!NILP (temp)) |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1200 { |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1201 cmm_modes[i] = var; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1202 cmm_maps [i] = temp; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1203 i++; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1204 } |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
1205 } |
465 | 1206 |
485 | 1207 if (modeptr) *modeptr = cmm_modes; |
1208 if (mapptr) *mapptr = cmm_maps; | |
465 | 1209 return i; |
1210 } | |
1211 | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1212 /* GC is possible in this function if it autoloads a keymap. */ |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1213 |
1871
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1214 DEFUN ("key-binding", Fkey_binding, Skey_binding, 1, 2, 0, |
250 | 1215 "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
|
1216 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
|
1217 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
|
1218 \n\ |
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1219 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
|
1220 bindings, used when nothing else in the keymap applies; this makes it\n\ |
5055
bbe5bba17b10
(Fkey_binding): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
1221 usable as a general function for probing keymaps. However, if the\n\ |
bbe5bba17b10
(Fkey_binding): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
1222 optional second argument ACCEPT-DEFAULT is non-nil, `key-binding' does\n\ |
1871
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1223 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
|
1224 (key, accept_default) |
6834
6a77fcbb5d44
(Fkey_binding): Declare accept_default.
Richard M. Stallman <rms@gnu.org>
parents:
6774
diff
changeset
|
1225 Lisp_Object key, accept_default; |
250 | 1226 { |
465 | 1227 Lisp_Object *maps, value; |
1228 int nmaps, i; | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1229 struct gcpro gcpro1; |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1230 |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1231 GCPRO1 (key); |
465 | 1232 |
12262
a7d5578ebb25
(Fkey_binding, describe_buffer_bindings):
Karl Heuer <kwzh@gnu.org>
parents:
12151
diff
changeset
|
1233 if (!NILP (current_kboard->Voverriding_terminal_local_map)) |
a7d5578ebb25
(Fkey_binding, describe_buffer_bindings):
Karl Heuer <kwzh@gnu.org>
parents:
12151
diff
changeset
|
1234 { |
a7d5578ebb25
(Fkey_binding, describe_buffer_bindings):
Karl Heuer <kwzh@gnu.org>
parents:
12151
diff
changeset
|
1235 value = Flookup_key (current_kboard->Voverriding_terminal_local_map, |
a7d5578ebb25
(Fkey_binding, describe_buffer_bindings):
Karl Heuer <kwzh@gnu.org>
parents:
12151
diff
changeset
|
1236 key, accept_default); |
a7d5578ebb25
(Fkey_binding, describe_buffer_bindings):
Karl Heuer <kwzh@gnu.org>
parents:
12151
diff
changeset
|
1237 if (! NILP (value) && !INTEGERP (value)) |
a7d5578ebb25
(Fkey_binding, describe_buffer_bindings):
Karl Heuer <kwzh@gnu.org>
parents:
12151
diff
changeset
|
1238 RETURN_UNGCPRO (value); |
a7d5578ebb25
(Fkey_binding, describe_buffer_bindings):
Karl Heuer <kwzh@gnu.org>
parents:
12151
diff
changeset
|
1239 } |
a7d5578ebb25
(Fkey_binding, describe_buffer_bindings):
Karl Heuer <kwzh@gnu.org>
parents:
12151
diff
changeset
|
1240 else if (!NILP (Voverriding_local_map)) |
250 | 1241 { |
5613
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
1242 value = Flookup_key (Voverriding_local_map, key, accept_default); |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
1243 if (! NILP (value) && !INTEGERP (value)) |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1244 RETURN_UNGCPRO (value); |
250 | 1245 } |
5613
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
1246 else |
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
1247 { |
13771
28790743a5a3
(Fkey_binding): Handle text-property keymaps.
Karl Heuer <kwzh@gnu.org>
parents:
13343
diff
changeset
|
1248 Lisp_Object local; |
28790743a5a3
(Fkey_binding): Handle text-property keymaps.
Karl Heuer <kwzh@gnu.org>
parents:
13343
diff
changeset
|
1249 |
5613
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
1250 nmaps = current_minor_maps (0, &maps); |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1251 /* Note that all these maps are GCPRO'd |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1252 in the places where we found them. */ |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1253 |
5613
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
1254 for (i = 0; i < nmaps; i++) |
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
1255 if (! NILP (maps[i])) |
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
1256 { |
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
1257 value = Flookup_key (maps[i], key, accept_default); |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
1258 if (! NILP (value) && !INTEGERP (value)) |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1259 RETURN_UNGCPRO (value); |
5613
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
1260 } |
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
1261 |
35258
f585b46c055a
Call get_local_map with new argument list.
Gerd Moellmann <gerd@gnu.org>
parents:
34906
diff
changeset
|
1262 local = get_local_map (PT, current_buffer, Qkeymap); |
29282 | 1263 if (! NILP (local)) |
1264 { | |
1265 value = Flookup_key (local, key, accept_default); | |
1266 if (! NILP (value) && !INTEGERP (value)) | |
1267 RETURN_UNGCPRO (value); | |
1268 } | |
1269 | |
35258
f585b46c055a
Call get_local_map with new argument list.
Gerd Moellmann <gerd@gnu.org>
parents:
34906
diff
changeset
|
1270 local = get_local_map (PT, current_buffer, Qlocal_map); |
13771
28790743a5a3
(Fkey_binding): Handle text-property keymaps.
Karl Heuer <kwzh@gnu.org>
parents:
13343
diff
changeset
|
1271 |
28790743a5a3
(Fkey_binding): Handle text-property keymaps.
Karl Heuer <kwzh@gnu.org>
parents:
13343
diff
changeset
|
1272 if (! NILP (local)) |
5613
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
1273 { |
13771
28790743a5a3
(Fkey_binding): Handle text-property keymaps.
Karl Heuer <kwzh@gnu.org>
parents:
13343
diff
changeset
|
1274 value = Flookup_key (local, key, accept_default); |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
1275 if (! NILP (value) && !INTEGERP (value)) |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1276 RETURN_UNGCPRO (value); |
5613
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
1277 } |
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
1278 } |
465 | 1279 |
1871
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1280 value = Flookup_key (current_global_map, key, accept_default); |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1281 UNGCPRO; |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
1282 if (! NILP (value) && !INTEGERP (value)) |
465 | 1283 return value; |
1284 | |
1285 return Qnil; | |
250 | 1286 } |
1287 | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1288 /* GC is possible in this function if it autoloads a keymap. */ |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1289 |
1871
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1290 DEFUN ("local-key-binding", Flocal_key_binding, Slocal_key_binding, 1, 2, 0, |
250 | 1291 "Return the binding for command KEYS in current local keymap only.\n\ |
1292 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
|
1293 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
|
1294 \n\ |
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1295 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
|
1296 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
|
1297 (keys, accept_default) |
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1298 Lisp_Object keys, accept_default; |
250 | 1299 { |
1300 register Lisp_Object map; | |
1301 map = current_buffer->keymap; | |
485 | 1302 if (NILP (map)) |
250 | 1303 return Qnil; |
1871
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1304 return Flookup_key (map, keys, accept_default); |
250 | 1305 } |
1306 | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1307 /* GC is possible in this function if it autoloads a keymap. */ |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1308 |
1871
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1309 DEFUN ("global-key-binding", Fglobal_key_binding, Sglobal_key_binding, 1, 2, 0, |
250 | 1310 "Return the binding for command KEYS in current global keymap only.\n\ |
1311 KEYS is a string, a sequence of keystrokes.\n\ | |
517 | 1312 The binding is probably a symbol with a function definition.\n\ |
1313 This function's return values are the same as those of lookup-key\n\ | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1314 \(which see).\n\ |
1871
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1315 \n\ |
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1316 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
|
1317 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
|
1318 (keys, accept_default) |
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1319 Lisp_Object keys, accept_default; |
250 | 1320 { |
1871
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1321 return Flookup_key (current_global_map, keys, accept_default); |
250 | 1322 } |
1323 | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1324 /* GC is possible in this function if it autoloads a keymap. */ |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1325 |
1871
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1326 DEFUN ("minor-mode-key-binding", Fminor_mode_key_binding, Sminor_mode_key_binding, 1, 2, 0, |
465 | 1327 "Find the visible minor mode bindings of KEY.\n\ |
1328 Return an alist of pairs (MODENAME . BINDING), where MODENAME is the\n\ | |
1329 the symbol which names the minor mode binding KEY, and BINDING is\n\ | |
1330 KEY's definition in that mode. In particular, if KEY has no\n\ | |
1331 minor-mode bindings, return nil. If the first binding is a\n\ | |
1332 non-prefix, all subsequent bindings will be omitted, since they would\n\ | |
1333 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
|
1334 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
|
1335 \n\ |
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1336 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
|
1337 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
|
1338 (key, accept_default) |
00bee181f7ed
* keymap.c (Flookup_key, Fkey_binding, Flocal_key_binding,
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
1339 Lisp_Object key, accept_default; |
465 | 1340 { |
1341 Lisp_Object *modes, *maps; | |
1342 int nmaps; | |
1343 Lisp_Object binding; | |
1344 int i, j; | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1345 struct gcpro gcpro1, gcpro2; |
465 | 1346 |
1347 nmaps = current_minor_maps (&modes, &maps); | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1348 /* Note that all these maps are GCPRO'd |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1349 in the places where we found them. */ |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1350 |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1351 binding = Qnil; |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1352 GCPRO2 (key, binding); |
465 | 1353 |
1354 for (i = j = 0; i < nmaps; i++) | |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1355 if (!NILP (maps[i]) |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1356 && !NILP (binding = Flookup_key (maps[i], key, accept_default)) |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
1357 && !INTEGERP (binding)) |
465 | 1358 { |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1359 if (KEYMAPP (binding)) |
465 | 1360 maps[j++] = Fcons (modes[i], binding); |
1361 else if (j == 0) | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1362 RETURN_UNGCPRO (Fcons (Fcons (modes[i], binding), Qnil)); |
465 | 1363 } |
1364 | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1365 UNGCPRO; |
465 | 1366 return Flist (j, maps); |
1367 } | |
1368 | |
23968
4c423f69142b
(Fdefine_prefix_command): Accept a third argument NAME
Eli Zaretskii <eliz@gnu.org>
parents:
23953
diff
changeset
|
1369 DEFUN ("define-prefix-command", Fdefine_prefix_command, Sdefine_prefix_command, 1, 3, 0, |
2652
90485f37bfc3
* keymap.c (Fdefine_prefix_command): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
2439
diff
changeset
|
1370 "Define COMMAND as a prefix command. COMMAND should be a symbol.\n\ |
250 | 1371 A new sparse keymap is stored as COMMAND's function definition and its value.\n\ |
362 | 1372 If a second optional argument MAPVAR is given, the map is stored as\n\ |
1373 its value instead of as COMMAND's value; but COMMAND is still defined\n\ | |
23968
4c423f69142b
(Fdefine_prefix_command): Accept a third argument NAME
Eli Zaretskii <eliz@gnu.org>
parents:
23953
diff
changeset
|
1374 as a function.\n\ |
4c423f69142b
(Fdefine_prefix_command): Accept a third argument NAME
Eli Zaretskii <eliz@gnu.org>
parents:
23953
diff
changeset
|
1375 The third optional argument NAME, if given, supplies a menu name\n\ |
4c423f69142b
(Fdefine_prefix_command): Accept a third argument NAME
Eli Zaretskii <eliz@gnu.org>
parents:
23953
diff
changeset
|
1376 string for the map. This is required to use the keymap as a menu.") |
4c423f69142b
(Fdefine_prefix_command): Accept a third argument NAME
Eli Zaretskii <eliz@gnu.org>
parents:
23953
diff
changeset
|
1377 (command, mapvar, name) |
4c423f69142b
(Fdefine_prefix_command): Accept a third argument NAME
Eli Zaretskii <eliz@gnu.org>
parents:
23953
diff
changeset
|
1378 Lisp_Object command, mapvar, name; |
250 | 1379 { |
1380 Lisp_Object map; | |
23968
4c423f69142b
(Fdefine_prefix_command): Accept a third argument NAME
Eli Zaretskii <eliz@gnu.org>
parents:
23953
diff
changeset
|
1381 map = Fmake_sparse_keymap (name); |
14080
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
1382 Ffset (command, map); |
485 | 1383 if (!NILP (mapvar)) |
250 | 1384 Fset (mapvar, map); |
1385 else | |
14080
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
1386 Fset (command, map); |
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
1387 return command; |
250 | 1388 } |
1389 | |
1390 DEFUN ("use-global-map", Fuse_global_map, Suse_global_map, 1, 1, 0, | |
1391 "Select KEYMAP as the global keymap.") | |
1392 (keymap) | |
1393 Lisp_Object keymap; | |
1394 { | |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1395 keymap = get_keymap (keymap, 1, 1); |
250 | 1396 current_global_map = keymap; |
8464
edbb014c600a
(Fuse_global_map, Fuse_local_map): Call record_asynch_buffer_change.
Richard M. Stallman <rms@gnu.org>
parents:
8431
diff
changeset
|
1397 |
250 | 1398 return Qnil; |
1399 } | |
1400 | |
1401 DEFUN ("use-local-map", Fuse_local_map, Suse_local_map, 1, 1, 0, | |
1402 "Select KEYMAP as the local keymap.\n\ | |
1403 If KEYMAP is nil, that means no local keymap.") | |
1404 (keymap) | |
1405 Lisp_Object keymap; | |
1406 { | |
485 | 1407 if (!NILP (keymap)) |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1408 keymap = get_keymap (keymap, 1, 1); |
250 | 1409 |
1410 current_buffer->keymap = keymap; | |
1411 | |
1412 return Qnil; | |
1413 } | |
1414 | |
1415 DEFUN ("current-local-map", Fcurrent_local_map, Scurrent_local_map, 0, 0, 0, | |
1416 "Return current buffer's local keymap, or nil if it has none.") | |
1417 () | |
1418 { | |
1419 return current_buffer->keymap; | |
1420 } | |
1421 | |
1422 DEFUN ("current-global-map", Fcurrent_global_map, Scurrent_global_map, 0, 0, 0, | |
1423 "Return the current global keymap.") | |
1424 () | |
1425 { | |
1426 return current_global_map; | |
1427 } | |
465 | 1428 |
1429 DEFUN ("current-minor-mode-maps", Fcurrent_minor_mode_maps, Scurrent_minor_mode_maps, 0, 0, 0, | |
1430 "Return a list of keymaps for the minor modes of the current buffer.") | |
1431 () | |
1432 { | |
1433 Lisp_Object *maps; | |
1434 int nmaps = current_minor_maps (0, &maps); | |
1435 | |
1436 return Flist (nmaps, maps); | |
1437 } | |
250 | 1438 |
465 | 1439 /* Help functions for describing and documenting keymaps. */ |
1440 | |
20319
81424cf4d446
(copy_keymap_1): Fix return type.
Andreas Schwab <schwab@suse.de>
parents:
20076
diff
changeset
|
1441 static void accessible_keymaps_char_table (); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1442 |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1443 /* This function cannot GC. */ |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1444 |
250 | 1445 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
|
1446 1, 2, 0, |
250 | 1447 "Find all keymaps accessible via prefix characters from KEYMAP.\n\ |
1448 Returns a list of elements of the form (KEYS . MAP), where the sequence\n\ | |
1449 KEYS starting from KEYMAP gets you to MAP. These elements are ordered\n\ | |
14304
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
1450 so that the KEYS increase in length. The first element is ([] . KEYMAP).\n\ |
3962
38041a5069a8
(Faccessible_keymaps): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
3952
diff
changeset
|
1451 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
|
1452 then the value includes only maps for prefixes that start with PREFIX.") |
14080
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
1453 (keymap, prefix) |
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
1454 Lisp_Object keymap, prefix; |
250 | 1455 { |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1456 Lisp_Object maps, good_maps, tail; |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1457 int prefixlen = 0; |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1458 |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1459 /* no need for gcpro because we don't autoload any keymaps. */ |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1460 |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1461 if (!NILP (prefix)) |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1462 prefixlen = XINT (Flength (prefix)); |
250 | 1463 |
8431
b4138573c00f
(Faccessible_keymaps): Use PREFIX to set loop starting
Richard M. Stallman <rms@gnu.org>
parents:
7998
diff
changeset
|
1464 if (!NILP (prefix)) |
b4138573c00f
(Faccessible_keymaps): Use PREFIX to set loop starting
Richard M. Stallman <rms@gnu.org>
parents:
7998
diff
changeset
|
1465 { |
b4138573c00f
(Faccessible_keymaps): Use PREFIX to set loop starting
Richard M. Stallman <rms@gnu.org>
parents:
7998
diff
changeset
|
1466 /* If a prefix was specified, start with the keymap (if any) for |
b4138573c00f
(Faccessible_keymaps): Use PREFIX to set loop starting
Richard M. Stallman <rms@gnu.org>
parents:
7998
diff
changeset
|
1467 that prefix, so we don't waste time considering other prefixes. */ |
b4138573c00f
(Faccessible_keymaps): Use PREFIX to set loop starting
Richard M. Stallman <rms@gnu.org>
parents:
7998
diff
changeset
|
1468 Lisp_Object tem; |
14080
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
1469 tem = Flookup_key (keymap, prefix, Qt); |
8473
c285c3b0ea54
(Faccessible_keymaps): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
8464
diff
changeset
|
1470 /* Flookup_key may give us nil, or a number, |
c285c3b0ea54
(Faccessible_keymaps): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
8464
diff
changeset
|
1471 if the prefix is not defined in this particular map. |
c285c3b0ea54
(Faccessible_keymaps): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
8464
diff
changeset
|
1472 It might even give us a list that isn't a keymap. */ |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1473 tem = get_keymap (tem, 0, 0); |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1474 if (CONSP (tem)) |
17510
2da99276d613
(Faccessible_keymaps): Convert PREFIX to a vector
Richard M. Stallman <rms@gnu.org>
parents:
17327
diff
changeset
|
1475 { |
2da99276d613
(Faccessible_keymaps): Convert PREFIX to a vector
Richard M. Stallman <rms@gnu.org>
parents:
17327
diff
changeset
|
1476 /* Convert PREFIX to a vector now, so that later on |
2da99276d613
(Faccessible_keymaps): Convert PREFIX to a vector
Richard M. Stallman <rms@gnu.org>
parents:
17327
diff
changeset
|
1477 we don't have to deal with the possibility of a string. */ |
2da99276d613
(Faccessible_keymaps): Convert PREFIX to a vector
Richard M. Stallman <rms@gnu.org>
parents:
17327
diff
changeset
|
1478 if (STRINGP (prefix)) |
2da99276d613
(Faccessible_keymaps): Convert PREFIX to a vector
Richard M. Stallman <rms@gnu.org>
parents:
17327
diff
changeset
|
1479 { |
20624
9ac0b485cf60
(describe_vector): Unconditionally handle multibyte chars.
Richard M. Stallman <rms@gnu.org>
parents:
20576
diff
changeset
|
1480 int i, i_byte, c; |
17510
2da99276d613
(Faccessible_keymaps): Convert PREFIX to a vector
Richard M. Stallman <rms@gnu.org>
parents:
17327
diff
changeset
|
1481 Lisp_Object copy; |
2da99276d613
(Faccessible_keymaps): Convert PREFIX to a vector
Richard M. Stallman <rms@gnu.org>
parents:
17327
diff
changeset
|
1482 |
2da99276d613
(Faccessible_keymaps): Convert PREFIX to a vector
Richard M. Stallman <rms@gnu.org>
parents:
17327
diff
changeset
|
1483 copy = Fmake_vector (make_number (XSTRING (prefix)->size), Qnil); |
24572
9fb4096c5f77
(Faccessible_keymaps): Really initialize i_byte.
Richard M. Stallman <rms@gnu.org>
parents:
24396
diff
changeset
|
1484 for (i = 0, i_byte = 0; i < XSTRING (prefix)->size;) |
17510
2da99276d613
(Faccessible_keymaps): Convert PREFIX to a vector
Richard M. Stallman <rms@gnu.org>
parents:
17327
diff
changeset
|
1485 { |
20624
9ac0b485cf60
(describe_vector): Unconditionally handle multibyte chars.
Richard M. Stallman <rms@gnu.org>
parents:
20576
diff
changeset
|
1486 int i_before = i; |
29013
b9565b4bcdf8
(Fsingle_key_description): Use SPLIT_CHAR instead of
Kenichi Handa <handa@m17n.org>
parents:
26864
diff
changeset
|
1487 |
b9565b4bcdf8
(Fsingle_key_description): Use SPLIT_CHAR instead of
Kenichi Handa <handa@m17n.org>
parents:
26864
diff
changeset
|
1488 FETCH_STRING_CHAR_ADVANCE (c, prefix, i, i_byte); |
b9565b4bcdf8
(Fsingle_key_description): Use SPLIT_CHAR instead of
Kenichi Handa <handa@m17n.org>
parents:
26864
diff
changeset
|
1489 if (SINGLE_BYTE_CHAR_P (c) && (c & 0200)) |
b9565b4bcdf8
(Fsingle_key_description): Use SPLIT_CHAR instead of
Kenichi Handa <handa@m17n.org>
parents:
26864
diff
changeset
|
1490 c ^= 0200 | meta_modifier; |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
1491 ASET (copy, i_before, make_number (c)); |
17510
2da99276d613
(Faccessible_keymaps): Convert PREFIX to a vector
Richard M. Stallman <rms@gnu.org>
parents:
17327
diff
changeset
|
1492 } |
2da99276d613
(Faccessible_keymaps): Convert PREFIX to a vector
Richard M. Stallman <rms@gnu.org>
parents:
17327
diff
changeset
|
1493 prefix = copy; |
2da99276d613
(Faccessible_keymaps): Convert PREFIX to a vector
Richard M. Stallman <rms@gnu.org>
parents:
17327
diff
changeset
|
1494 } |
2da99276d613
(Faccessible_keymaps): Convert PREFIX to a vector
Richard M. Stallman <rms@gnu.org>
parents:
17327
diff
changeset
|
1495 maps = Fcons (Fcons (prefix, tem), Qnil); |
2da99276d613
(Faccessible_keymaps): Convert PREFIX to a vector
Richard M. Stallman <rms@gnu.org>
parents:
17327
diff
changeset
|
1496 } |
8431
b4138573c00f
(Faccessible_keymaps): Use PREFIX to set loop starting
Richard M. Stallman <rms@gnu.org>
parents:
7998
diff
changeset
|
1497 else |
b4138573c00f
(Faccessible_keymaps): Use PREFIX to set loop starting
Richard M. Stallman <rms@gnu.org>
parents:
7998
diff
changeset
|
1498 return Qnil; |
b4138573c00f
(Faccessible_keymaps): Use PREFIX to set loop starting
Richard M. Stallman <rms@gnu.org>
parents:
7998
diff
changeset
|
1499 } |
b4138573c00f
(Faccessible_keymaps): Use PREFIX to set loop starting
Richard M. Stallman <rms@gnu.org>
parents:
7998
diff
changeset
|
1500 else |
b4138573c00f
(Faccessible_keymaps): Use PREFIX to set loop starting
Richard M. Stallman <rms@gnu.org>
parents:
7998
diff
changeset
|
1501 maps = Fcons (Fcons (Fmake_vector (make_number (0), Qnil), |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1502 get_keymap (keymap, 1, 0)), |
8431
b4138573c00f
(Faccessible_keymaps): Use PREFIX to set loop starting
Richard M. Stallman <rms@gnu.org>
parents:
7998
diff
changeset
|
1503 Qnil); |
250 | 1504 |
1505 /* For each map in the list maps, | |
1506 look at any other maps it points to, | |
1507 and stick them at the end if they are not already in the list. | |
1508 | |
1509 This is a breadth-first traversal, where tail is the queue of | |
1510 nodes, and maps accumulates a list of all nodes visited. */ | |
1511 | |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1512 for (tail = maps; CONSP (tail); tail = XCDR (tail)) |
250 | 1513 { |
6502
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
1514 register Lisp_Object thisseq, thismap; |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
1515 Lisp_Object last; |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
1516 /* Does the current sequence end in the meta-prefix-char? */ |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
1517 int is_metized; |
250 | 1518 |
6502
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
1519 thisseq = Fcar (Fcar (tail)); |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
1520 thismap = Fcdr (Fcar (tail)); |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
1521 last = make_number (XINT (Flength (thisseq)) - 1); |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
1522 is_metized = (XINT (last) >= 0 |
17264
fad065a280dc
(Faccessible_keymaps): When metizing, convert a
Richard M. Stallman <rms@gnu.org>
parents:
17189
diff
changeset
|
1523 /* Don't metize the last char of PREFIX. */ |
fad065a280dc
(Faccessible_keymaps): When metizing, convert a
Richard M. Stallman <rms@gnu.org>
parents:
17189
diff
changeset
|
1524 && XINT (last) >= prefixlen |
6502
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
1525 && EQ (Faref (thisseq, last), meta_prefix_char)); |
250 | 1526 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1527 for (; CONSP (thismap); thismap = XCDR (thismap)) |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
1528 { |
6502
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
1529 Lisp_Object elt; |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
1530 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1531 elt = XCAR (thismap); |
250 | 1532 |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
1533 QUIT; |
250 | 1534 |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1535 if (CHAR_TABLE_P (elt)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1536 { |
20076
374e09781f08
(Faccessible_keymaps): Avoid alloca for fixed-size array.
Karl Heuer <kwzh@gnu.org>
parents:
20070
diff
changeset
|
1537 Lisp_Object indices[3]; |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1538 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1539 map_char_table (accessible_keymaps_char_table, Qnil, |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1540 elt, Fcons (maps, Fcons (tail, thisseq)), |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1541 0, indices); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1542 } |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1543 else if (VECTORP (elt)) |
250 | 1544 { |
1545 register int i; | |
1546 | |
1547 /* Vector keymap. Scan all the elements. */ | |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
1548 for (i = 0; i < ASIZE (elt); i++) |
250 | 1549 { |
1550 register Lisp_Object tem; | |
1551 register Lisp_Object cmd; | |
1552 | |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
1553 cmd = get_keyelt (AREF (elt, i), 0); |
485 | 1554 if (NILP (cmd)) continue; |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1555 tem = get_keymap (cmd, 0, 0); |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1556 if (CONSP (tem)) |
250 | 1557 { |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1558 cmd = tem; |
250 | 1559 /* Ignore keymaps that are already added to maps. */ |
1560 tem = Frassq (cmd, maps); | |
485 | 1561 if (NILP (tem)) |
250 | 1562 { |
1563 /* If the last key in thisseq is meta-prefix-char, | |
1564 turn it into a meta-ized keystroke. We know | |
1565 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
|
1566 ascii keystroke since we're processing a |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
1567 keymap table. */ |
250 | 1568 if (is_metized) |
1569 { | |
2093
ce8bad247b1a
(Fdefine_key): Use proper meta-bit to clear.
Richard M. Stallman <rms@gnu.org>
parents:
2059
diff
changeset
|
1570 int meta_bit = meta_modifier; |
250 | 1571 tem = Fcopy_sequence (thisseq); |
2093
ce8bad247b1a
(Fdefine_key): Use proper meta-bit to clear.
Richard M. Stallman <rms@gnu.org>
parents:
2059
diff
changeset
|
1572 |
ce8bad247b1a
(Fdefine_key): Use proper meta-bit to clear.
Richard M. Stallman <rms@gnu.org>
parents:
2059
diff
changeset
|
1573 Faset (tem, last, make_number (i | meta_bit)); |
250 | 1574 |
1575 /* This new sequence is the same length as | |
1576 thisseq, so stick it in the list right | |
1577 after this one. */ | |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1578 XCDR (tail) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1579 = Fcons (Fcons (tem, cmd), XCDR (tail)); |
250 | 1580 } |
1581 else | |
1582 { | |
1583 tem = append_key (thisseq, make_number (i)); | |
1584 nconc2 (tail, Fcons (Fcons (tem, cmd), Qnil)); | |
1585 } | |
1586 } | |
1587 } | |
1588 } | |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1589 } |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
1590 else if (CONSP (elt)) |
250 | 1591 { |
25785
0d701c4484e3
(Flookup_key, Faccessible_keymaps, describe_vector,
Gerd Moellmann <gerd@gnu.org>
parents:
25662
diff
changeset
|
1592 register Lisp_Object cmd, tem; |
250 | 1593 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1594 cmd = get_keyelt (XCDR (elt), 0); |
250 | 1595 /* Ignore definitions that aren't keymaps themselves. */ |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1596 tem = get_keymap (cmd, 0, 0); |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1597 if (CONSP (tem)) |
250 | 1598 { |
1599 /* Ignore keymaps that have been seen already. */ | |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1600 cmd = tem; |
250 | 1601 tem = Frassq (cmd, maps); |
485 | 1602 if (NILP (tem)) |
250 | 1603 { |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1604 /* Let elt be the event defined by this map entry. */ |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1605 elt = XCAR (elt); |
250 | 1606 |
1607 /* If the last key in thisseq is meta-prefix-char, and | |
1608 this entry is a binding for an ascii keystroke, | |
1609 turn it into a meta-ized keystroke. */ | |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
1610 if (is_metized && INTEGERP (elt)) |
250 | 1611 { |
17264
fad065a280dc
(Faccessible_keymaps): When metizing, convert a
Richard M. Stallman <rms@gnu.org>
parents:
17189
diff
changeset
|
1612 Lisp_Object element; |
fad065a280dc
(Faccessible_keymaps): When metizing, convert a
Richard M. Stallman <rms@gnu.org>
parents:
17189
diff
changeset
|
1613 |
fad065a280dc
(Faccessible_keymaps): When metizing, convert a
Richard M. Stallman <rms@gnu.org>
parents:
17189
diff
changeset
|
1614 element = thisseq; |
fad065a280dc
(Faccessible_keymaps): When metizing, convert a
Richard M. Stallman <rms@gnu.org>
parents:
17189
diff
changeset
|
1615 tem = Fvconcat (1, &element); |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
1616 XSETFASTINT (AREF (tem, XINT (last)), |
18613
614b916ff5bf
Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents:
18142
diff
changeset
|
1617 XINT (elt) | meta_modifier); |
250 | 1618 |
1619 /* This new sequence is the same length as | |
1620 thisseq, so stick it in the list right | |
1621 after this one. */ | |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1622 XCDR (tail) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1623 = Fcons (Fcons (tem, cmd), XCDR (tail)); |
250 | 1624 } |
1625 else | |
1626 nconc2 (tail, | |
1627 Fcons (Fcons (append_key (thisseq, elt), cmd), | |
1628 Qnil)); | |
1629 } | |
1630 } | |
1631 } | |
1632 } | |
1633 } | |
1634 | |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1635 if (NILP (prefix)) |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1636 return maps; |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1637 |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1638 /* 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
|
1639 |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1640 good_maps = Qnil; |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1641 for (; CONSP (maps); maps = XCDR (maps)) |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1642 { |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1643 Lisp_Object elt, thisseq; |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1644 elt = XCAR (maps); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1645 thisseq = XCAR (elt); |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1646 /* 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
|
1647 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
|
1648 if (XINT (Flength (thisseq)) >= prefixlen) |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1649 { |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1650 int i; |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1651 for (i = 0; i < prefixlen; i++) |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1652 { |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1653 Lisp_Object i1; |
9312
dfaf1d41e53d
(synkey, access_keymap, store_in_keymap, Faccessible_keymaps,
Karl Heuer <kwzh@gnu.org>
parents:
9273
diff
changeset
|
1654 XSETFASTINT (i1, i); |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1655 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
|
1656 break; |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1657 } |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1658 if (i == prefixlen) |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1659 good_maps = Fcons (elt, good_maps); |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1660 } |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1661 } |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1662 |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
1663 return Fnreverse (good_maps); |
250 | 1664 } |
1665 | |
20319
81424cf4d446
(copy_keymap_1): Fix return type.
Andreas Schwab <schwab@suse.de>
parents:
20076
diff
changeset
|
1666 static void |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1667 accessible_keymaps_char_table (args, index, cmd) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1668 Lisp_Object args, index, cmd; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1669 { |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1670 Lisp_Object tem; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1671 Lisp_Object maps, tail, thisseq; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1672 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1673 if (NILP (cmd)) |
20319
81424cf4d446
(copy_keymap_1): Fix return type.
Andreas Schwab <schwab@suse.de>
parents:
20076
diff
changeset
|
1674 return; |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1675 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1676 maps = XCAR (args); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1677 tail = XCAR (XCDR (args)); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1678 thisseq = XCDR (XCDR (args)); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1679 |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1680 tem = get_keymap (cmd, 0, 0); |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1681 if (CONSP (tem)) |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1682 { |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
1683 cmd = tem; |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1684 /* Ignore keymaps that are already added to maps. */ |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1685 tem = Frassq (cmd, maps); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1686 if (NILP (tem)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1687 { |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1688 tem = append_key (thisseq, index); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1689 nconc2 (tail, Fcons (Fcons (tem, cmd), Qnil)); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1690 } |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1691 } |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1692 } |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
1693 |
250 | 1694 Lisp_Object Qsingle_key_description, Qkey_description; |
1695 | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1696 /* This function cannot GC. */ |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1697 |
250 | 1698 DEFUN ("key-description", Fkey_description, Skey_description, 1, 1, 0, |
1699 "Return a pretty description of key-sequence KEYS.\n\ | |
1700 Control characters turn into \"C-foo\" sequences, meta into \"M-foo\"\n\ | |
1701 spaces are put between sequence elements, etc.") | |
1702 (keys) | |
1703 Lisp_Object keys; | |
1704 { | |
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31496
diff
changeset
|
1705 int len = 0; |
20624
9ac0b485cf60
(describe_vector): Unconditionally handle multibyte chars.
Richard M. Stallman <rms@gnu.org>
parents:
20576
diff
changeset
|
1706 int i, i_byte; |
7809
cf23573fa6fb
(Fkey_description): Avoid using Fmapconcat--do it directly.
Richard M. Stallman <rms@gnu.org>
parents:
7669
diff
changeset
|
1707 Lisp_Object sep; |
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31496
diff
changeset
|
1708 Lisp_Object *args = NULL; |
7809
cf23573fa6fb
(Fkey_description): Avoid using Fmapconcat--do it directly.
Richard M. Stallman <rms@gnu.org>
parents:
7669
diff
changeset
|
1709 |
8866
48a0ea73a9d7
(Fkey_description): Give error if KEYS not an array.
Richard M. Stallman <rms@gnu.org>
parents:
8731
diff
changeset
|
1710 if (STRINGP (keys)) |
2059 | 1711 { |
1712 Lisp_Object vector; | |
1713 vector = Fmake_vector (Flength (keys), Qnil); | |
24572
9fb4096c5f77
(Faccessible_keymaps): Really initialize i_byte.
Richard M. Stallman <rms@gnu.org>
parents:
24396
diff
changeset
|
1714 for (i = 0, i_byte = 0; i < XSTRING (keys)->size; ) |
2059 | 1715 { |
20624
9ac0b485cf60
(describe_vector): Unconditionally handle multibyte chars.
Richard M. Stallman <rms@gnu.org>
parents:
20576
diff
changeset
|
1716 int c; |
20641
a48d24f8726c
(push_key_description): If C >= 128, always use octal representation.
Kenichi Handa <handa@m17n.org>
parents:
20624
diff
changeset
|
1717 int i_before = i; |
20624
9ac0b485cf60
(describe_vector): Unconditionally handle multibyte chars.
Richard M. Stallman <rms@gnu.org>
parents:
20576
diff
changeset
|
1718 |
29013
b9565b4bcdf8
(Fsingle_key_description): Use SPLIT_CHAR instead of
Kenichi Handa <handa@m17n.org>
parents:
26864
diff
changeset
|
1719 FETCH_STRING_CHAR_ADVANCE (c, keys, i, i_byte); |
b9565b4bcdf8
(Fsingle_key_description): Use SPLIT_CHAR instead of
Kenichi Handa <handa@m17n.org>
parents:
26864
diff
changeset
|
1720 if (SINGLE_BYTE_CHAR_P (c) && (c & 0200)) |
b9565b4bcdf8
(Fsingle_key_description): Use SPLIT_CHAR instead of
Kenichi Handa <handa@m17n.org>
parents:
26864
diff
changeset
|
1721 c ^= 0200 | meta_modifier; |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
1722 XSETFASTINT (AREF (vector, i_before), c); |
2059 | 1723 } |
1724 keys = vector; | |
1725 } | |
23953
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1726 |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1727 if (VECTORP (keys)) |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1728 { |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1729 /* In effect, this computes |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1730 (mapconcat 'single-key-description keys " ") |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1731 but we shouldn't use mapconcat because it can do GC. */ |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1732 |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1733 len = XVECTOR (keys)->size; |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1734 sep = build_string (" "); |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1735 /* This has one extra element at the end that we don't pass to Fconcat. */ |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1736 args = (Lisp_Object *) alloca (len * 2 * sizeof (Lisp_Object)); |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1737 |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1738 for (i = 0; i < len; i++) |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1739 { |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
1740 args[i * 2] = Fsingle_key_description (AREF (keys, i), Qnil); |
23953
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1741 args[i * 2 + 1] = sep; |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1742 } |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1743 } |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1744 else if (CONSP (keys)) |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1745 { |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1746 /* In effect, this computes |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1747 (mapconcat 'single-key-description keys " ") |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1748 but we shouldn't use mapconcat because it can do GC. */ |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1749 |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1750 len = XFASTINT (Flength (keys)); |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1751 sep = build_string (" "); |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1752 /* This has one extra element at the end that we don't pass to Fconcat. */ |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1753 args = (Lisp_Object *) alloca (len * 2 * sizeof (Lisp_Object)); |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1754 |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1755 for (i = 0; i < len; i++) |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1756 { |
30559
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1757 args[i * 2] = Fsingle_key_description (XCAR (keys), Qnil); |
23953
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1758 args[i * 2 + 1] = sep; |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
1759 keys = XCDR (keys); |
23953
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1760 } |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1761 } |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1762 else |
8866
48a0ea73a9d7
(Fkey_description): Give error if KEYS not an array.
Richard M. Stallman <rms@gnu.org>
parents:
8731
diff
changeset
|
1763 keys = wrong_type_argument (Qarrayp, keys); |
7809
cf23573fa6fb
(Fkey_description): Avoid using Fmapconcat--do it directly.
Richard M. Stallman <rms@gnu.org>
parents:
7669
diff
changeset
|
1764 |
34442
57d320641b64
(Fkey_description): If KEYS is an empty key sequence,
Gerd Moellmann <gerd@gnu.org>
parents:
34359
diff
changeset
|
1765 if (len == 0) |
57d320641b64
(Fkey_description): If KEYS is an empty key sequence,
Gerd Moellmann <gerd@gnu.org>
parents:
34359
diff
changeset
|
1766 return build_string (""); |
7809
cf23573fa6fb
(Fkey_description): Avoid using Fmapconcat--do it directly.
Richard M. Stallman <rms@gnu.org>
parents:
7669
diff
changeset
|
1767 return Fconcat (len * 2 - 1, args); |
250 | 1768 } |
1769 | |
1770 char * | |
34906
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1771 push_key_description (c, p, force_multibyte) |
250 | 1772 register unsigned int c; |
1773 register char *p; | |
34906
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1774 int force_multibyte; |
250 | 1775 { |
30780
b4fcea50ee82
(push_key_description): If C without modifiers is < 32,
Gerd Moellmann <gerd@gnu.org>
parents:
30609
diff
changeset
|
1776 unsigned c2; |
b4fcea50ee82
(push_key_description): If C without modifiers is < 32,
Gerd Moellmann <gerd@gnu.org>
parents:
30609
diff
changeset
|
1777 |
2343
ddb30eaf2f56
(push_key_description): Ignore bits above meta_modifier.
Richard M. Stallman <rms@gnu.org>
parents:
2093
diff
changeset
|
1778 /* 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
|
1779 c &= meta_modifier | ~ - meta_modifier; |
30780
b4fcea50ee82
(push_key_description): If C without modifiers is < 32,
Gerd Moellmann <gerd@gnu.org>
parents:
30609
diff
changeset
|
1780 c2 = c & ~(alt_modifier | ctrl_modifier | hyper_modifier |
b4fcea50ee82
(push_key_description): If C without modifiers is < 32,
Gerd Moellmann <gerd@gnu.org>
parents:
30609
diff
changeset
|
1781 | meta_modifier | shift_modifier | super_modifier); |
2343
ddb30eaf2f56
(push_key_description): Ignore bits above meta_modifier.
Richard M. Stallman <rms@gnu.org>
parents:
2093
diff
changeset
|
1782 |
2059 | 1783 if (c & alt_modifier) |
1784 { | |
1785 *p++ = 'A'; | |
1786 *p++ = '-'; | |
1787 c -= alt_modifier; | |
1788 } | |
30780
b4fcea50ee82
(push_key_description): If C without modifiers is < 32,
Gerd Moellmann <gerd@gnu.org>
parents:
30609
diff
changeset
|
1789 if ((c & ctrl_modifier) != 0 |
b4fcea50ee82
(push_key_description): If C without modifiers is < 32,
Gerd Moellmann <gerd@gnu.org>
parents:
30609
diff
changeset
|
1790 || (c2 < ' ' && c2 != 27 && c2 != '\t' && c2 != Ctl ('M'))) |
2059 | 1791 { |
1792 *p++ = 'C'; | |
1793 *p++ = '-'; | |
30780
b4fcea50ee82
(push_key_description): If C without modifiers is < 32,
Gerd Moellmann <gerd@gnu.org>
parents:
30609
diff
changeset
|
1794 c &= ~ctrl_modifier; |
2059 | 1795 } |
1796 if (c & hyper_modifier) | |
1797 { | |
1798 *p++ = 'H'; | |
1799 *p++ = '-'; | |
1800 c -= hyper_modifier; | |
1801 } | |
1802 if (c & meta_modifier) | |
250 | 1803 { |
1804 *p++ = 'M'; | |
1805 *p++ = '-'; | |
2059 | 1806 c -= meta_modifier; |
1807 } | |
1808 if (c & shift_modifier) | |
1809 { | |
1810 *p++ = 'S'; | |
1811 *p++ = '-'; | |
1812 c -= shift_modifier; | |
1813 } | |
1814 if (c & super_modifier) | |
1815 { | |
1816 *p++ = 's'; | |
1817 *p++ = '-'; | |
1818 c -= super_modifier; | |
250 | 1819 } |
1820 if (c < 040) | |
1821 { | |
1822 if (c == 033) | |
1823 { | |
1824 *p++ = 'E'; | |
1825 *p++ = 'S'; | |
1826 *p++ = 'C'; | |
1827 } | |
2059 | 1828 else if (c == '\t') |
250 | 1829 { |
1830 *p++ = 'T'; | |
1831 *p++ = 'A'; | |
1832 *p++ = 'B'; | |
1833 } | |
16875
d9956cf6699b
(push_key_description): Print C-j, not TAB.
Richard M. Stallman <rms@gnu.org>
parents:
16465
diff
changeset
|
1834 else if (c == Ctl ('M')) |
250 | 1835 { |
1836 *p++ = 'R'; | |
1837 *p++ = 'E'; | |
1838 *p++ = 'T'; | |
1839 } | |
1840 else | |
1841 { | |
30780
b4fcea50ee82
(push_key_description): If C without modifiers is < 32,
Gerd Moellmann <gerd@gnu.org>
parents:
30609
diff
changeset
|
1842 /* `C-' already added above. */ |
250 | 1843 if (c > 0 && c <= Ctl ('Z')) |
1844 *p++ = c + 0140; | |
1845 else | |
1846 *p++ = c + 0100; | |
1847 } | |
1848 } | |
1849 else if (c == 0177) | |
1850 { | |
1851 *p++ = 'D'; | |
1852 *p++ = 'E'; | |
1853 *p++ = 'L'; | |
1854 } | |
1855 else if (c == ' ') | |
24394
8159c8cb33cc
(push_key_description): If enable-multibyte-characters
Kenichi Handa <handa@m17n.org>
parents:
23968
diff
changeset
|
1856 { |
250 | 1857 *p++ = 'S'; |
1858 *p++ = 'P'; | |
1859 *p++ = 'C'; | |
1860 } | |
24396
340189fd508f
(push_key_description): If enable-multibyte-characters
Kenichi Handa <handa@m17n.org>
parents:
24394
diff
changeset
|
1861 else if (c < 128 |
340189fd508f
(push_key_description): If enable-multibyte-characters
Kenichi Handa <handa@m17n.org>
parents:
24394
diff
changeset
|
1862 || (NILP (current_buffer->enable_multibyte_characters) |
34906
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1863 && SINGLE_BYTE_CHAR_P (c) |
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1864 && !force_multibyte)) |
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1865 { |
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1866 *p++ = c; |
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1867 } |
250 | 1868 else |
2059 | 1869 { |
34906
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1870 int valid_p = SINGLE_BYTE_CHAR_P (c) || char_valid_p (c, 0); |
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1871 |
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1872 if (force_multibyte && valid_p) |
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1873 { |
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1874 if (SINGLE_BYTE_CHAR_P (c)) |
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1875 c = unibyte_char_to_multibyte (c); |
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1876 p += CHAR_STRING (c, p); |
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1877 } |
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1878 else if (NILP (current_buffer->enable_multibyte_characters) |
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1879 || valid_p) |
24394
8159c8cb33cc
(push_key_description): If enable-multibyte-characters
Kenichi Handa <handa@m17n.org>
parents:
23968
diff
changeset
|
1880 { |
8159c8cb33cc
(push_key_description): If enable-multibyte-characters
Kenichi Handa <handa@m17n.org>
parents:
23968
diff
changeset
|
1881 int bit_offset; |
8159c8cb33cc
(push_key_description): If enable-multibyte-characters
Kenichi Handa <handa@m17n.org>
parents:
23968
diff
changeset
|
1882 *p++ = '\\'; |
8159c8cb33cc
(push_key_description): If enable-multibyte-characters
Kenichi Handa <handa@m17n.org>
parents:
23968
diff
changeset
|
1883 /* The biggest character code uses 19 bits. */ |
8159c8cb33cc
(push_key_description): If enable-multibyte-characters
Kenichi Handa <handa@m17n.org>
parents:
23968
diff
changeset
|
1884 for (bit_offset = 18; bit_offset >= 0; bit_offset -= 3) |
8159c8cb33cc
(push_key_description): If enable-multibyte-characters
Kenichi Handa <handa@m17n.org>
parents:
23968
diff
changeset
|
1885 { |
8159c8cb33cc
(push_key_description): If enable-multibyte-characters
Kenichi Handa <handa@m17n.org>
parents:
23968
diff
changeset
|
1886 if (c >= (1 << bit_offset)) |
8159c8cb33cc
(push_key_description): If enable-multibyte-characters
Kenichi Handa <handa@m17n.org>
parents:
23968
diff
changeset
|
1887 *p++ = ((c & (7 << bit_offset)) >> bit_offset) + '0'; |
8159c8cb33cc
(push_key_description): If enable-multibyte-characters
Kenichi Handa <handa@m17n.org>
parents:
23968
diff
changeset
|
1888 } |
8159c8cb33cc
(push_key_description): If enable-multibyte-characters
Kenichi Handa <handa@m17n.org>
parents:
23968
diff
changeset
|
1889 } |
8159c8cb33cc
(push_key_description): If enable-multibyte-characters
Kenichi Handa <handa@m17n.org>
parents:
23968
diff
changeset
|
1890 else |
34906
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1891 p += CHAR_STRING (c, p); |
2059 | 1892 } |
250 | 1893 |
1894 return p; | |
1895 } | |
1896 | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1897 /* This function cannot GC. */ |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1898 |
30559
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1899 DEFUN ("single-key-description", Fsingle_key_description, |
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1900 Ssingle_key_description, 1, 2, 0, |
250 | 1901 "Return a pretty description of command character KEY.\n\ |
30559
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1902 Control characters turn into C-whatever, etc.\n\ |
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1903 Optional argument NO-ANGLES non-nil means don't put angle brackets\n\ |
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1904 around function keys and event symbols.") |
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1905 (key, no_angles) |
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1906 Lisp_Object key, no_angles; |
250 | 1907 { |
23953
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1908 if (CONSP (key) && lucid_event_type_list_p (key)) |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1909 key = Fevent_convert_list (key); |
c8cdb4e487cb
(Fsingle_key_description): Handle (control ?x) etc.
Richard M. Stallman <rms@gnu.org>
parents:
23776
diff
changeset
|
1910 |
1315
884c3d7e7172
* keymap.c (access_keymap, store_in_keymap,
Jim Blandy <jimb@redhat.com>
parents:
1264
diff
changeset
|
1911 key = EVENT_HEAD (key); |
517 | 1912 |
10008
b83150a8020d
(Fsingle_key_description): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9973
diff
changeset
|
1913 if (INTEGERP (key)) /* Normal character */ |
250 | 1914 { |
23734
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1915 unsigned int charset, c1, c2; |
23776
529965d3c653
(Fsingle_key_description): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
23758
diff
changeset
|
1916 int without_bits = XINT (key) & ~((-1) << CHARACTERBITS); |
529965d3c653
(Fsingle_key_description): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
23758
diff
changeset
|
1917 |
529965d3c653
(Fsingle_key_description): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
23758
diff
changeset
|
1918 if (SINGLE_BYTE_CHAR_P (without_bits)) |
23734
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1919 charset = 0; |
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1920 else |
29013
b9565b4bcdf8
(Fsingle_key_description): Use SPLIT_CHAR instead of
Kenichi Handa <handa@m17n.org>
parents:
26864
diff
changeset
|
1921 SPLIT_CHAR (without_bits, charset, c1, c2); |
23734
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1922 |
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1923 if (charset |
24394
8159c8cb33cc
(push_key_description): If enable-multibyte-characters
Kenichi Handa <handa@m17n.org>
parents:
23968
diff
changeset
|
1924 && CHARSET_DEFINED_P (charset) |
23734
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1925 && ((c1 >= 0 && c1 < 32) |
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1926 || (c2 >= 0 && c2 < 32))) |
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1927 { |
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1928 /* Handle a generic character. */ |
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1929 Lisp_Object name; |
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1930 name = CHARSET_TABLE_INFO (charset, CHARSET_LONG_NAME_IDX); |
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1931 CHECK_STRING (name, 0); |
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1932 return concat2 (build_string ("Character set "), name); |
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1933 } |
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1934 else |
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1935 { |
26481
70d85ae6dfee
(Fsingle_key_description): Use KEY_DESCRIPTION_SIZE to
Kenichi Handa <handa@m17n.org>
parents:
26404
diff
changeset
|
1936 char tem[KEY_DESCRIPTION_SIZE]; |
23734
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1937 |
34906
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
1938 *push_key_description (XUINT (key), tem, 1) = 0; |
23734
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1939 return build_string (tem); |
44546fc7faad
(Fsingle_key_description): Handle generic characters.
Richard M. Stallman <rms@gnu.org>
parents:
22841
diff
changeset
|
1940 } |
250 | 1941 } |
10008
b83150a8020d
(Fsingle_key_description): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9973
diff
changeset
|
1942 else if (SYMBOLP (key)) /* Function key or event-symbol */ |
29651
31099bb76b6e
(Fsingle_key_description): Enclose function key and
Gerd Moellmann <gerd@gnu.org>
parents:
29282
diff
changeset
|
1943 { |
30559
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1944 if (NILP (no_angles)) |
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1945 { |
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1946 char *buffer |
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1947 = (char *) alloca (STRING_BYTES (XSYMBOL (key)->name) + 5); |
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1948 sprintf (buffer, "<%s>", XSYMBOL (key)->name->data); |
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1949 return build_string (buffer); |
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1950 } |
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1951 else |
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
1952 return Fsymbol_name (key); |
29651
31099bb76b6e
(Fsingle_key_description): Enclose function key and
Gerd Moellmann <gerd@gnu.org>
parents:
29282
diff
changeset
|
1953 } |
10008
b83150a8020d
(Fsingle_key_description): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9973
diff
changeset
|
1954 else if (STRINGP (key)) /* Buffer names in the menubar. */ |
b83150a8020d
(Fsingle_key_description): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9973
diff
changeset
|
1955 return Fcopy_sequence (key); |
b83150a8020d
(Fsingle_key_description): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9973
diff
changeset
|
1956 else |
b83150a8020d
(Fsingle_key_description): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9973
diff
changeset
|
1957 error ("KEY must be an integer, cons, symbol, or string"); |
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31496
diff
changeset
|
1958 return Qnil; |
250 | 1959 } |
1960 | |
1961 char * | |
1962 push_text_char_description (c, p) | |
1963 register unsigned int c; | |
1964 register char *p; | |
1965 { | |
1966 if (c >= 0200) | |
1967 { | |
1968 *p++ = 'M'; | |
1969 *p++ = '-'; | |
1970 c -= 0200; | |
1971 } | |
1972 if (c < 040) | |
1973 { | |
1974 *p++ = '^'; | |
1975 *p++ = c + 64; /* 'A' - 1 */ | |
1976 } | |
1977 else if (c == 0177) | |
1978 { | |
1979 *p++ = '^'; | |
1980 *p++ = '?'; | |
1981 } | |
1982 else | |
1983 *p++ = c; | |
1984 return p; | |
1985 } | |
1986 | |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1987 /* This function cannot GC. */ |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
1988 |
250 | 1989 DEFUN ("text-char-description", Ftext_char_description, Stext_char_description, 1, 1, 0, |
14080
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
1990 "Return a pretty description of file-character CHARACTER.\n\ |
250 | 1991 Control characters turn into \"^char\", etc.") |
14080
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
1992 (character) |
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
1993 Lisp_Object character; |
250 | 1994 { |
26864
b89eb8bbaff1
(push_key_description): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents:
26481
diff
changeset
|
1995 /* Currently MAX_MULTIBYTE_LENGTH is 4 (< 6). */ |
b89eb8bbaff1
(push_key_description): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents:
26481
diff
changeset
|
1996 unsigned char str[6]; |
b89eb8bbaff1
(push_key_description): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents:
26481
diff
changeset
|
1997 int c; |
250 | 1998 |
14080
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
1999 CHECK_NUMBER (character, 0); |
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
2000 |
26864
b89eb8bbaff1
(push_key_description): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents:
26481
diff
changeset
|
2001 c = XINT (character); |
b89eb8bbaff1
(push_key_description): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents:
26481
diff
changeset
|
2002 if (!SINGLE_BYTE_CHAR_P (c)) |
17036 | 2003 { |
26864
b89eb8bbaff1
(push_key_description): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents:
26481
diff
changeset
|
2004 int len = CHAR_STRING (c, str); |
17036 | 2005 |
20624
9ac0b485cf60
(describe_vector): Unconditionally handle multibyte chars.
Richard M. Stallman <rms@gnu.org>
parents:
20576
diff
changeset
|
2006 return make_multibyte_string (str, 1, len); |
17036 | 2007 } |
2008 | |
26864
b89eb8bbaff1
(push_key_description): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents:
26481
diff
changeset
|
2009 *push_text_char_description (c & 0377, str) = 0; |
b89eb8bbaff1
(push_key_description): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents:
26481
diff
changeset
|
2010 |
b89eb8bbaff1
(push_key_description): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents:
26481
diff
changeset
|
2011 return build_string (str); |
250 | 2012 } |
2727
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2013 |
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2014 /* 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
|
2015 a meta bit. */ |
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2016 static int |
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2017 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
|
2018 Lisp_Object seq; |
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2019 { |
9312
dfaf1d41e53d
(synkey, access_keymap, store_in_keymap, Faccessible_keymaps,
Karl Heuer <kwzh@gnu.org>
parents:
9273
diff
changeset
|
2020 int i; |
2727
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2021 int len = XINT (Flength (seq)); |
6008
d3ccce72be00
(get_keyelt): Discard keyboard equivalents
Richard M. Stallman <rms@gnu.org>
parents:
5785
diff
changeset
|
2022 |
9312
dfaf1d41e53d
(synkey, access_keymap, store_in_keymap, Faccessible_keymaps,
Karl Heuer <kwzh@gnu.org>
parents:
9273
diff
changeset
|
2023 for (i = 0; i < len; i++) |
2727
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2024 { |
9312
dfaf1d41e53d
(synkey, access_keymap, store_in_keymap, Faccessible_keymaps,
Karl Heuer <kwzh@gnu.org>
parents:
9273
diff
changeset
|
2025 Lisp_Object ii, elt; |
6008
d3ccce72be00
(get_keyelt): Discard keyboard equivalents
Richard M. Stallman <rms@gnu.org>
parents:
5785
diff
changeset
|
2026 |
9312
dfaf1d41e53d
(synkey, access_keymap, store_in_keymap, Faccessible_keymaps,
Karl Heuer <kwzh@gnu.org>
parents:
9273
diff
changeset
|
2027 XSETFASTINT (ii, i); |
dfaf1d41e53d
(synkey, access_keymap, store_in_keymap, Faccessible_keymaps,
Karl Heuer <kwzh@gnu.org>
parents:
9273
diff
changeset
|
2028 elt = Faref (seq, ii); |
2727
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2029 |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
2030 if (!INTEGERP (elt) |
2727
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2031 || (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
|
2032 return 0; |
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2033 } |
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2034 |
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2035 return 1; |
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2036 } |
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2037 |
250 | 2038 |
465 | 2039 /* where-is - finding a command in a set of keymaps. */ |
2040 | |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2041 static Lisp_Object where_is_internal_1 (); |
20319
81424cf4d446
(copy_keymap_1): Fix return type.
Andreas Schwab <schwab@suse.de>
parents:
20076
diff
changeset
|
2042 static void where_is_internal_2 (); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2043 |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2044 /* Like Flookup_key, but uses a list of keymaps SHADOW instead of a single map. |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2045 Returns the first non-nil binding found in any of those maps. */ |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2046 |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2047 static Lisp_Object |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2048 shadow_lookup (shadow, key, flag) |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2049 Lisp_Object shadow, key, flag; |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2050 { |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2051 Lisp_Object tail, value; |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2052 |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2053 for (tail = shadow; CONSP (tail); tail = XCDR (tail)) |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2054 { |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2055 value = Flookup_key (XCAR (tail), key, flag); |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2056 if (!NILP (value) && !NATNUMP (value)) |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2057 return value; |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2058 } |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2059 return Qnil; |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2060 } |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2061 |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2062 /* This function can GC if Flookup_key autoloads any keymaps. */ |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2063 |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2064 static Lisp_Object |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2065 where_is_internal (definition, keymaps, firstonly, noindirect) |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2066 Lisp_Object definition, keymaps; |
250 | 2067 Lisp_Object firstonly, noindirect; |
2068 { | |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2069 Lisp_Object maps = Qnil; |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2070 Lisp_Object found, sequences; |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
2071 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5; |
10810
9b418bde9fcf
(Fwhere_is_internal): If FIRSTONLY is not nil or non-ascii,
Richard M. Stallman <rms@gnu.org>
parents:
10541
diff
changeset
|
2072 /* 1 means ignore all menu bindings entirely. */ |
9b418bde9fcf
(Fwhere_is_internal): If FIRSTONLY is not nil or non-ascii,
Richard M. Stallman <rms@gnu.org>
parents:
10541
diff
changeset
|
2073 int nomenus = !NILP (firstonly) && !EQ (firstonly, Qnon_ascii); |
250 | 2074 |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2075 found = keymaps; |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2076 while (CONSP (found)) |
29282 | 2077 { |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2078 maps = |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
2079 nconc2 (maps, |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
2080 Faccessible_keymaps (get_keymap (XCAR (found), 1, 0), Qnil)); |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2081 found = XCDR (found); |
29282 | 2082 } |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2083 |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2084 GCPRO5 (definition, keymaps, maps, found, sequences); |
250 | 2085 found = Qnil; |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2086 sequences = Qnil; |
250 | 2087 |
485 | 2088 for (; !NILP (maps); maps = Fcdr (maps)) |
250 | 2089 { |
6502
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
2090 /* Key sequence to reach map, and the map that it reaches */ |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
2091 register Lisp_Object this, map; |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2092 |
250 | 2093 /* In order to fold [META-PREFIX-CHAR CHAR] sequences into |
2094 [M-CHAR] sequences, check if last character of the sequence | |
2095 is the meta-prefix char. */ | |
6502
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
2096 Lisp_Object last; |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
2097 int last_is_meta; |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
2098 |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
2099 this = Fcar (Fcar (maps)); |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
2100 map = Fcdr (Fcar (maps)); |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
2101 last = make_number (XINT (Flength (this)) - 1); |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
2102 last_is_meta = (XINT (last) >= 0 |
18dfda644bc0
(access_keymap, store_in_keymap, Fcopy_keymap, Fdefine_key,
Karl Heuer <kwzh@gnu.org>
parents:
6475
diff
changeset
|
2103 && EQ (Faref (this, last), meta_prefix_char)); |
250 | 2104 |
35706 | 2105 if (nomenus && !ascii_sequence_p (this)) |
34755
1e3d0f2d1145
(where_is_internal): Check ascii_sequence_p rather than
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
34515
diff
changeset
|
2106 /* If no menu entries should be returned, skip over the |
1e3d0f2d1145
(where_is_internal): Check ascii_sequence_p rather than
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
34515
diff
changeset
|
2107 keymaps bound to `menu-bar' and `tool-bar' and other |
1e3d0f2d1145
(where_is_internal): Check ascii_sequence_p rather than
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
34515
diff
changeset
|
2108 non-ascii prefixes. */ |
1e3d0f2d1145
(where_is_internal): Check ascii_sequence_p rather than
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
34515
diff
changeset
|
2109 continue; |
1e3d0f2d1145
(where_is_internal): Check ascii_sequence_p rather than
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
34515
diff
changeset
|
2110 |
1236
5e8c234e5f03
* keymap.c (access_keymap): Remove code to notice bindings for
Jim Blandy <jimb@redhat.com>
parents:
1209
diff
changeset
|
2111 QUIT; |
5e8c234e5f03
* keymap.c (access_keymap): Remove code to notice bindings for
Jim Blandy <jimb@redhat.com>
parents:
1209
diff
changeset
|
2112 |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2113 while (CONSP (map)) |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2114 { |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2115 /* 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
|
2116 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
|
2117 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
|
2118 loop body over both keymap and vector bindings. |
250 | 2119 |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2120 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
|
2121 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
|
2122 have finished off the vector. */ |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
2123 Lisp_Object elt, key, binding; |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2124 elt = XCAR (map); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2125 map = XCDR (map); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2126 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2127 sequences = Qnil; |
250 | 2128 |
1236
5e8c234e5f03
* keymap.c (access_keymap): Remove code to notice bindings for
Jim Blandy <jimb@redhat.com>
parents:
1209
diff
changeset
|
2129 QUIT; |
5e8c234e5f03
* keymap.c (access_keymap): Remove code to notice bindings for
Jim Blandy <jimb@redhat.com>
parents:
1209
diff
changeset
|
2130 |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2131 /* 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
|
2132 advance map and i to the next binding. */ |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
2133 if (VECTORP (elt)) |
250 | 2134 { |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2135 Lisp_Object sequence; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2136 int i; |
250 | 2137 /* In a vector, look at each element. */ |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2138 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
|
2139 { |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2140 binding = AREF (elt, i); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2141 XSETFASTINT (key, i); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2142 sequence = where_is_internal_1 (binding, key, definition, |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2143 noindirect, this, |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2144 last, nomenus, last_is_meta); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2145 if (!NILP (sequence)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2146 sequences = Fcons (sequence, sequences); |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2147 } |
250 | 2148 } |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2149 else if (CHAR_TABLE_P (elt)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2150 { |
20076
374e09781f08
(Faccessible_keymaps): Avoid alloca for fixed-size array.
Karl Heuer <kwzh@gnu.org>
parents:
20070
diff
changeset
|
2151 Lisp_Object indices[3]; |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2152 Lisp_Object args; |
20076
374e09781f08
(Faccessible_keymaps): Avoid alloca for fixed-size array.
Karl Heuer <kwzh@gnu.org>
parents:
20070
diff
changeset
|
2153 |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2154 args = Fcons (Fcons (Fcons (definition, noindirect), |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2155 Qnil), /* Result accumulator. */ |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2156 Fcons (Fcons (this, last), |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2157 Fcons (make_number (nomenus), |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2158 make_number (last_is_meta)))); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2159 map_char_table (where_is_internal_2, Qnil, elt, args, |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2160 0, indices); |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2161 sequences = XCDR (XCAR (args)); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2162 } |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2163 else if (CONSP (elt)) |
250 | 2164 { |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2165 Lisp_Object sequence; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2166 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2167 key = XCAR (elt); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2168 binding = XCDR (elt); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2169 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2170 sequence = where_is_internal_1 (binding, key, definition, |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2171 noindirect, this, |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2172 last, nomenus, last_is_meta); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2173 if (!NILP (sequence)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2174 sequences = Fcons (sequence, sequences); |
250 | 2175 } |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2176 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2177 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2178 for (; ! NILP (sequences); sequences = XCDR (sequences)) |
250 | 2179 { |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2180 Lisp_Object sequence; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2181 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2182 sequence = XCAR (sequences); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2183 |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2184 /* Verify that this key binding is not shadowed by another |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2185 binding for the same key, before we say it exists. |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2186 |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2187 Mechanism: look for local definition of this key and if |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2188 it is defined and does not match what we found then |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2189 ignore this key. |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2190 |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2191 Either nil or number as value from Flookup_key |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2192 means undefined. */ |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2193 if (!EQ (shadow_lookup (keymaps, sequence, Qnil), definition)) |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2194 continue; |
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2195 |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2196 /* It is a true unshadowed match. Record it, unless it's already |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2197 been seen (as could happen when inheriting keymaps). */ |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2198 if (NILP (Fmember (sequence, found))) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2199 found = Fcons (sequence, found); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2200 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2201 /* If firstonly is Qnon_ascii, then we can return the first |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2202 binding we find. If firstonly is not Qnon_ascii but not |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2203 nil, then we should return the first ascii-only binding |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2204 we find. */ |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2205 if (EQ (firstonly, Qnon_ascii)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2206 RETURN_UNGCPRO (sequence); |
35706 | 2207 else if (! NILP (firstonly) && ascii_sequence_p (sequence)) |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2208 RETURN_UNGCPRO (sequence); |
250 | 2209 } |
2210 } | |
2211 } | |
2727
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2212 |
7998
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
2213 UNGCPRO; |
d4b5f4dd9c51
(Flookup_key): Add gcpro.
Richard M. Stallman <rms@gnu.org>
parents:
7894
diff
changeset
|
2214 |
2727
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2215 found = Fnreverse (found); |
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2216 |
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2217 /* 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
|
2218 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
|
2219 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
|
2220 if (! NILP (firstonly)) |
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2221 return Fcar (found); |
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2222 |
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
2223 return found; |
250 | 2224 } |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2225 |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2226 DEFUN ("where-is-internal", Fwhere_is_internal, Swhere_is_internal, 1, 4, 0, |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2227 "Return list of keys that invoke DEFINITION.\n\ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2228 If KEYMAP is non-nil, search only KEYMAP and the global keymap.\n\ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2229 If KEYMAP is nil, search all the currently active keymaps.\n\ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2230 If KEYMAP is a list of keymaps, search only those keymaps.\n\ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2231 \n\ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2232 If optional 3rd arg FIRSTONLY is non-nil, return the first key sequence found,\n\ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2233 rather than a list of all possible key sequences.\n\ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2234 If FIRSTONLY is the symbol `non-ascii', return the first binding found,\n\ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2235 no matter what it is.\n\ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2236 If FIRSTONLY has another non-nil value, prefer sequences of ASCII characters,\n\ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2237 and entirely reject menu bindings.\n\ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2238 \n\ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2239 If optional 4th arg NOINDIRECT is non-nil, don't follow indirections\n\ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2240 to other keymaps or slots. This makes it possible to search for an\n\ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2241 indirect definition itself.") |
35258
f585b46c055a
Call get_local_map with new argument list.
Gerd Moellmann <gerd@gnu.org>
parents:
34906
diff
changeset
|
2242 (definition, keymap, firstonly, noindirect) |
f585b46c055a
Call get_local_map with new argument list.
Gerd Moellmann <gerd@gnu.org>
parents:
34906
diff
changeset
|
2243 Lisp_Object definition, keymap; |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2244 Lisp_Object firstonly, noindirect; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2245 { |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2246 Lisp_Object sequences, keymaps; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2247 /* 1 means ignore all menu bindings entirely. */ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2248 int nomenus = !NILP (firstonly) && !EQ (firstonly, Qnon_ascii); |
35520
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2249 Lisp_Object result; |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2250 |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2251 /* Find the relevant keymaps. */ |
35258
f585b46c055a
Call get_local_map with new argument list.
Gerd Moellmann <gerd@gnu.org>
parents:
34906
diff
changeset
|
2252 if (CONSP (keymap) && KEYMAPP (XCAR (keymap))) |
f585b46c055a
Call get_local_map with new argument list.
Gerd Moellmann <gerd@gnu.org>
parents:
34906
diff
changeset
|
2253 keymaps = keymap; |
f585b46c055a
Call get_local_map with new argument list.
Gerd Moellmann <gerd@gnu.org>
parents:
34906
diff
changeset
|
2254 else if (! NILP (keymap)) |
f585b46c055a
Call get_local_map with new argument list.
Gerd Moellmann <gerd@gnu.org>
parents:
34906
diff
changeset
|
2255 keymaps = Fcons (keymap, Fcons (current_global_map, Qnil)); |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2256 else |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2257 keymaps = |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2258 Fdelq (Qnil, |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2259 nconc2 (Fcurrent_minor_mode_maps (), |
35258
f585b46c055a
Call get_local_map with new argument list.
Gerd Moellmann <gerd@gnu.org>
parents:
34906
diff
changeset
|
2260 Fcons (get_local_map (PT, current_buffer, Qkeymap), |
f585b46c055a
Call get_local_map with new argument list.
Gerd Moellmann <gerd@gnu.org>
parents:
34906
diff
changeset
|
2261 Fcons (get_local_map (PT, current_buffer, |
f585b46c055a
Call get_local_map with new argument list.
Gerd Moellmann <gerd@gnu.org>
parents:
34906
diff
changeset
|
2262 Qlocal_map), |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2263 Fcons (current_global_map, Qnil))))); |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2264 |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2265 /* Only use caching for the menubar (i.e. called with (def nil t nil). |
35258
f585b46c055a
Call get_local_map with new argument list.
Gerd Moellmann <gerd@gnu.org>
parents:
34906
diff
changeset
|
2266 We don't really need to check `keymap'. */ |
f585b46c055a
Call get_local_map with new argument list.
Gerd Moellmann <gerd@gnu.org>
parents:
34906
diff
changeset
|
2267 if (nomenus && NILP (noindirect) && NILP (keymap)) |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2268 { |
35520
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2269 Lisp_Object *defns; |
35781
ffdcf20f53f2
(Fwhere_is_internal): Use the first valid binding
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35706
diff
changeset
|
2270 int i, j, n; |
35552
bf541983af82
(Fwhere_is_internal): Declare gcpro3, gcpro4.
Dave Love <fx@gnu.org>
parents:
35520
diff
changeset
|
2271 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; |
35520
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2272 |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2273 /* Check heuristic-consistency of the cache. */ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2274 if (NILP (Fequal (keymaps, where_is_cache_keymaps))) |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2275 where_is_cache = Qnil; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2276 |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2277 if (NILP (where_is_cache)) |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2278 { |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2279 /* We need to create the cache. */ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2280 Lisp_Object args[2]; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2281 where_is_cache = Fmake_hash_table (0, args); |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2282 where_is_cache_keymaps = Qt; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2283 |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2284 /* Fill in the cache. */ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2285 GCPRO4 (definition, keymaps, firstonly, noindirect); |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2286 where_is_internal (definition, keymaps, firstonly, noindirect); |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2287 UNGCPRO; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2288 |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2289 where_is_cache_keymaps = keymaps; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2290 } |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2291 |
35520
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2292 /* We want to process definitions from the last to the first. |
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2293 Instead of consing, copy definitions to a vector and step |
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2294 over that vector. */ |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2295 sequences = Fgethash (definition, where_is_cache, Qnil); |
35520
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2296 n = Flength (sequences); |
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2297 defns = (Lisp_Object *) alloca (n * sizeof *defns); |
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2298 for (i = 0; CONSP (sequences); sequences = XCDR (sequences)) |
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2299 defns[i++] = XCAR (sequences); |
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2300 |
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2301 /* Verify that the key bindings are not shadowed. Note that |
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2302 the following can GC. */ |
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2303 GCPRO2 (definition, keymaps); |
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2304 result = Qnil; |
35781
ffdcf20f53f2
(Fwhere_is_internal): Use the first valid binding
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35706
diff
changeset
|
2305 j = -1; |
35520
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2306 for (i = n - 1; i >= 0; --i) |
35781
ffdcf20f53f2
(Fwhere_is_internal): Use the first valid binding
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35706
diff
changeset
|
2307 if (EQ (shadow_lookup (keymaps, defns[i], Qnil), definition)) |
ffdcf20f53f2
(Fwhere_is_internal): Use the first valid binding
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35706
diff
changeset
|
2308 { |
ffdcf20f53f2
(Fwhere_is_internal): Use the first valid binding
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35706
diff
changeset
|
2309 if (ascii_sequence_p (defns[i])) |
ffdcf20f53f2
(Fwhere_is_internal): Use the first valid binding
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35706
diff
changeset
|
2310 break; |
ffdcf20f53f2
(Fwhere_is_internal): Use the first valid binding
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35706
diff
changeset
|
2311 else if (j < 0) |
ffdcf20f53f2
(Fwhere_is_internal): Use the first valid binding
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35706
diff
changeset
|
2312 j = i; |
ffdcf20f53f2
(Fwhere_is_internal): Use the first valid binding
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35706
diff
changeset
|
2313 } |
ffdcf20f53f2
(Fwhere_is_internal): Use the first valid binding
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35706
diff
changeset
|
2314 |
ffdcf20f53f2
(Fwhere_is_internal): Use the first valid binding
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35706
diff
changeset
|
2315 result = i >= 0 ? defns[i] : (j >= 0 ? defns[j] : Qnil); |
35520
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2316 UNGCPRO; |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2317 } |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2318 else |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2319 { |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2320 /* Kill the cache so that where_is_internal_1 doesn't think |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2321 we're filling it up. */ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2322 where_is_cache = Qnil; |
35520
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2323 result = where_is_internal (definition, keymaps, firstonly, noindirect); |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2324 } |
35520
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2325 |
beec07f3fec0
(Fwhere_is_internal): Don't nreverse the cached
Gerd Moellmann <gerd@gnu.org>
parents:
35258
diff
changeset
|
2326 return result; |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2327 } |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2328 |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2329 /* This is the function that Fwhere_is_internal calls using map_char_table. |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2330 ARGS has the form |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2331 (((DEFINITION . NOINDIRECT) . (KEYMAP . RESULT)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2332 . |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2333 ((THIS . LAST) . (NOMENUS . LAST_IS_META))) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2334 Since map_char_table doesn't really use the return value from this function, |
30134
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
2335 we the result append to RESULT, the slot in ARGS. |
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
2336 |
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
2337 This function can GC because it calls where_is_internal_1 which can |
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
2338 GC. */ |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2339 |
20319
81424cf4d446
(copy_keymap_1): Fix return type.
Andreas Schwab <schwab@suse.de>
parents:
20076
diff
changeset
|
2340 static void |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2341 where_is_internal_2 (args, key, binding) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2342 Lisp_Object args, key, binding; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2343 { |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2344 Lisp_Object definition, noindirect, this, last; |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2345 Lisp_Object result, sequence; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2346 int nomenus, last_is_meta; |
30134
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
2347 struct gcpro gcpro1, gcpro2, gcpro3; |
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
2348 |
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
2349 GCPRO3 (args, key, binding); |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2350 result = XCDR (XCAR (args)); |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2351 definition = XCAR (XCAR (XCAR (args))); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2352 noindirect = XCDR (XCAR (XCAR (args))); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2353 this = XCAR (XCAR (XCDR (args))); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2354 last = XCDR (XCAR (XCDR (args))); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2355 nomenus = XFASTINT (XCAR (XCDR (XCDR (args)))); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2356 last_is_meta = XFASTINT (XCDR (XCDR (XCDR (args)))); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2357 |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2358 sequence = where_is_internal_1 (binding, key, definition, noindirect, |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2359 this, last, nomenus, last_is_meta); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2360 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2361 if (!NILP (sequence)) |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2362 XCDR (XCAR (args)) = Fcons (sequence, result); |
30134
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
2363 |
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
2364 UNGCPRO; |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2365 } |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2366 |
30134
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
2367 |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2368 /* This function cannot GC. */ |
30134
784ef95b020b
(get_keymap_1): Add comment that this function can GC.
Gerd Moellmann <gerd@gnu.org>
parents:
30030
diff
changeset
|
2369 |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2370 static Lisp_Object |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2371 where_is_internal_1 (binding, key, definition, noindirect, this, last, |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2372 nomenus, last_is_meta) |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2373 Lisp_Object binding, key, definition, noindirect, this, last; |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2374 int nomenus, last_is_meta; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2375 { |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2376 Lisp_Object sequence; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2377 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2378 /* Search through indirections unless that's not wanted. */ |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2379 if (NILP (noindirect)) |
32145
a48fcf036df1
(Fwhere_is_internal): Ignore `menu-bar' and `tool-bar'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32038
diff
changeset
|
2380 binding = get_keyelt (binding, 0); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2381 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2382 /* End this iteration if this element does not match |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2383 the target. */ |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2384 |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2385 if (!(!NILP (where_is_cache) /* everything "matches" during cache-fill. */ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2386 || EQ (binding, definition) |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2387 || (CONSP (definition) && !NILP (Fequal (binding, definition))))) |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2388 /* Doesn't match. */ |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2389 return Qnil; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2390 |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2391 /* We have found a match. Construct the key sequence where we found it. */ |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2392 if (INTEGERP (key) && last_is_meta) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2393 { |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2394 sequence = Fcopy_sequence (this); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2395 Faset (sequence, last, make_number (XINT (key) | meta_modifier)); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2396 } |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2397 else |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2398 sequence = append_key (this, key); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2399 |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2400 if (!NILP (where_is_cache)) |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2401 { |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2402 Lisp_Object sequences = Fgethash (binding, where_is_cache, Qnil); |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2403 Fputhash (binding, Fcons (sequence, sequences), where_is_cache); |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2404 return Qnil; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2405 } |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2406 else |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
2407 return sequence; |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2408 } |
250 | 2409 |
465 | 2410 /* describe-bindings - summarizing all the bindings in a set of keymaps. */ |
2411 | |
20850
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2412 DEFUN ("describe-bindings-internal", Fdescribe_bindings_internal, Sdescribe_bindings_internal, 0, 2, "", |
250 | 2413 "Show a list of all defined keys, and their definitions.\n\ |
20850
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2414 We put that list in a buffer, and display the buffer.\n\ |
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2415 \n\ |
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2416 The optional argument MENUS, if non-nil, says to mention menu bindings.\n\ |
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2417 \(Ordinarily these are omitted from the output.)\n\ |
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2418 The optional argument PREFIX, if non-nil, should be a key sequence;\n\ |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2419 then we display only bindings that start with that prefix.") |
20850
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2420 (menus, prefix) |
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2421 Lisp_Object menus, prefix; |
250 | 2422 { |
2423 register Lisp_Object thisbuf; | |
9273
129621997564
(synkey, Fdescribe_bindings, describe_command): Use new accessor macros
Karl Heuer <kwzh@gnu.org>
parents:
9123
diff
changeset
|
2424 XSETBUFFER (thisbuf, current_buffer); |
250 | 2425 internal_with_output_to_temp_buffer ("*Help*", |
2426 describe_buffer_bindings, | |
20850
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2427 list3 (thisbuf, prefix, menus)); |
250 | 2428 return Qnil; |
2429 } | |
2430 | |
20850
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2431 /* ARG is (BUFFER PREFIX MENU-FLAG). */ |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2432 |
250 | 2433 static Lisp_Object |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2434 describe_buffer_bindings (arg) |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2435 Lisp_Object arg; |
250 | 2436 { |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2437 Lisp_Object descbuf, prefix, shadow; |
20850
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2438 int nomenu; |
7186
092688f7ebbb
(describe_buffer_bindings): gcpro stuff. Delete some unused code.
Karl Heuer <kwzh@gnu.org>
parents:
7184
diff
changeset
|
2439 register Lisp_Object start1; |
092688f7ebbb
(describe_buffer_bindings): gcpro stuff. Delete some unused code.
Karl Heuer <kwzh@gnu.org>
parents:
7184
diff
changeset
|
2440 struct gcpro gcpro1; |
250 | 2441 |
1120
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2442 char *alternate_heading |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2443 = "\ |
20850
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2444 Keyboard translations:\n\n\ |
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2445 You type Translation\n\ |
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2446 -------- -----------\n"; |
250 | 2447 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2448 descbuf = XCAR (arg); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2449 arg = XCDR (arg); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2450 prefix = XCAR (arg); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2451 arg = XCDR (arg); |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2452 nomenu = NILP (XCAR (arg)); |
20850
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2453 |
4575
bf0f07186369
(describe_buffer_bindings): Declare shadow just once.
Richard M. Stallman <rms@gnu.org>
parents:
4138
diff
changeset
|
2454 shadow = Qnil; |
7186
092688f7ebbb
(describe_buffer_bindings): gcpro stuff. Delete some unused code.
Karl Heuer <kwzh@gnu.org>
parents:
7184
diff
changeset
|
2455 GCPRO1 (shadow); |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2456 |
250 | 2457 Fset_buffer (Vstandard_output); |
2458 | |
1120
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2459 /* Report on alternates for keys. */ |
12710
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2460 if (STRINGP (Vkeyboard_translate_table) && !NILP (prefix)) |
1120
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2461 { |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2462 int c; |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2463 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
|
2464 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
|
2465 |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2466 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
|
2467 if (translate[c] != c) |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2468 { |
26481
70d85ae6dfee
(Fsingle_key_description): Use KEY_DESCRIPTION_SIZE to
Kenichi Handa <handa@m17n.org>
parents:
26404
diff
changeset
|
2469 char buf[KEY_DESCRIPTION_SIZE]; |
1120
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2470 char *bufend; |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2471 |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2472 if (alternate_heading) |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2473 { |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2474 insert_string (alternate_heading); |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2475 alternate_heading = 0; |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2476 } |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2477 |
34906
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
2478 bufend = push_key_description (translate[c], buf, 1); |
1120
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2479 insert (buf, bufend - buf); |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2480 Findent_to (make_number (16), make_number (1)); |
34906
333a490b6ebc
(push_key_description): Add parameter FORCE_MULTIBYTE.
Gerd Moellmann <gerd@gnu.org>
parents:
34765
diff
changeset
|
2481 bufend = push_key_description (c, buf, 1); |
1120
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2482 insert (buf, bufend - buf); |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2483 |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2484 insert ("\n", 1); |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2485 } |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2486 |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2487 insert ("\n", 1); |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2488 } |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2489 |
12710
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2490 if (!NILP (Vkey_translation_map)) |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2491 describe_map_tree (Vkey_translation_map, 0, Qnil, prefix, |
20850
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2492 "Key translations", nomenu, 1, 0); |
12710
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2493 |
465 | 2494 { |
2495 int i, nmaps; | |
2496 Lisp_Object *modes, *maps; | |
2497 | |
1120
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2498 /* 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
|
2499 minor modes correctly. */ |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2500 Fset_buffer (descbuf); |
12710
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2501 |
12262
a7d5578ebb25
(Fkey_binding, describe_buffer_bindings):
Karl Heuer <kwzh@gnu.org>
parents:
12151
diff
changeset
|
2502 if (!NILP (current_kboard->Voverriding_terminal_local_map) |
a7d5578ebb25
(Fkey_binding, describe_buffer_bindings):
Karl Heuer <kwzh@gnu.org>
parents:
12151
diff
changeset
|
2503 || !NILP (Voverriding_local_map)) |
5613
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
2504 nmaps = 0; |
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
2505 else |
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
2506 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
|
2507 Fset_buffer (Vstandard_output); |
0a486e1a45bc
* keymap.c (describe_buffer_bindings): Adjust key_heading to match
Jim Blandy <jimb@redhat.com>
parents:
1095
diff
changeset
|
2508 |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2509 /* Print the minor mode maps. */ |
465 | 2510 for (i = 0; i < nmaps; i++) |
2511 { | |
6695
c66bed2f25af
(describe_buffer_bindings): Move XSYMBOL to after SYMBOLP.
Karl Heuer <kwzh@gnu.org>
parents:
6524
diff
changeset
|
2512 /* The title for a minor mode keymap |
4023
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2513 is constructed at run time. |
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2514 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
|
2515 because it takes care of other features when doing so. */ |
6695
c66bed2f25af
(describe_buffer_bindings): Move XSYMBOL to after SYMBOLP.
Karl Heuer <kwzh@gnu.org>
parents:
6524
diff
changeset
|
2516 char *title, *p; |
4023
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2517 |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
2518 if (!SYMBOLP (modes[i])) |
7186
092688f7ebbb
(describe_buffer_bindings): gcpro stuff. Delete some unused code.
Karl Heuer <kwzh@gnu.org>
parents:
7184
diff
changeset
|
2519 abort(); |
092688f7ebbb
(describe_buffer_bindings): gcpro stuff. Delete some unused code.
Karl Heuer <kwzh@gnu.org>
parents:
7184
diff
changeset
|
2520 |
29695
5201e6953968
(describe_buffer_bindings): Add `\f\n' in front of titles.
Gerd Moellmann <gerd@gnu.org>
parents:
29651
diff
changeset
|
2521 p = title = (char *) alloca (42 + XSYMBOL (modes[i])->name->size); |
5201e6953968
(describe_buffer_bindings): Add `\f\n' in front of titles.
Gerd Moellmann <gerd@gnu.org>
parents:
29651
diff
changeset
|
2522 *p++ = '\f'; |
5201e6953968
(describe_buffer_bindings): Add `\f\n' in front of titles.
Gerd Moellmann <gerd@gnu.org>
parents:
29651
diff
changeset
|
2523 *p++ = '\n'; |
7186
092688f7ebbb
(describe_buffer_bindings): gcpro stuff. Delete some unused code.
Karl Heuer <kwzh@gnu.org>
parents:
7184
diff
changeset
|
2524 *p++ = '`'; |
092688f7ebbb
(describe_buffer_bindings): gcpro stuff. Delete some unused code.
Karl Heuer <kwzh@gnu.org>
parents:
7184
diff
changeset
|
2525 bcopy (XSYMBOL (modes[i])->name->data, p, |
092688f7ebbb
(describe_buffer_bindings): gcpro stuff. Delete some unused code.
Karl Heuer <kwzh@gnu.org>
parents:
7184
diff
changeset
|
2526 XSYMBOL (modes[i])->name->size); |
092688f7ebbb
(describe_buffer_bindings): gcpro stuff. Delete some unused code.
Karl Heuer <kwzh@gnu.org>
parents:
7184
diff
changeset
|
2527 p += XSYMBOL (modes[i])->name->size; |
092688f7ebbb
(describe_buffer_bindings): gcpro stuff. Delete some unused code.
Karl Heuer <kwzh@gnu.org>
parents:
7184
diff
changeset
|
2528 *p++ = '\''; |
6695
c66bed2f25af
(describe_buffer_bindings): Move XSYMBOL to after SYMBOLP.
Karl Heuer <kwzh@gnu.org>
parents:
6524
diff
changeset
|
2529 bcopy (" Minor Mode Bindings", p, sizeof (" Minor Mode Bindings") - 1); |
c66bed2f25af
(describe_buffer_bindings): Move XSYMBOL to after SYMBOLP.
Karl Heuer <kwzh@gnu.org>
parents:
6524
diff
changeset
|
2530 p += sizeof (" Minor Mode Bindings") - 1; |
4023
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2531 *p = 0; |
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2532 |
20850
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
2533 describe_map_tree (maps[i], 1, shadow, prefix, title, nomenu, 0, 0); |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2534 shadow = Fcons (maps[i], shadow); |
465 | 2535 } |
2536 } | |
2537 | |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2538 /* Print the (major mode) local map. */ |
12262
a7d5578ebb25
(Fkey_binding, describe_buffer_bindings):
Karl Heuer <kwzh@gnu.org>
parents:
12151
diff
changeset
|
2539 if (!NILP (current_kboard->Voverriding_terminal_local_map)) |
a7d5578ebb25
(Fkey_binding, describe_buffer_bindings):
Karl Heuer <kwzh@gnu.org>
parents:
12151
diff
changeset
|
2540 start1 = current_kboard->Voverriding_terminal_local_map; |
a7d5578ebb25
(Fkey_binding, describe_buffer_bindings):
Karl Heuer <kwzh@gnu.org>
parents:
12151
diff
changeset
|
2541 else if (!NILP (Voverriding_local_map)) |
5613
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
2542 start1 = Voverriding_local_map; |
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
2543 else |
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
2544 start1 = XBUFFER (descbuf)->keymap; |
cad51b2de6cd
(Fkey_binding): Handle Voverriding_local_map.
Richard M. Stallman <rms@gnu.org>
parents:
5551
diff
changeset
|
2545 |
485 | 2546 if (!NILP (start1)) |
250 | 2547 { |
16465
398e3995162d
(describe_buffer_bindings): Pass 1 for PARTIAL
Richard M. Stallman <rms@gnu.org>
parents:
16227
diff
changeset
|
2548 describe_map_tree (start1, 1, shadow, prefix, |
29695
5201e6953968
(describe_buffer_bindings): Add `\f\n' in front of titles.
Gerd Moellmann <gerd@gnu.org>
parents:
29651
diff
changeset
|
2549 "\f\nMajor Mode Bindings", nomenu, 0, 0); |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2550 shadow = Fcons (start1, shadow); |
250 | 2551 } |
2552 | |
16465
398e3995162d
(describe_buffer_bindings): Pass 1 for PARTIAL
Richard M. Stallman <rms@gnu.org>
parents:
16227
diff
changeset
|
2553 describe_map_tree (current_global_map, 1, shadow, prefix, |
29695
5201e6953968
(describe_buffer_bindings): Add `\f\n' in front of titles.
Gerd Moellmann <gerd@gnu.org>
parents:
29651
diff
changeset
|
2554 "\f\nGlobal Bindings", nomenu, 0, 1); |
12710
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2555 |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2556 /* Print the function-key-map translations under this prefix. */ |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2557 if (!NILP (Vfunction_key_map)) |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2558 describe_map_tree (Vfunction_key_map, 0, Qnil, prefix, |
29695
5201e6953968
(describe_buffer_bindings): Add `\f\n' in front of titles.
Gerd Moellmann <gerd@gnu.org>
parents:
29651
diff
changeset
|
2559 "\f\nFunction key map translations", nomenu, 1, 0); |
250 | 2560 |
9862
d35ed70c84d4
(describe_buffer_bindings): Set help-mode in *Help* buffer.
Karl Heuer <kwzh@gnu.org>
parents:
9312
diff
changeset
|
2561 call0 (intern ("help-mode")); |
250 | 2562 Fset_buffer (descbuf); |
7186
092688f7ebbb
(describe_buffer_bindings): gcpro stuff. Delete some unused code.
Karl Heuer <kwzh@gnu.org>
parents:
7184
diff
changeset
|
2563 UNGCPRO; |
250 | 2564 return Qnil; |
2565 } | |
2566 | |
13947 | 2567 /* Insert a description of the key bindings in STARTMAP, |
250 | 2568 followed by those of all maps reachable through STARTMAP. |
2569 If PARTIAL is nonzero, omit certain "uninteresting" commands | |
2570 (such as `undefined'). | |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2571 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
|
2572 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
|
2573 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
|
2574 TITLE, if not 0, is a string to insert at the beginning. |
5551
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2575 TITLE should not end with a colon or a newline; we supply that. |
12710
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2576 If NOMENU is not 0, then omit menu-bar commands. |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2577 |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2578 If TRANSL is nonzero, the definitions are actually key translations |
13245
2e0c4159e94b
(describe_map_tree): New arg always_title. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
13201
diff
changeset
|
2579 so print strings and vectors differently. |
2e0c4159e94b
(describe_map_tree): New arg always_title. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
13201
diff
changeset
|
2580 |
2e0c4159e94b
(describe_map_tree): New arg always_title. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
13201
diff
changeset
|
2581 If ALWAYS_TITLE is nonzero, print the title even if there are no maps |
2e0c4159e94b
(describe_map_tree): New arg always_title. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
13201
diff
changeset
|
2582 to look through. */ |
250 | 2583 |
2584 void | |
13245
2e0c4159e94b
(describe_map_tree): New arg always_title. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
13201
diff
changeset
|
2585 describe_map_tree (startmap, partial, shadow, prefix, title, nomenu, transl, |
2e0c4159e94b
(describe_map_tree): New arg always_title. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
13201
diff
changeset
|
2586 always_title) |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2587 Lisp_Object startmap, shadow, prefix; |
250 | 2588 int partial; |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2589 char *title; |
5551
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2590 int nomenu; |
12710
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2591 int transl; |
13245
2e0c4159e94b
(describe_map_tree): New arg always_title. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
13201
diff
changeset
|
2592 int always_title; |
250 | 2593 { |
20883
4aeabf3b8f98
(describe_map_tree): Add the maps we have already
Richard M. Stallman <rms@gnu.org>
parents:
20850
diff
changeset
|
2594 Lisp_Object maps, orig_maps, seen, sub_shadows; |
7184
caac285c072d
(describe_map_tree): gcpro some things.
Karl Heuer <kwzh@gnu.org>
parents:
7183
diff
changeset
|
2595 struct gcpro gcpro1, gcpro2, gcpro3; |
4023
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2596 int something = 0; |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2597 char *key_heading |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2598 = "\ |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2599 key binding\n\ |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2600 --- -------\n"; |
250 | 2601 |
20883
4aeabf3b8f98
(describe_map_tree): Add the maps we have already
Richard M. Stallman <rms@gnu.org>
parents:
20850
diff
changeset
|
2602 orig_maps = maps = Faccessible_keymaps (startmap, prefix); |
6976
4d540eeb2dd5
(describe_map_tree, describe_map): Skip keymaps we've seen before.
Karl Heuer <kwzh@gnu.org>
parents:
6974
diff
changeset
|
2603 seen = Qnil; |
7184
caac285c072d
(describe_map_tree): gcpro some things.
Karl Heuer <kwzh@gnu.org>
parents:
7183
diff
changeset
|
2604 sub_shadows = Qnil; |
caac285c072d
(describe_map_tree): gcpro some things.
Karl Heuer <kwzh@gnu.org>
parents:
7183
diff
changeset
|
2605 GCPRO3 (maps, seen, sub_shadows); |
250 | 2606 |
5551
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2607 if (nomenu) |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2608 { |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2609 Lisp_Object list; |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2610 |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2611 /* Delete from MAPS each element that is for the menu bar. */ |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2612 for (list = maps; !NILP (list); list = XCDR (list)) |
5551
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2613 { |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2614 Lisp_Object elt, prefix, tem; |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2615 |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2616 elt = Fcar (list); |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2617 prefix = Fcar (elt); |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2618 if (XVECTOR (prefix)->size >= 1) |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2619 { |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2620 tem = Faref (prefix, make_number (0)); |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2621 if (EQ (tem, Qmenu_bar)) |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2622 maps = Fdelq (elt, maps); |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2623 } |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2624 } |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2625 } |
2b8f405f5103
(describe_map_tree): New arg NOMENU.
Richard M. Stallman <rms@gnu.org>
parents:
5367
diff
changeset
|
2626 |
13245
2e0c4159e94b
(describe_map_tree): New arg always_title. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
13201
diff
changeset
|
2627 if (!NILP (maps) || always_title) |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2628 { |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2629 if (title) |
4023
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2630 { |
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2631 insert_string (title); |
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2632 if (!NILP (prefix)) |
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2633 { |
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2634 insert_string (" Starting With "); |
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2635 insert1 (Fkey_description (prefix)); |
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2636 } |
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2637 insert_string (":\n"); |
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2638 } |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2639 insert_string (key_heading); |
4023
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2640 something = 1; |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2641 } |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2642 |
485 | 2643 for (; !NILP (maps); maps = Fcdr (maps)) |
250 | 2644 { |
7184
caac285c072d
(describe_map_tree): gcpro some things.
Karl Heuer <kwzh@gnu.org>
parents:
7183
diff
changeset
|
2645 register Lisp_Object elt, prefix, tail; |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2646 |
250 | 2647 elt = Fcar (maps); |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2648 prefix = Fcar (elt); |
250 | 2649 |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2650 sub_shadows = Qnil; |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2651 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2652 for (tail = shadow; CONSP (tail); tail = XCDR (tail)) |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2653 { |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2654 Lisp_Object shmap; |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2655 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2656 shmap = XCAR (tail); |
250 | 2657 |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2658 /* 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
|
2659 then the shadow map for this keymap is just SHADOW. */ |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
2660 if ((STRINGP (prefix) && XSTRING (prefix)->size == 0) |
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
2661 || (VECTORP (prefix) && XVECTOR (prefix)->size == 0)) |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2662 ; |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2663 /* 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
|
2664 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
|
2665 what we should use. */ |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2666 else |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2667 { |
6859
f34b91fa388c
(describe_map_tree): Fix call to Flookup_key.
Richard M. Stallman <rms@gnu.org>
parents:
6834
diff
changeset
|
2668 shmap = Flookup_key (shmap, Fcar (elt), Qt); |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
2669 if (INTEGERP (shmap)) |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2670 shmap = Qnil; |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2671 } |
250 | 2672 |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2673 /* 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
|
2674 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
|
2675 describe this map at all. */ |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
2676 if (!NILP (shmap) && !KEYMAPP (shmap)) |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2677 goto skip; |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2678 |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2679 if (!NILP (shmap)) |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2680 sub_shadows = Fcons (shmap, sub_shadows); |
250 | 2681 } |
2682 | |
20883
4aeabf3b8f98
(describe_map_tree): Add the maps we have already
Richard M. Stallman <rms@gnu.org>
parents:
20850
diff
changeset
|
2683 /* Maps we have already listed in this loop shadow this map. */ |
4aeabf3b8f98
(describe_map_tree): Add the maps we have already
Richard M. Stallman <rms@gnu.org>
parents:
20850
diff
changeset
|
2684 for (tail = orig_maps; ! EQ (tail, maps); tail = XCDR (tail)) |
4aeabf3b8f98
(describe_map_tree): Add the maps we have already
Richard M. Stallman <rms@gnu.org>
parents:
20850
diff
changeset
|
2685 { |
4aeabf3b8f98
(describe_map_tree): Add the maps we have already
Richard M. Stallman <rms@gnu.org>
parents:
20850
diff
changeset
|
2686 Lisp_Object tem; |
4aeabf3b8f98
(describe_map_tree): Add the maps we have already
Richard M. Stallman <rms@gnu.org>
parents:
20850
diff
changeset
|
2687 tem = Fequal (Fcar (XCAR (tail)), prefix); |
4aeabf3b8f98
(describe_map_tree): Add the maps we have already
Richard M. Stallman <rms@gnu.org>
parents:
20850
diff
changeset
|
2688 if (! NILP (tem)) |
4aeabf3b8f98
(describe_map_tree): Add the maps we have already
Richard M. Stallman <rms@gnu.org>
parents:
20850
diff
changeset
|
2689 sub_shadows = Fcons (XCDR (XCAR (tail)), sub_shadows); |
4aeabf3b8f98
(describe_map_tree): Add the maps we have already
Richard M. Stallman <rms@gnu.org>
parents:
20850
diff
changeset
|
2690 } |
4aeabf3b8f98
(describe_map_tree): Add the maps we have already
Richard M. Stallman <rms@gnu.org>
parents:
20850
diff
changeset
|
2691 |
4aeabf3b8f98
(describe_map_tree): Add the maps we have already
Richard M. Stallman <rms@gnu.org>
parents:
20850
diff
changeset
|
2692 describe_map (Fcdr (elt), prefix, |
12710
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2693 transl ? describe_translation : describe_command, |
14129
d0b95da4f1f2
(describe_map): New arg nomenu.
Karl Heuer <kwzh@gnu.org>
parents:
14099
diff
changeset
|
2694 partial, sub_shadows, &seen, nomenu); |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2695 |
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2696 skip: ; |
250 | 2697 } |
2698 | |
4023
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2699 if (something) |
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2700 insert_string ("\n"); |
5e4f918d5d44
(describe_map_tree): When inserting TITLE, mention PREFIX.
Richard M. Stallman <rms@gnu.org>
parents:
3962
diff
changeset
|
2701 |
250 | 2702 UNGCPRO; |
2703 } | |
2704 | |
14304
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2705 static int previous_description_column; |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2706 |
250 | 2707 static void |
2708 describe_command (definition) | |
2709 Lisp_Object definition; | |
2710 { | |
2711 register Lisp_Object tem1; | |
14304
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2712 int column = current_column (); |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2713 int description_column; |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2714 |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2715 /* If column 16 is no good, go to col 32; |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2716 but don't push beyond that--go to next line instead. */ |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2717 if (column > 30) |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2718 { |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2719 insert_char ('\n'); |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2720 description_column = 32; |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2721 } |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2722 else if (column > 14 || (column > 10 && previous_description_column == 32)) |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2723 description_column = 32; |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2724 else |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2725 description_column = 16; |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2726 |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2727 Findent_to (make_number (description_column), make_number (1)); |
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2728 previous_description_column = description_column; |
250 | 2729 |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
2730 if (SYMBOLP (definition)) |
250 | 2731 { |
9273
129621997564
(synkey, Fdescribe_bindings, describe_command): Use new accessor macros
Karl Heuer <kwzh@gnu.org>
parents:
9123
diff
changeset
|
2732 XSETSTRING (tem1, XSYMBOL (definition)->name); |
250 | 2733 insert1 (tem1); |
21539
b9606d56f91f
Revert erroneous 1998-04-08 change.
Dave Love <fx@gnu.org>
parents:
21514
diff
changeset
|
2734 insert_string ("\n"); |
250 | 2735 } |
12710
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2736 else if (STRINGP (definition) || VECTORP (definition)) |
5367
e4f5f2674f34
(describe_command): If binding is a kbd macro, say so.
Richard M. Stallman <rms@gnu.org>
parents:
5246
diff
changeset
|
2737 insert_string ("Keyboard Macro\n"); |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
2738 else if (KEYMAPP (definition)) |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
2739 insert_string ("Prefix Command\n"); |
250 | 2740 else |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
2741 insert_string ("??\n"); |
250 | 2742 } |
2743 | |
12710
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2744 static void |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2745 describe_translation (definition) |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2746 Lisp_Object definition; |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2747 { |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2748 register Lisp_Object tem1; |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2749 |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2750 Findent_to (make_number (16), make_number (1)); |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2751 |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2752 if (SYMBOLP (definition)) |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2753 { |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2754 XSETSTRING (tem1, XSYMBOL (definition)->name); |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2755 insert1 (tem1); |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2756 insert_string ("\n"); |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2757 } |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2758 else if (STRINGP (definition) || VECTORP (definition)) |
13343
cc0f24bdfab1
(describe_translation): Insert newline after key description.
Richard M. Stallman <rms@gnu.org>
parents:
13245
diff
changeset
|
2759 { |
cc0f24bdfab1
(describe_translation): Insert newline after key description.
Richard M. Stallman <rms@gnu.org>
parents:
13245
diff
changeset
|
2760 insert1 (Fkey_description (definition)); |
cc0f24bdfab1
(describe_translation): Insert newline after key description.
Richard M. Stallman <rms@gnu.org>
parents:
13245
diff
changeset
|
2761 insert_string ("\n"); |
cc0f24bdfab1
(describe_translation): Insert newline after key description.
Richard M. Stallman <rms@gnu.org>
parents:
13245
diff
changeset
|
2762 } |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
2763 else if (KEYMAPP (definition)) |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
2764 insert_string ("Prefix Command\n"); |
12710
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2765 else |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32889
diff
changeset
|
2766 insert_string ("??\n"); |
12710
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2767 } |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
2768 |
6974
ab22b527d380
(describe_map): Merge with describe_map_2.
Karl Heuer <kwzh@gnu.org>
parents:
6859
diff
changeset
|
2769 /* Describe the contents of map MAP, assuming that this map itself is |
ab22b527d380
(describe_map): Merge with describe_map_2.
Karl Heuer <kwzh@gnu.org>
parents:
6859
diff
changeset
|
2770 reached by the sequence of prefix keys KEYS (a string or vector). |
14129
d0b95da4f1f2
(describe_map): New arg nomenu.
Karl Heuer <kwzh@gnu.org>
parents:
14099
diff
changeset
|
2771 PARTIAL, SHADOW, NOMENU are as in `describe_map_tree' above. */ |
250 | 2772 |
2773 static void | |
14129
d0b95da4f1f2
(describe_map): New arg nomenu.
Karl Heuer <kwzh@gnu.org>
parents:
14099
diff
changeset
|
2774 describe_map (map, keys, elt_describer, partial, shadow, seen, nomenu) |
6974
ab22b527d380
(describe_map): Merge with describe_map_2.
Karl Heuer <kwzh@gnu.org>
parents:
6859
diff
changeset
|
2775 register Lisp_Object map; |
ab22b527d380
(describe_map): Merge with describe_map_2.
Karl Heuer <kwzh@gnu.org>
parents:
6859
diff
changeset
|
2776 Lisp_Object keys; |
20381
1dd3842977c0
(describe_map): Fix decl of arg ELT_DESCRIBER.
Andreas Schwab <schwab@suse.de>
parents:
20374
diff
changeset
|
2777 void (*elt_describer) P_ ((Lisp_Object)); |
250 | 2778 int partial; |
2779 Lisp_Object shadow; | |
6976
4d540eeb2dd5
(describe_map_tree, describe_map): Skip keymaps we've seen before.
Karl Heuer <kwzh@gnu.org>
parents:
6974
diff
changeset
|
2780 Lisp_Object *seen; |
14129
d0b95da4f1f2
(describe_map): New arg nomenu.
Karl Heuer <kwzh@gnu.org>
parents:
14099
diff
changeset
|
2781 int nomenu; |
250 | 2782 { |
6974
ab22b527d380
(describe_map): Merge with describe_map_2.
Karl Heuer <kwzh@gnu.org>
parents:
6859
diff
changeset
|
2783 Lisp_Object elt_prefix; |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2784 Lisp_Object tail, definition, event; |
3908
a148b4ff79c6
(describe_map_2): Cleanups.
Richard M. Stallman <rms@gnu.org>
parents:
3735
diff
changeset
|
2785 Lisp_Object tem; |
250 | 2786 Lisp_Object suppress; |
2787 Lisp_Object kludge; | |
2788 int first = 1; | |
2789 struct gcpro gcpro1, gcpro2, gcpro3; | |
2790 | |
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31496
diff
changeset
|
2791 suppress = Qnil; |
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31496
diff
changeset
|
2792 |
6974
ab22b527d380
(describe_map): Merge with describe_map_2.
Karl Heuer <kwzh@gnu.org>
parents:
6859
diff
changeset
|
2793 if (!NILP (keys) && XFASTINT (Flength (keys)) > 0) |
ab22b527d380
(describe_map): Merge with describe_map_2.
Karl Heuer <kwzh@gnu.org>
parents:
6859
diff
changeset
|
2794 { |
ab22b527d380
(describe_map): Merge with describe_map_2.
Karl Heuer <kwzh@gnu.org>
parents:
6859
diff
changeset
|
2795 /* Call Fkey_description first, to avoid GC bug for the other string. */ |
ab22b527d380
(describe_map): Merge with describe_map_2.
Karl Heuer <kwzh@gnu.org>
parents:
6859
diff
changeset
|
2796 tem = Fkey_description (keys); |
ab22b527d380
(describe_map): Merge with describe_map_2.
Karl Heuer <kwzh@gnu.org>
parents:
6859
diff
changeset
|
2797 elt_prefix = concat2 (tem, build_string (" ")); |
ab22b527d380
(describe_map): Merge with describe_map_2.
Karl Heuer <kwzh@gnu.org>
parents:
6859
diff
changeset
|
2798 } |
ab22b527d380
(describe_map): Merge with describe_map_2.
Karl Heuer <kwzh@gnu.org>
parents:
6859
diff
changeset
|
2799 else |
ab22b527d380
(describe_map): Merge with describe_map_2.
Karl Heuer <kwzh@gnu.org>
parents:
6859
diff
changeset
|
2800 elt_prefix = Qnil; |
ab22b527d380
(describe_map): Merge with describe_map_2.
Karl Heuer <kwzh@gnu.org>
parents:
6859
diff
changeset
|
2801 |
250 | 2802 if (partial) |
2803 suppress = intern ("suppress-keymap"); | |
2804 | |
2805 /* 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
|
2806 that is done once per keymap element, we don't want to cons up a |
250 | 2807 fresh vector every time. */ |
2808 kludge = Fmake_vector (make_number (1), Qnil); | |
3908
a148b4ff79c6
(describe_map_2): Cleanups.
Richard M. Stallman <rms@gnu.org>
parents:
3735
diff
changeset
|
2809 definition = Qnil; |
250 | 2810 |
3908
a148b4ff79c6
(describe_map_2): Cleanups.
Richard M. Stallman <rms@gnu.org>
parents:
3735
diff
changeset
|
2811 GCPRO3 (elt_prefix, definition, kludge); |
250 | 2812 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2813 for (tail = map; CONSP (tail); tail = XCDR (tail)) |
250 | 2814 { |
2815 QUIT; | |
2816 | |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2817 if (VECTORP (XCAR (tail)) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2818 || CHAR_TABLE_P (XCAR (tail))) |
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2819 describe_vector (XCAR (tail), |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2820 elt_prefix, elt_describer, partial, shadow, map, |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2821 (int *)0, 0); |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2822 else if (CONSP (XCAR (tail))) |
250 | 2823 { |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2824 event = XCAR (XCAR (tail)); |
7341
516dd16e2017
(describe_map): Ignore bindings for all except symbols and integers.
Richard M. Stallman <rms@gnu.org>
parents:
7191
diff
changeset
|
2825 |
516dd16e2017
(describe_map): Ignore bindings for all except symbols and integers.
Richard M. Stallman <rms@gnu.org>
parents:
7191
diff
changeset
|
2826 /* Ignore bindings whose "keys" are not really valid events. |
516dd16e2017
(describe_map): Ignore bindings for all except symbols and integers.
Richard M. Stallman <rms@gnu.org>
parents:
7191
diff
changeset
|
2827 (We get these in the frames and buffers menu.) */ |
516dd16e2017
(describe_map): Ignore bindings for all except symbols and integers.
Richard M. Stallman <rms@gnu.org>
parents:
7191
diff
changeset
|
2828 if (! (SYMBOLP (event) || INTEGERP (event))) |
7191
bd2f9c5ee54e
(Fsingle_key_description): Undo previous change.
Karl Heuer <kwzh@gnu.org>
parents:
7186
diff
changeset
|
2829 continue; |
7341
516dd16e2017
(describe_map): Ignore bindings for all except symbols and integers.
Richard M. Stallman <rms@gnu.org>
parents:
7191
diff
changeset
|
2830 |
14129
d0b95da4f1f2
(describe_map): New arg nomenu.
Karl Heuer <kwzh@gnu.org>
parents:
14099
diff
changeset
|
2831 if (nomenu && EQ (event, Qmenu_bar)) |
d0b95da4f1f2
(describe_map): New arg nomenu.
Karl Heuer <kwzh@gnu.org>
parents:
14099
diff
changeset
|
2832 continue; |
d0b95da4f1f2
(describe_map): New arg nomenu.
Karl Heuer <kwzh@gnu.org>
parents:
14099
diff
changeset
|
2833 |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2834 definition = get_keyelt (XCDR (XCAR (tail)), 0); |
250 | 2835 |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2836 /* Don't show undefined commands or suppressed commands. */ |
3908
a148b4ff79c6
(describe_map_2): Cleanups.
Richard M. Stallman <rms@gnu.org>
parents:
3735
diff
changeset
|
2837 if (NILP (definition)) continue; |
9123
c225137ddefb
(get_keyelt, store_in_keymap, Fcopy_keymap, Fdefine_key, Flookup_key,
Karl Heuer <kwzh@gnu.org>
parents:
8922
diff
changeset
|
2838 if (SYMBOLP (definition) && partial) |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2839 { |
3908
a148b4ff79c6
(describe_map_2): Cleanups.
Richard M. Stallman <rms@gnu.org>
parents:
3735
diff
changeset
|
2840 tem = Fget (definition, suppress); |
a148b4ff79c6
(describe_map_2): Cleanups.
Richard M. Stallman <rms@gnu.org>
parents:
3735
diff
changeset
|
2841 if (!NILP (tem)) |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2842 continue; |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2843 } |
250 | 2844 |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2845 /* 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
|
2846 because a local definition of the same key shadows it. */ |
250 | 2847 |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
2848 ASET (kludge, 0, event); |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2849 if (!NILP (shadow)) |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2850 { |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
2851 tem = shadow_lookup (shadow, kludge, Qt); |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2852 if (!NILP (tem)) continue; |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2853 } |
250 | 2854 |
6974
ab22b527d380
(describe_map): Merge with describe_map_2.
Karl Heuer <kwzh@gnu.org>
parents:
6859
diff
changeset
|
2855 tem = Flookup_key (map, kludge, Qt); |
3908
a148b4ff79c6
(describe_map_2): Cleanups.
Richard M. Stallman <rms@gnu.org>
parents:
3735
diff
changeset
|
2856 if (! EQ (tem, definition)) continue; |
a148b4ff79c6
(describe_map_2): Cleanups.
Richard M. Stallman <rms@gnu.org>
parents:
3735
diff
changeset
|
2857 |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2858 if (first) |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2859 { |
14304
57194b6a555d
(Faccessible_keymaps): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2860 previous_description_column = 0; |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2861 insert ("\n", 1); |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2862 first = 0; |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2863 } |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2864 |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2865 if (!NILP (elt_prefix)) |
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2866 insert1 (elt_prefix); |
250 | 2867 |
3908
a148b4ff79c6
(describe_map_2): Cleanups.
Richard M. Stallman <rms@gnu.org>
parents:
3735
diff
changeset
|
2868 /* THIS gets the string to describe the character EVENT. */ |
30559
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
2869 insert1 (Fsingle_key_description (event, Qnil)); |
250 | 2870 |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2871 /* 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
|
2872 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
|
2873 for alignment purposes. */ |
3908
a148b4ff79c6
(describe_map_2): Cleanups.
Richard M. Stallman <rms@gnu.org>
parents:
3735
diff
changeset
|
2874 (*elt_describer) (definition); |
1209
1aa2cd425737
* keymap.c (DENSE_TABLE_SIZE): Doc fix.
Jim Blandy <jimb@redhat.com>
parents:
1160
diff
changeset
|
2875 } |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2876 else if (EQ (XCAR (tail), Qkeymap)) |
6976
4d540eeb2dd5
(describe_map_tree, describe_map): Skip keymaps we've seen before.
Karl Heuer <kwzh@gnu.org>
parents:
6974
diff
changeset
|
2877 { |
4d540eeb2dd5
(describe_map_tree, describe_map): Skip keymaps we've seen before.
Karl Heuer <kwzh@gnu.org>
parents:
6974
diff
changeset
|
2878 /* The same keymap might be in the structure twice, if we're |
4d540eeb2dd5
(describe_map_tree, describe_map): Skip keymaps we've seen before.
Karl Heuer <kwzh@gnu.org>
parents:
6974
diff
changeset
|
2879 using an inherited keymap. So skip anything we've already |
4d540eeb2dd5
(describe_map_tree, describe_map): Skip keymaps we've seen before.
Karl Heuer <kwzh@gnu.org>
parents:
6974
diff
changeset
|
2880 encountered. */ |
4d540eeb2dd5
(describe_map_tree, describe_map): Skip keymaps we've seen before.
Karl Heuer <kwzh@gnu.org>
parents:
6974
diff
changeset
|
2881 tem = Fassq (tail, *seen); |
25662
0a7261c1d487
Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
25600
diff
changeset
|
2882 if (CONSP (tem) && !NILP (Fequal (XCAR (tem), keys))) |
6976
4d540eeb2dd5
(describe_map_tree, describe_map): Skip keymaps we've seen before.
Karl Heuer <kwzh@gnu.org>
parents:
6974
diff
changeset
|
2883 break; |
4d540eeb2dd5
(describe_map_tree, describe_map): Skip keymaps we've seen before.
Karl Heuer <kwzh@gnu.org>
parents:
6974
diff
changeset
|
2884 *seen = Fcons (Fcons (tail, keys), *seen); |
4d540eeb2dd5
(describe_map_tree, describe_map): Skip keymaps we've seen before.
Karl Heuer <kwzh@gnu.org>
parents:
6974
diff
changeset
|
2885 } |
250 | 2886 } |
2887 | |
2888 UNGCPRO; | |
2889 } | |
2890 | |
20319
81424cf4d446
(copy_keymap_1): Fix return type.
Andreas Schwab <schwab@suse.de>
parents:
20076
diff
changeset
|
2891 static void |
250 | 2892 describe_vector_princ (elt) |
2893 Lisp_Object elt; | |
2894 { | |
3691
49ce2242f5c1
(get_keymap_1): Add missing semicolon.
Richard M. Stallman <rms@gnu.org>
parents:
3674
diff
changeset
|
2895 Findent_to (make_number (16), make_number (1)); |
250 | 2896 Fprinc (elt, Qnil); |
3632
72cfde0cd8cd
(Fdescribe_vector): Use current buf, not standard-output.
Richard M. Stallman <rms@gnu.org>
parents:
3542
diff
changeset
|
2897 Fterpri (Qnil); |
250 | 2898 } |
2899 | |
2900 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
|
2901 "Insert a description of contents of VECTOR.\n\ |
250 | 2902 This is text showing the elements of vector matched against indices.") |
2903 (vector) | |
2904 Lisp_Object vector; | |
2905 { | |
3632
72cfde0cd8cd
(Fdescribe_vector): Use current buf, not standard-output.
Richard M. Stallman <rms@gnu.org>
parents:
3542
diff
changeset
|
2906 int count = specpdl_ptr - specpdl; |
72cfde0cd8cd
(Fdescribe_vector): Use current buf, not standard-output.
Richard M. Stallman <rms@gnu.org>
parents:
3542
diff
changeset
|
2907 |
72cfde0cd8cd
(Fdescribe_vector): Use current buf, not standard-output.
Richard M. Stallman <rms@gnu.org>
parents:
3542
diff
changeset
|
2908 specbind (Qstandard_output, Fcurrent_buffer ()); |
13201
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2909 CHECK_VECTOR_OR_CHAR_TABLE (vector, 0); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2910 describe_vector (vector, Qnil, describe_vector_princ, 0, |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2911 Qnil, Qnil, (int *)0, 0); |
3632
72cfde0cd8cd
(Fdescribe_vector): Use current buf, not standard-output.
Richard M. Stallman <rms@gnu.org>
parents:
3542
diff
changeset
|
2912 |
72cfde0cd8cd
(Fdescribe_vector): Use current buf, not standard-output.
Richard M. Stallman <rms@gnu.org>
parents:
3542
diff
changeset
|
2913 return unbind_to (count, Qnil); |
250 | 2914 } |
2915 | |
13201
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2916 /* Insert in the current buffer a description of the contents of VECTOR. |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2917 We call ELT_DESCRIBER to insert the description of one value found |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2918 in VECTOR. |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2919 |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2920 ELT_PREFIX describes what "comes before" the keys or indices defined |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2921 by this vector. This is a human-readable string whose size |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2922 is not necessarily related to the situation. |
13201
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2923 |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2924 If the vector is in a keymap, ELT_PREFIX is a prefix key which |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2925 leads to this keymap. |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2926 |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2927 If the vector is a chartable, ELT_PREFIX is the vector |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2928 of bytes that lead to the character set or portion of a character |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2929 set described by this chartable. |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2930 |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2931 If PARTIAL is nonzero, it means do not mention suppressed commands |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2932 (that assumes the vector is in a keymap). |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2933 |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2934 SHADOW is a list of keymaps that shadow this map. |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2935 If it is non-nil, then we look up the key in those maps |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2936 and we don't mention it now if it is defined by any of them. |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2937 |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2938 ENTIRE_MAP is the keymap in which this vector appears. |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2939 If the definition in effect in the whole map does not match |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2940 the one in this vector, we ignore this one. |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2941 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2942 When describing a sub-char-table, INDICES is a list of |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2943 indices at higher levels in this char-table, |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2944 and CHAR_TABLE_DEPTH says how many levels down we have gone. */ |
13201
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
2945 |
20374
0b6c4f1041ae
(describe_vector): Declaration fixed (delete `.' at the
Kenichi Handa <handa@m17n.org>
parents:
20319
diff
changeset
|
2946 void |
11973
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
2947 describe_vector (vector, elt_prefix, elt_describer, |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2948 partial, shadow, entire_map, |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2949 indices, char_table_depth) |
250 | 2950 register Lisp_Object vector; |
2951 Lisp_Object elt_prefix; | |
20319
81424cf4d446
(copy_keymap_1): Fix return type.
Andreas Schwab <schwab@suse.de>
parents:
20076
diff
changeset
|
2952 void (*elt_describer) P_ ((Lisp_Object)); |
250 | 2953 int partial; |
2954 Lisp_Object shadow; | |
11973
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
2955 Lisp_Object entire_map; |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2956 int *indices; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2957 int char_table_depth; |
250 | 2958 { |
11973
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
2959 Lisp_Object definition; |
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
2960 Lisp_Object tem2; |
250 | 2961 register int i; |
2962 Lisp_Object suppress; | |
2963 Lisp_Object kludge; | |
2964 int first = 1; | |
25785
0d701c4484e3
(Flookup_key, Faccessible_keymaps, describe_vector,
Gerd Moellmann <gerd@gnu.org>
parents:
25662
diff
changeset
|
2965 struct gcpro gcpro1, gcpro2, gcpro3; |
17036 | 2966 /* Range of elements to be handled. */ |
2967 int from, to; | |
2968 /* A flag to tell if a leaf in this level of char-table is not a | |
2969 generic character (i.e. a complete multibyte character). */ | |
2970 int complete_char; | |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2971 int character; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2972 int starting_i; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2973 |
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31496
diff
changeset
|
2974 suppress = Qnil; |
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31496
diff
changeset
|
2975 |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2976 if (indices == 0) |
18613
614b916ff5bf
Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents:
18142
diff
changeset
|
2977 indices = (int *) alloca (3 * sizeof (int)); |
250 | 2978 |
11973
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
2979 definition = Qnil; |
250 | 2980 |
2981 /* This vector gets used to present single keys to Flookup_key. Since | |
2982 that is done once per vector element, we don't want to cons up a | |
2983 fresh vector every time. */ | |
2984 kludge = Fmake_vector (make_number (1), Qnil); | |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2985 GCPRO3 (elt_prefix, definition, kludge); |
250 | 2986 |
2987 if (partial) | |
2988 suppress = intern ("suppress-keymap"); | |
2989 | |
17036 | 2990 if (CHAR_TABLE_P (vector)) |
2991 { | |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2992 if (char_table_depth == 0) |
17036 | 2993 { |
17327
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
2994 /* VECTOR is a top level char-table. */ |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
2995 complete_char = 1; |
17036 | 2996 from = 0; |
2997 to = CHAR_TABLE_ORDINARY_SLOTS; | |
2998 } | |
2999 else | |
3000 { | |
17327
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3001 /* VECTOR is a sub char-table. */ |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3002 if (char_table_depth >= 3) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3003 /* A char-table is never that deep. */ |
17327
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3004 error ("Too deep char table"); |
17036 | 3005 |
3006 complete_char | |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3007 = (CHARSET_VALID_P (indices[0]) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3008 && ((CHARSET_DIMENSION (indices[0]) == 1 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3009 && char_table_depth == 1) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3010 || char_table_depth == 2)); |
17036 | 3011 |
3012 /* Meaningful elements are from 32th to 127th. */ | |
3013 from = 32; | |
17327
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3014 to = SUB_CHAR_TABLE_ORDINARY_SLOTS; |
17036 | 3015 } |
3016 } | |
3017 else | |
3018 { | |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3019 /* This does the right thing for ordinary vectors. */ |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3020 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3021 complete_char = 1; |
17036 | 3022 from = 0; |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3023 to = XVECTOR (vector)->size; |
17036 | 3024 } |
3025 | |
3026 for (i = from; i < to; i++) | |
250 | 3027 { |
3028 QUIT; | |
17189
7c008ec99e97
(describe_vector): Adjusted for the change of CHAR_TABLE_ORDINARY_SLOTS.
Kenichi Handa <handa@m17n.org>
parents:
17111
diff
changeset
|
3029 |
17327
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3030 if (CHAR_TABLE_P (vector)) |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3031 { |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3032 if (char_table_depth == 0 && i >= CHAR_TABLE_SINGLE_BYTE_SLOTS) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3033 complete_char = 0; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3034 |
17327
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3035 if (i >= CHAR_TABLE_SINGLE_BYTE_SLOTS |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3036 && !CHARSET_DEFINED_P (i - 128)) |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3037 continue; |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3038 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3039 definition |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3040 = get_keyelt (XCHAR_TABLE (vector)->contents[i], 0); |
17327
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3041 } |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3042 else |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
3043 definition = get_keyelt (AREF (vector, i), 0); |
250 | 3044 |
17511
10ead0052174
(describe_vector): Test for suppressed commands in
Richard M. Stallman <rms@gnu.org>
parents:
17510
diff
changeset
|
3045 if (NILP (definition)) continue; |
10ead0052174
(describe_vector): Test for suppressed commands in
Richard M. Stallman <rms@gnu.org>
parents:
17510
diff
changeset
|
3046 |
250 | 3047 /* Don't mention suppressed commands. */ |
11973
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
3048 if (SYMBOLP (definition) && partial) |
250 | 3049 { |
17036 | 3050 Lisp_Object tem; |
3051 | |
3052 tem = Fget (definition, suppress); | |
3053 | |
3054 if (!NILP (tem)) continue; | |
250 | 3055 } |
3056 | |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3057 /* Set CHARACTER to the character this entry describes, if any. |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3058 Also update *INDICES. */ |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3059 if (CHAR_TABLE_P (vector)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3060 { |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3061 indices[char_table_depth] = i; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3062 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3063 if (char_table_depth == 0) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3064 { |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3065 character = i; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3066 indices[0] = i - 128; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3067 } |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3068 else if (complete_char) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3069 { |
29013
b9565b4bcdf8
(Fsingle_key_description): Use SPLIT_CHAR instead of
Kenichi Handa <handa@m17n.org>
parents:
26864
diff
changeset
|
3070 character = MAKE_CHAR (indices[0], indices[1], indices[2]); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3071 } |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3072 else |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3073 character = 0; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3074 } |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3075 else |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3076 character = i; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3077 |
11973
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
3078 /* If this binding is shadowed by some other map, ignore it. */ |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3079 if (!NILP (shadow) && complete_char) |
250 | 3080 { |
3081 Lisp_Object tem; | |
3082 | |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
3083 ASET (kludge, 0, make_number (character)); |
3952
f9dfc2872fb0
(describe_map_tree): Insert key_heading here.
Richard M. Stallman <rms@gnu.org>
parents:
3908
diff
changeset
|
3084 tem = shadow_lookup (shadow, kludge, Qt); |
250 | 3085 |
485 | 3086 if (!NILP (tem)) continue; |
250 | 3087 } |
3088 | |
11973
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
3089 /* Ignore this definition if it is shadowed by an earlier |
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
3090 one in the same keymap. */ |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3091 if (!NILP (entire_map) && complete_char) |
11973
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
3092 { |
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
3093 Lisp_Object tem; |
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
3094 |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
3095 ASET (kludge, 0, make_number (character)); |
11973
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
3096 tem = Flookup_key (entire_map, kludge, Qt); |
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
3097 |
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
3098 if (! EQ (tem, definition)) |
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
3099 continue; |
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
3100 } |
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
3101 |
250 | 3102 if (first) |
3103 { | |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3104 if (char_table_depth == 0) |
17036 | 3105 insert ("\n", 1); |
250 | 3106 first = 0; |
3107 } | |
3108 | |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3109 /* For a sub char-table, show the depth by indentation. |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3110 CHAR_TABLE_DEPTH can be greater than 0 only for a char-table. */ |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3111 if (char_table_depth > 0) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3112 insert (" ", char_table_depth * 2); /* depth is 1 or 2. */ |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3113 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3114 /* Output the prefix that applies to every entry in this map. */ |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3115 if (!NILP (elt_prefix)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3116 insert1 (elt_prefix); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3117 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3118 /* Insert or describe the character this slot is for, |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3119 or a description of what it is for. */ |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3120 if (SUB_CHAR_TABLE_P (vector)) |
17327
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3121 { |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3122 if (complete_char) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3123 insert_char (character); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3124 else |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3125 { |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3126 /* We need an octal representation for this block of |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3127 characters. */ |
17795
41b7d56b62fb
(describe_vector): Identify charset row numbers clearly.
Richard M. Stallman <rms@gnu.org>
parents:
17788
diff
changeset
|
3128 char work[16]; |
41b7d56b62fb
(describe_vector): Identify charset row numbers clearly.
Richard M. Stallman <rms@gnu.org>
parents:
17788
diff
changeset
|
3129 sprintf (work, "(row %d)", i); |
41b7d56b62fb
(describe_vector): Identify charset row numbers clearly.
Richard M. Stallman <rms@gnu.org>
parents:
17788
diff
changeset
|
3130 insert (work, strlen (work)); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3131 } |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3132 } |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3133 else if (CHAR_TABLE_P (vector)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3134 { |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3135 if (complete_char) |
30559
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
3136 insert1 (Fsingle_key_description (make_number (character), Qnil)); |
17327
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3137 else |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3138 { |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3139 /* Print the information for this character set. */ |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3140 insert_string ("<"); |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3141 tem2 = CHARSET_TABLE_INFO (i - 128, CHARSET_SHORT_NAME_IDX); |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3142 if (STRINGP (tem2)) |
20624
9ac0b485cf60
(describe_vector): Unconditionally handle multibyte chars.
Richard M. Stallman <rms@gnu.org>
parents:
20576
diff
changeset
|
3143 insert_from_string (tem2, 0, 0, XSTRING (tem2)->size, |
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21241
diff
changeset
|
3144 STRING_BYTES (XSTRING (tem2)), 0); |
17327
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3145 else |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3146 insert ("?", 1); |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3147 insert (">", 1); |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3148 } |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3149 } |
13201
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
3150 else |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
3151 { |
30559
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
3152 insert1 (Fsingle_key_description (make_number (character), Qnil)); |
17036 | 3153 } |
3154 | |
17327
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3155 /* If we find a sub char-table within a char-table, |
17036 | 3156 scan it recursively; it defines the details for |
3157 a character set or a portion of a character set. */ | |
20624
9ac0b485cf60
(describe_vector): Unconditionally handle multibyte chars.
Richard M. Stallman <rms@gnu.org>
parents:
20576
diff
changeset
|
3158 if (CHAR_TABLE_P (vector) && SUB_CHAR_TABLE_P (definition)) |
17036 | 3159 { |
3160 insert ("\n", 1); | |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3161 describe_vector (definition, elt_prefix, elt_describer, |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3162 partial, shadow, entire_map, |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3163 indices, char_table_depth + 1); |
17036 | 3164 continue; |
13201
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
3165 } |
250 | 3166 |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3167 starting_i = i; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3168 |
17795
41b7d56b62fb
(describe_vector): Identify charset row numbers clearly.
Richard M. Stallman <rms@gnu.org>
parents:
17788
diff
changeset
|
3169 /* Find all consecutive characters or rows that have the same |
17327
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3170 definition. But, for elements of a top level char table, if |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3171 they are for charsets, we had better describe one by one even |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3172 if they have the same definition. */ |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3173 if (CHAR_TABLE_P (vector)) |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3174 { |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3175 int limit = to; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3176 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3177 if (char_table_depth == 0) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3178 limit = CHAR_TABLE_SINGLE_BYTE_SLOTS; |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3179 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3180 while (i + 1 < limit |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3181 && (tem2 = get_keyelt (XCHAR_TABLE (vector)->contents[i + 1], 0), |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3182 !NILP (tem2)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3183 && !NILP (Fequal (tem2, definition))) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3184 i++; |
17327
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3185 } |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3186 else |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3187 while (i + 1 < to |
32846
c1b3ab2a1ccc
Use AREF, ASET and ASIZE macros.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32844
diff
changeset
|
3188 && (tem2 = get_keyelt (AREF (vector, i + 1), 0), |
17327
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3189 !NILP (tem2)) |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3190 && !NILP (Fequal (tem2, definition))) |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3191 i++; |
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3192 |
250 | 3193 |
3194 /* If we have a range of more than one character, | |
3195 print where the range reaches to. */ | |
3196 | |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3197 if (i != starting_i) |
250 | 3198 { |
3199 insert (" .. ", 4); | |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3200 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3201 if (!NILP (elt_prefix)) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3202 insert1 (elt_prefix); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3203 |
13201
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
3204 if (CHAR_TABLE_P (vector)) |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
3205 { |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3206 if (char_table_depth == 0) |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3207 { |
30559
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
3208 insert1 (Fsingle_key_description (make_number (i), Qnil)); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3209 } |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3210 else if (complete_char) |
13201
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
3211 { |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3212 indices[char_table_depth] = i; |
29013
b9565b4bcdf8
(Fsingle_key_description): Use SPLIT_CHAR instead of
Kenichi Handa <handa@m17n.org>
parents:
26864
diff
changeset
|
3213 character = MAKE_CHAR (indices[0], indices[1], indices[2]); |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3214 insert_char (character); |
17036 | 3215 } |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3216 else |
17036 | 3217 { |
17795
41b7d56b62fb
(describe_vector): Identify charset row numbers clearly.
Richard M. Stallman <rms@gnu.org>
parents:
17788
diff
changeset
|
3218 /* We need an octal representation for this block of |
41b7d56b62fb
(describe_vector): Identify charset row numbers clearly.
Richard M. Stallman <rms@gnu.org>
parents:
17788
diff
changeset
|
3219 characters. */ |
41b7d56b62fb
(describe_vector): Identify charset row numbers clearly.
Richard M. Stallman <rms@gnu.org>
parents:
17788
diff
changeset
|
3220 char work[16]; |
41b7d56b62fb
(describe_vector): Identify charset row numbers clearly.
Richard M. Stallman <rms@gnu.org>
parents:
17788
diff
changeset
|
3221 sprintf (work, "(row %d)", i); |
41b7d56b62fb
(describe_vector): Identify charset row numbers clearly.
Richard M. Stallman <rms@gnu.org>
parents:
17788
diff
changeset
|
3222 insert (work, strlen (work)); |
13201
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
3223 } |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
3224 } |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
3225 else |
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
3226 { |
30559
16a291eedbd8
(Fsingle_key_description): Add parameter NO_ANGLES.
Gerd Moellmann <gerd@gnu.org>
parents:
30134
diff
changeset
|
3227 insert1 (Fsingle_key_description (make_number (i), Qnil)); |
13201
e9007fec678e
(describe_vector): Support nested char-tables.
Richard M. Stallman <rms@gnu.org>
parents:
13145
diff
changeset
|
3228 } |
250 | 3229 } |
3230 | |
3231 /* Print a description of the definition of this character. | |
3232 elt_describer will take care of spacing out far enough | |
3233 for alignment purposes. */ | |
11973
4e0f3e3b4cc7
(describe_vector): New arg entire_map.
Karl Heuer <kwzh@gnu.org>
parents:
11924
diff
changeset
|
3234 (*elt_describer) (definition); |
250 | 3235 } |
3236 | |
17327
0cb065f8702e
(describe_vector): Adjusted for the new structure of Lisp_Char_Table.
Kenichi Handa <handa@m17n.org>
parents:
17264
diff
changeset
|
3237 /* For (sub) char-table, print `defalt' slot at last. */ |
17036 | 3238 if (CHAR_TABLE_P (vector) && !NILP (XCHAR_TABLE (vector)->defalt)) |
3239 { | |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3240 insert (" ", char_table_depth * 2); |
17036 | 3241 insert_string ("<<default>>"); |
3242 (*elt_describer) (XCHAR_TABLE (vector)->defalt); | |
3243 } | |
3244 | |
250 | 3245 UNGCPRO; |
3246 } | |
3247 | |
465 | 3248 /* Apropos - finding all symbols whose names match a regexp. */ |
250 | 3249 Lisp_Object apropos_predicate; |
3250 Lisp_Object apropos_accumulate; | |
3251 | |
3252 static void | |
3253 apropos_accum (symbol, string) | |
3254 Lisp_Object symbol, string; | |
3255 { | |
3256 register Lisp_Object tem; | |
3257 | |
3258 tem = Fstring_match (string, Fsymbol_name (symbol), Qnil); | |
485 | 3259 if (!NILP (tem) && !NILP (apropos_predicate)) |
250 | 3260 tem = call1 (apropos_predicate, symbol); |
485 | 3261 if (!NILP (tem)) |
250 | 3262 apropos_accumulate = Fcons (symbol, apropos_accumulate); |
3263 } | |
3264 | |
3265 DEFUN ("apropos-internal", Fapropos_internal, Sapropos_internal, 1, 2, 0, | |
3266 "Show all symbols whose names contain match for REGEXP.\n\ | |
14080
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
3267 If optional 2nd arg PREDICATE is non-nil, (funcall PREDICATE SYMBOL) is done\n\ |
250 | 3268 for each symbol and a symbol is mentioned only if that returns non-nil.\n\ |
3269 Return list of symbols found.") | |
14080
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
3270 (regexp, predicate) |
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
3271 Lisp_Object regexp, predicate; |
250 | 3272 { |
3273 struct gcpro gcpro1, gcpro2; | |
14099
6215cbb7f702
(Fapropos_internal): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
14080
diff
changeset
|
3274 CHECK_STRING (regexp, 0); |
14080
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
3275 apropos_predicate = predicate; |
250 | 3276 GCPRO2 (apropos_predicate, apropos_accumulate); |
3277 apropos_accumulate = Qnil; | |
14080
439185f0ef37
(Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
Erik Naggum <erik@naggum.no>
parents:
13947
diff
changeset
|
3278 map_obarray (Vobarray, apropos_accum, regexp); |
250 | 3279 apropos_accumulate = Fsort (apropos_accumulate, Qstring_lessp); |
3280 UNGCPRO; | |
3281 return apropos_accumulate; | |
3282 } | |
3283 | |
21514 | 3284 void |
250 | 3285 syms_of_keymap () |
3286 { | |
3287 Qkeymap = intern ("keymap"); | |
3288 staticpro (&Qkeymap); | |
3289 | |
17788
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3290 /* Now we are ready to set up this property, so we can |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3291 create char tables. */ |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3292 Fput (Qkeymap, Qchar_table_extra_slots, make_number (0)); |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3293 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3294 /* Initialize the keymaps standardly used. |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3295 Each one is the value of a Lisp variable, and is also |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3296 pointed to by a C variable */ |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3297 |
208d71ea3a4f
(get_keyelt): Handle an indirect entry with meta char.
Richard M. Stallman <rms@gnu.org>
parents:
17511
diff
changeset
|
3298 global_map = Fmake_keymap (Qnil); |
250 | 3299 Fset (intern ("global-map"), global_map); |
3300 | |
16125
2e0a45264368
(syms_of_keymap): staticpro current_global_map;
Richard M. Stallman <rms@gnu.org>
parents:
15422
diff
changeset
|
3301 current_global_map = global_map; |
16227
6acf08913847
(syms_of_keymap): staticpro global_map.
Erik Naggum <erik@naggum.no>
parents:
16125
diff
changeset
|
3302 staticpro (&global_map); |
16125
2e0a45264368
(syms_of_keymap): staticpro current_global_map;
Richard M. Stallman <rms@gnu.org>
parents:
15422
diff
changeset
|
3303 staticpro (¤t_global_map); |
2e0a45264368
(syms_of_keymap): staticpro current_global_map;
Richard M. Stallman <rms@gnu.org>
parents:
15422
diff
changeset
|
3304 |
1095
6578f07e9eb8
(Fmake_sparse_keymap, Fmake_keymap): New optional arg. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
647
diff
changeset
|
3305 meta_map = Fmake_keymap (Qnil); |
250 | 3306 Fset (intern ("esc-map"), meta_map); |
3307 Ffset (intern ("ESC-prefix"), meta_map); | |
3308 | |
1095
6578f07e9eb8
(Fmake_sparse_keymap, Fmake_keymap): New optional arg. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents:
647
diff
changeset
|
3309 control_x_map = Fmake_keymap (Qnil); |
250 | 3310 Fset (intern ("ctl-x-map"), control_x_map); |
3311 Ffset (intern ("Control-X-prefix"), control_x_map); | |
3312 | |
12297
fe458a8ecfa2
(Vdefine_key_rebound_commands): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
12262
diff
changeset
|
3313 DEFVAR_LISP ("define-key-rebound-commands", &Vdefine_key_rebound_commands, |
fe458a8ecfa2
(Vdefine_key_rebound_commands): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
12262
diff
changeset
|
3314 "List of commands given new key bindings recently.\n\ |
fe458a8ecfa2
(Vdefine_key_rebound_commands): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
12262
diff
changeset
|
3315 This is used for internal purposes during Emacs startup;\n\ |
fe458a8ecfa2
(Vdefine_key_rebound_commands): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
12262
diff
changeset
|
3316 don't alter it yourself."); |
fe458a8ecfa2
(Vdefine_key_rebound_commands): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
12262
diff
changeset
|
3317 Vdefine_key_rebound_commands = Qt; |
fe458a8ecfa2
(Vdefine_key_rebound_commands): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
12262
diff
changeset
|
3318 |
250 | 3319 DEFVAR_LISP ("minibuffer-local-map", &Vminibuffer_local_map, |
3320 "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
|
3321 Vminibuffer_local_map = Fmake_sparse_keymap (Qnil); |
250 | 3322 |
3323 DEFVAR_LISP ("minibuffer-local-ns-map", &Vminibuffer_local_ns_map, | |
3324 "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
|
3325 Vminibuffer_local_ns_map = Fmake_sparse_keymap (Qnil); |
250 | 3326 |
3327 DEFVAR_LISP ("minibuffer-local-completion-map", &Vminibuffer_local_completion_map, | |
3328 "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
|
3329 Vminibuffer_local_completion_map = Fmake_sparse_keymap (Qnil); |
250 | 3330 |
3331 DEFVAR_LISP ("minibuffer-local-must-match-map", &Vminibuffer_local_must_match_map, | |
3332 "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
|
3333 Vminibuffer_local_must_match_map = Fmake_sparse_keymap (Qnil); |
250 | 3334 |
465 | 3335 DEFVAR_LISP ("minor-mode-map-alist", &Vminor_mode_map_alist, |
3336 "Alist of keymaps to use for minor modes.\n\ | |
3337 Each element looks like (VARIABLE . KEYMAP); KEYMAP is used to read\n\ | |
3338 key sequences and look up bindings iff VARIABLE's value is non-nil.\n\ | |
3339 If two active keymaps bind the same key, the keymap appearing earlier\n\ | |
3340 in the list takes precedence."); | |
3341 Vminor_mode_map_alist = Qnil; | |
3342 | |
20517
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
3343 DEFVAR_LISP ("minor-mode-overriding-map-alist", &Vminor_mode_overriding_map_alist, |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
3344 "Alist of keymaps to use for minor modes, in current major mode.\n\ |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
3345 This variable is a alist just like `minor-mode-map-alist', and it is\n\ |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
3346 used the same way (and before `minor-mode-map-alist'); however,\n\ |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
3347 it is provided for major modes to bind locally."); |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
3348 Vminor_mode_overriding_map_alist = Qnil; |
40bfe766d355
(Vminor_mode_overriding_map_alist): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
20381
diff
changeset
|
3349 |
517 | 3350 DEFVAR_LISP ("function-key-map", &Vfunction_key_map, |
3351 "Keymap mapping ASCII function key sequences onto their preferred forms.\n\ | |
3352 This allows Emacs to recognize function keys sent from ASCII\n\ | |
3353 terminals at any point in a key sequence.\n\ | |
3354 \n\ | |
8731
7ebb77d4aff2
(syms_of_keymap): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8517
diff
changeset
|
3355 The `read-key-sequence' function replaces any subsequence bound by\n\ |
7ebb77d4aff2
(syms_of_keymap): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8517
diff
changeset
|
3356 `function-key-map' with its binding. More precisely, when the active\n\ |
517 | 3357 keymaps have no binding for the current key sequence but\n\ |
8731
7ebb77d4aff2
(syms_of_keymap): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8517
diff
changeset
|
3358 `function-key-map' binds a suffix of the sequence to a vector or string,\n\ |
7ebb77d4aff2
(syms_of_keymap): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8517
diff
changeset
|
3359 `read-key-sequence' replaces the matching suffix with its binding, and\n\ |
517 | 3360 continues with the new sequence.\n\ |
3361 \n\ | |
8731
7ebb77d4aff2
(syms_of_keymap): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8517
diff
changeset
|
3362 The events that come from bindings in `function-key-map' are not\n\ |
7ebb77d4aff2
(syms_of_keymap): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8517
diff
changeset
|
3363 themselves looked up in `function-key-map'.\n\ |
7ebb77d4aff2
(syms_of_keymap): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8517
diff
changeset
|
3364 \n\ |
7ebb77d4aff2
(syms_of_keymap): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8517
diff
changeset
|
3365 For example, suppose `function-key-map' binds `ESC O P' to [f1].\n\ |
7ebb77d4aff2
(syms_of_keymap): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8517
diff
changeset
|
3366 Typing `ESC O P' to `read-key-sequence' would return [f1]. Typing\n\ |
4138
42faad1466fa
* keyboard.c (read_key_sequence): Accept both strings and vectors
Jim Blandy <jimb@redhat.com>
parents:
4023
diff
changeset
|
3367 `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
|
3368 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
|
3369 Vfunction_key_map = Fmake_sparse_keymap (Qnil); |
517 | 3370 |
12710
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
3371 DEFVAR_LISP ("key-translation-map", &Vkey_translation_map, |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
3372 "Keymap of key translations that can override keymaps.\n\ |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
3373 This keymap works like `function-key-map', but comes after that,\n\ |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
3374 and applies even for keys that have ordinary bindings."); |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
3375 Vkey_translation_map = Qnil; |
26c09987d2f3
(describe_buffer_bindings): Print bindings from
Richard M. Stallman <rms@gnu.org>
parents:
12542
diff
changeset
|
3376 |
250 | 3377 Qsingle_key_description = intern ("single-key-description"); |
3378 staticpro (&Qsingle_key_description); | |
3379 | |
3380 Qkey_description = intern ("key-description"); | |
3381 staticpro (&Qkey_description); | |
3382 | |
3383 Qkeymapp = intern ("keymapp"); | |
3384 staticpro (&Qkeymapp); | |
3385 | |
2727
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
3386 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
|
3387 staticpro (&Qnon_ascii); |
b8911c8b9700
* keymap.c (Fwhere_is_internal): If FIRSTONLY is non-nil, avoid
Jim Blandy <jimb@redhat.com>
parents:
2652
diff
changeset
|
3388 |
21241
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
3389 Qmenu_item = intern ("menu-item"); |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
3390 staticpro (&Qmenu_item); |
31bd04a792c2
(fix_submap_inheritance, get_keyelt, store_in_keymap,
Richard M. Stallman <rms@gnu.org>
parents:
20883
diff
changeset
|
3391 |
32889
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
3392 where_is_cache_keymaps = Qt; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
3393 where_is_cache = Qnil; |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
3394 staticpro (&where_is_cache); |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
3395 staticpro (&where_is_cache_keymaps); |
673e3ef1f7f6
(where_is_cache, where_is_cache_keymaps): New vars.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32846
diff
changeset
|
3396 |
250 | 3397 defsubr (&Skeymapp); |
15344
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
3398 defsubr (&Skeymap_parent); |
82615c826910
(Fkeymap_parent, Fset_keymap_parent): New functions.
Richard M. Stallman <rms@gnu.org>
parents:
14738
diff
changeset
|
3399 defsubr (&Sset_keymap_parent); |
250 | 3400 defsubr (&Smake_keymap); |
3401 defsubr (&Smake_sparse_keymap); | |
3402 defsubr (&Scopy_keymap); | |
3403 defsubr (&Skey_binding); | |
3404 defsubr (&Slocal_key_binding); | |
3405 defsubr (&Sglobal_key_binding); | |
465 | 3406 defsubr (&Sminor_mode_key_binding); |
250 | 3407 defsubr (&Sdefine_key); |
3408 defsubr (&Slookup_key); | |
3409 defsubr (&Sdefine_prefix_command); | |
3410 defsubr (&Suse_global_map); | |
3411 defsubr (&Suse_local_map); | |
3412 defsubr (&Scurrent_local_map); | |
3413 defsubr (&Scurrent_global_map); | |
465 | 3414 defsubr (&Scurrent_minor_mode_maps); |
250 | 3415 defsubr (&Saccessible_keymaps); |
3416 defsubr (&Skey_description); | |
3417 defsubr (&Sdescribe_vector); | |
3418 defsubr (&Ssingle_key_description); | |
3419 defsubr (&Stext_char_description); | |
3420 defsubr (&Swhere_is_internal); | |
20850
ffbaaba0bf76
(Fdescribe_bindings_internal):
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
3421 defsubr (&Sdescribe_bindings_internal); |
250 | 3422 defsubr (&Sapropos_internal); |
3423 } | |
3424 | |
21514 | 3425 void |
250 | 3426 keys_of_keymap () |
3427 { | |
3428 initial_define_key (global_map, 033, "ESC-prefix"); | |
3429 initial_define_key (global_map, Ctl('X'), "Control-X-prefix"); | |
3430 } |