summaryrefslogtreecommitdiff
path: root/src/keymap.c
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>2001-12-29 14:54:28 +0000
committerRichard M. Stallman <rms@gnu.org>2001-12-29 14:54:28 +0000
commit15fff01d494352c1267473647599389dce7c24c2 (patch)
treefa52c7a50a7c56dc5d60d739c08df38d57bdc87b /src/keymap.c
parent71cf5fa051283be4de2aea9eb078493add766e1e (diff)
downloademacs-15fff01d494352c1267473647599389dce7c24c2.tar.gz
(silly_event_symbol_error): New subrtn, from Fdefine_key.
Handle modifier bits. Correct typo in error message.
Diffstat (limited to 'src/keymap.c')
-rw-r--r--src/keymap.c54
1 files changed, 49 insertions, 5 deletions
diff --git a/src/keymap.c b/src/keymap.c
index ecc17e4a957..a6867db32c0 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -115,6 +115,7 @@ static void describe_translation P_ ((Lisp_Object, Lisp_Object));
static void describe_map P_ ((Lisp_Object, Lisp_Object,
void (*) P_ ((Lisp_Object, Lisp_Object)),
int, Lisp_Object, Lisp_Object*, int));
+static void silly_event_symbol_error P_ ((Lisp_Object));
/* Keymap object support - constructors and predicates. */
@@ -1011,11 +1012,8 @@ the front of KEYMAP. */)
if (CONSP (c) && lucid_event_type_list_p (c))
c = Fevent_convert_list (c);
- if (SYMBOLP (c) && ! NILP (Fassoc (Fsymbol_name (c), exclude_keys)))
- error ("To bind the key %s, use; use \"%s\", not [%s]",
- XSYMBOL (c)->name->data,
- XSTRING (XCDR (Fassoc (Fsymbol_name (c), exclude_keys)))->data,
- XSYMBOL (c)->name->data);
+ if (SYMBOLP (c))
+ silly_event_symbol_error (c);
if (INTEGERP (c)
&& (XINT (c) & meta_bit)
@@ -1156,6 +1154,52 @@ append_key (key_sequence, key)
return Fvconcat (2, args);
}
+/* Given a event type C which is a symbol,
+ signal an error if is a mistake such as RET or M-RET or C-DEL, etc. */
+
+static void
+silly_event_symbol_error (c)
+ Lisp_Object c;
+{
+ Lisp_Object parsed, base, name, assoc;
+ int modifiers;
+
+ parsed = parse_modifiers (c);
+ modifiers = (int) XUINT (XCAR (XCDR (parsed)));
+ base = XCAR (parsed);
+ name = Fsymbol_name (base);
+ /* This alist includes elements such as ("RET" . "\\r"). */
+ assoc = Fassoc (name, exclude_keys);
+
+ if (! NILP (assoc))
+ {
+ char new_mods[sizeof ("\\A-\\C-\\H-\\M-\\S-\\s-")];
+ char *p = new_mods;
+ Lisp_Object keystring;
+ if (modifiers & alt_modifier)
+ { *p++ = '\\'; *p++ = 'A'; *p++ = '-'; }
+ if (modifiers & ctrl_modifier)
+ { *p++ = '\\'; *p++ = 'C'; *p++ = '-'; }
+ if (modifiers & hyper_modifier)
+ { *p++ = '\\'; *p++ = 'H'; *p++ = '-'; }
+ if (modifiers & meta_modifier)
+ { *p++ = '\\'; *p++ = 'M'; *p++ = '-'; }
+ if (modifiers & shift_modifier)
+ { *p++ = '\\'; *p++ = 'S'; *p++ = '-'; }
+ if (modifiers & super_modifier)
+ { *p++ = '\\'; *p++ = 's'; *p++ = '-'; }
+ *p = 0;
+
+ c = reorder_modifiers (c);
+ keystring = concat2 (build_string (new_mods), XCDR (assoc));
+
+ error ((modifiers & ~meta_modifier
+ ? "To bind the key %s, use [?%s], not [%s]"
+ : "To bind the key %s, use \"%s\", not [%s]"),
+ XSYMBOL (c)->name->data, XSTRING (keystring)->data,
+ XSYMBOL (c)->name->data);
+ }
+}
/* Global, local, and minor mode keymap stuff. */