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