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