changeset 42404:ca040d0f5c67

(silly_event_symbol_error): New subrtn, from Fdefine_key. Handle modifier bits. Correct typo in error message.
author Richard M. Stallman <rms@gnu.org>
date Sat, 29 Dec 2001 14:54:18 +0000
parents 6643f205d5db
children 1035c3ac4b16
files src/keymap.c
diffstat 1 files changed, 49 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/keymap.c	Sat Dec 29 12:47:29 2001 +0000
+++ b/src/keymap.c	Sat Dec 29 14:54:18 2001 +0000
@@ -115,6 +115,7 @@
 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 @@
       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 @@
   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.				*/