From 15fff01d494352c1267473647599389dce7c24c2 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Sat, 29 Dec 2001 14:54:28 +0000 Subject: [PATCH] (silly_event_symbol_error): New subrtn, from Fdefine_key. Handle modifier bits. Correct typo in error message. --- src/ChangeLog | 5 +++++ src/keymap.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 116d8ec26e4..02e47483009 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2001-12-29 Richard M. Stallman + + * keymap.c (silly_event_symbol_error): New subrtn, from Fdefine_key. + Handle modifier bits. Correct typo in error message. + 2001-12-28 Richard M. Stallman * abbrev.c: Use the plist of an abbrev for multiple params if nec. 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. */ -- 2.39.2