Mercurial > emacs
diff src/keymap.c @ 104888:b3fb8c98c899
(where_is_internal): Filter out shadowed remappings.
Assume that where_is_internal returns unshadowed bindings to simplify
the code and get rid of the gotos. Use ASIZE.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Wed, 09 Sep 2009 02:38:50 +0000 |
parents | c78d442e47ad |
children | cd8d62c35d57 |
line wrap: on
line diff
--- a/src/keymap.c Wed Sep 09 02:38:06 2009 +0000 +++ b/src/keymap.c Wed Sep 09 02:38:50 2009 +0000 @@ -2758,30 +2758,6 @@ sequence = XCAR (sequences); sequences = XCDR (sequences); - /* If the current sequence is a command remapping with - format [remap COMMAND], find the key sequences - which run COMMAND, and use those sequences instead. */ - remapped = Qnil; - if (NILP (no_remap) - && VECTORP (sequence) && XVECTOR (sequence)->size == 2 - && EQ (AREF (sequence, 0), Qremap) - && (function = AREF (sequence, 1), SYMBOLP (function))) - { - Lisp_Object remapped1; - - remapped1 = where_is_internal (function, keymaps, firstonly, noindirect, Qt); - if (CONSP (remapped1)) - { - /* Verify that this key binding actually maps to the - remapped command (see below). */ - if (!EQ (shadow_lookup (keymaps, XCAR (remapped1), Qnil), function)) - continue; - sequence = XCAR (remapped1); - remapped = XCDR (remapped1); - goto record_sequence; - } - } - /* Verify that this key binding is not shadowed by another binding for the same key, before we say it exists. @@ -2794,39 +2770,49 @@ if (!EQ (shadow_lookup (keymaps, sequence, Qnil), definition)) continue; - record_sequence: - /* Don't annoy user with strings from a menu such as - Select Paste. Change them all to "(any string)", - so that there seems to be only one menu item - to report. */ - if (! NILP (sequence)) + /* If the current sequence is a command remapping with + format [remap COMMAND], find the key sequences + which run COMMAND, and use those sequences instead. */ + if (NILP (no_remap) + && VECTORP (sequence) && XVECTOR (sequence)->size == 2 + && EQ (AREF (sequence, 0), Qremap) + && (function = AREF (sequence, 1), SYMBOLP (function))) + remapped = where_is_internal (function, keymaps, firstonly, + noindirect, Qt); + else + remapped = Fcons (sequence, Qnil); + + for (; CONSP (remapped); + sequence = XCAR (remapped), remapped = XCDR (remapped)) { - Lisp_Object tem; - tem = Faref (sequence, make_number (XVECTOR (sequence)->size - 1)); - if (STRINGP (tem)) - Faset (sequence, make_number (XVECTOR (sequence)->size - 1), - build_string ("(any string)")); - } - - /* It is a true unshadowed match. Record it, unless it's already - been seen (as could happen when inheriting keymaps). */ - if (NILP (Fmember (sequence, found))) - found = Fcons (sequence, found); - - /* If firstonly is Qnon_ascii, then we can return the first - binding we find. If firstonly is not Qnon_ascii but not - nil, then we should return the first ascii-only binding - we find. */ - if (EQ (firstonly, Qnon_ascii)) - RETURN_UNGCPRO (sequence); - else if (!NILP (firstonly) && 2 == preferred_sequence_p (sequence)) - RETURN_UNGCPRO (sequence); - - if (CONSP (remapped)) - { - sequence = XCAR (remapped); - remapped = XCDR (remapped); - goto record_sequence; + /* Don't annoy user with strings from a menu such as the + entries from the "Edit => Paste from Kill Menu". + Change them all to "(any string)", so that there + seems to be only one menu item to report. */ + if (! NILP (sequence)) + { + Lisp_Object tem; + tem = Faref (sequence, make_number (ASIZE (sequence) - 1)); + if (STRINGP (tem)) + Faset (sequence, make_number (ASIZE (sequence) - 1), + build_string ("(any string)")); + } + + /* It is a true unshadowed match. Record it, unless it's already + been seen (as could happen when inheriting keymaps). */ + if (NILP (Fmember (sequence, found))) + found = Fcons (sequence, found); + + /* If firstonly is Qnon_ascii, then we can return the first + binding we find. If firstonly is not Qnon_ascii but not + nil, then we should return the first ascii-only binding + we find. */ + if (EQ (firstonly, Qnon_ascii)) + RETURN_UNGCPRO (sequence); + else if (!NILP (firstonly) + && 2 == preferred_sequence_p (sequence)) + RETURN_UNGCPRO (sequence); + } } }