diff src/keymap.c @ 90105:7e3f621f1dd4

Revision: miles@gnu.org--gnu-2005/emacs--unicode--0--patch-15 Merge from emacs--cvs-trunk--0 Patches applied: * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-95 Merge from gnus--rel--5.10 * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-96 Move Gnus images into etc/images * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-97 - miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-105 Update from CVS * miles@gnu.org--gnu-2005/gnus--rel--5.10--patch-14 Merge from emacs--cvs-trunk--0 * miles@gnu.org--gnu-2005/gnus--rel--5.10--patch-15 Update from CVS: lisp/imap.el (imap-log): Doc fix. * miles@gnu.org--gnu-2005/gnus--rel--5.10--patch-16 Merge from emacs--cvs-trunk--0
author Miles Bader <miles@gnu.org>
date Fri, 18 Feb 2005 00:41:50 +0000
parents f8a7a9ba3d08 eca75f16d020
children 146c086df160
line wrap: on
line diff
--- a/src/keymap.c	Mon Feb 14 03:40:07 2005 +0000
+++ b/src/keymap.c	Fri Feb 18 00:41:50 2005 +0000
@@ -121,10 +121,11 @@
 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));
+			      int, Lisp_Object, Lisp_Object*, int, int));
 static void describe_vector P_ ((Lisp_Object, Lisp_Object, Lisp_Object,
 				 void (*) (Lisp_Object, Lisp_Object), int,
-				 Lisp_Object, Lisp_Object, int *, int, int));
+				 Lisp_Object, Lisp_Object, int *,
+				 int, int, int));
 static void silly_event_symbol_error P_ ((Lisp_Object));
 
 /* Keymap object support - constructors and predicates.			*/
@@ -2853,7 +2854,7 @@
 
   if (!NILP (Vkey_translation_map))
     describe_map_tree (Vkey_translation_map, 0, Qnil, prefix,
-		       "Key translations", nomenu, 1, 0);
+		       "Key translations", nomenu, 1, 0, 0);
 
 
   /* Print the (major mode) local map.  */
@@ -2866,7 +2867,7 @@
   if (!NILP (start1))
     {
       describe_map_tree (start1, 1, shadow, prefix,
-			 "\f\nOverriding Bindings", nomenu, 0, 0);
+			 "\f\nOverriding Bindings", nomenu, 0, 0, 0);
       shadow = Fcons (start1, shadow);
     }
   else
@@ -2887,7 +2888,8 @@
       if (!NILP (start1))
 	{
 	  describe_map_tree (start1, 1, shadow, prefix,
-			     "\f\n`keymap' Property Bindings", nomenu, 0, 0);
+			     "\f\n`keymap' Property Bindings", nomenu,
+			     0, 0, 0);
 	  shadow = Fcons (start1, shadow);
 	}
 
@@ -2915,7 +2917,8 @@
 	  p += sizeof (" Minor Mode Bindings") - 1;
 	  *p = 0;
 
-	  describe_map_tree (maps[i], 1, shadow, prefix, title, nomenu, 0, 0);
+	  describe_map_tree (maps[i], 1, shadow, prefix,
+			     title, nomenu, 0, 0, 0);
 	  shadow = Fcons (maps[i], shadow);
 	}
 
@@ -2925,23 +2928,23 @@
 	{
 	  if (EQ (start1, XBUFFER (buffer)->keymap))
 	    describe_map_tree (start1, 1, shadow, prefix,
-			       "\f\nMajor Mode Bindings", nomenu, 0, 0);
+			       "\f\nMajor Mode Bindings", nomenu, 0, 0, 0);
 	  else
 	    describe_map_tree (start1, 1, shadow, prefix,
 			       "\f\n`local-map' Property Bindings",
-			       nomenu, 0, 0);
+			       nomenu, 0, 0, 0);
 
 	  shadow = Fcons (start1, shadow);
 	}
     }
 
   describe_map_tree (current_global_map, 1, shadow, prefix,
-		     "\f\nGlobal Bindings", nomenu, 0, 1);
+		     "\f\nGlobal Bindings", nomenu, 0, 1, 0);
 
   /* Print the function-key-map translations under this prefix.  */
   if (!NILP (Vfunction_key_map))
     describe_map_tree (Vfunction_key_map, 0, Qnil, prefix,
-		       "\f\nFunction key map translations", nomenu, 1, 0);
+		       "\f\nFunction key map translations", nomenu, 1, 0, 0);
 
   UNGCPRO;
   return Qnil;
@@ -2962,17 +2965,21 @@
    so print strings and vectors differently.
 
    If ALWAYS_TITLE is nonzero, print the title even if there are no maps
-   to look through.  */
+   to look through.
+
+   If MENTION_SHADOW is nonzero, then when something is shadowed by SHADOW,
+   don't omit it; instead, mention it but say it is shadowed.  */
 
 void
 describe_map_tree (startmap, partial, shadow, prefix, title, nomenu, transl,
-		   always_title)
+		   always_title, mention_shadow)
      Lisp_Object startmap, shadow, prefix;
      int partial;
      char *title;
      int nomenu;
      int transl;
      int always_title;
+     int mention_shadow;
 {
   Lisp_Object maps, orig_maps, seen, sub_shadows;
   struct gcpro gcpro1, gcpro2, gcpro3;
@@ -3074,7 +3081,7 @@
 
       describe_map (Fcdr (elt), prefix,
 		    transl ? describe_translation : describe_command,
-		    partial, sub_shadows, &seen, nomenu);
+		    partial, sub_shadows, &seen, nomenu, mention_shadow);
 
     skip: ;
     }
@@ -3154,7 +3161,8 @@
    PARTIAL, SHADOW, NOMENU are as in `describe_map_tree' above.  */
 
 static void
-describe_map (map, prefix, elt_describer, partial, shadow, seen, nomenu)
+describe_map (map, prefix, elt_describer, partial, shadow,
+	      seen, nomenu, mention_shadow)
      register Lisp_Object map;
      Lisp_Object prefix;
      void (*elt_describer) P_ ((Lisp_Object, Lisp_Object));
@@ -3162,6 +3170,7 @@
      Lisp_Object shadow;
      Lisp_Object *seen;
      int nomenu;
+     int mention_shadow;
 {
   Lisp_Object tail, definition, event;
   Lisp_Object tem;
@@ -3191,9 +3200,10 @@
 	  || CHAR_TABLE_P (XCAR (tail)))
 	describe_vector (XCAR (tail),
 			 prefix, Qnil, elt_describer, partial, shadow, map,
-			 (int *)0, 0, 1);
+			 (int *)0, 0, 1, mention_shadow);
       else if (CONSP (XCAR (tail)))
 	{
+	  int this_shadowed = 0;
 	  event = XCAR (XCAR (tail));
 
 	  /* Ignore bindings whose "prefix" are not really valid events.
@@ -3222,7 +3232,13 @@
 	  if (!NILP (shadow))
 	    {
 	      tem = shadow_lookup (shadow, kludge, Qt);
-	      if (!NILP (tem)) continue;
+	      if (!NILP (tem))
+		{
+		  if (mention_shadow)
+		    this_shadowed = 1;
+		  else
+		    continue;
+		}
 	    }
 
 	  tem = Flookup_key (map, kludge, Qt);
@@ -3242,6 +3258,13 @@
 	     elt_describer will take care of spacing out far enough
 	     for alignment purposes.  */
 	  (*elt_describer) (definition, Qnil);
+
+	  if (this_shadowed)
+	    {
+	      SET_PT (PT - 1);
+	      insert_string ("  (binding currently shadowed)");
+	      SET_PT (PT + 1);
+	    }
 	}
       else if (EQ (XCAR (tail), Qkeymap))
 	{
@@ -3280,7 +3303,7 @@
   specbind (Qstandard_output, Fcurrent_buffer ());
   CHECK_VECTOR_OR_CHAR_TABLE (vector);
   describe_vector (vector, Qnil, describer, describe_vector_princ, 0,
-		   Qnil, Qnil, (int *)0, 0, 0);
+		   Qnil, Qnil, (int *)0, 0, 0, 0);
 
   return unbind_to (count, Qnil);
 }
@@ -3323,7 +3346,8 @@
 static void
 describe_vector (vector, prefix, args, elt_describer,
 		 partial, shadow, entire_map,
-		 indices, char_table_depth, keymap_p)
+		 indices, char_table_depth, keymap_p,
+		 mention_shadow)
      register Lisp_Object vector;
      Lisp_Object prefix, args;
      void (*elt_describer) P_ ((Lisp_Object, Lisp_Object));
@@ -3333,6 +3357,7 @@
      int *indices;
      int char_table_depth;
      int keymap_p;
+     int mention_shadow;
 {
   Lisp_Object definition;
   Lisp_Object tem2;
@@ -3377,6 +3402,7 @@
 
   for (i = from; i < to; i++)
     {
+      int this_shadowed = 0;
       int range_beg, range_end;
       Lisp_Object val;
 
@@ -3412,7 +3438,13 @@
 
 	  tem = shadow_lookup (shadow, kludge, Qt);
 
-	  if (!NILP (tem)) continue;
+	  if (!NILP (tem))
+	    {
+	      if (mention_shadow)
+		this_shadowed = 1;
+	      else
+		continue;
+	    }
 	}
 
       /* Ignore this definition if it is shadowed by an earlier
@@ -3477,6 +3509,13 @@
 	 elt_describer will take care of spacing out far enough
 	 for alignment purposes.  */
       (*elt_describer) (definition, args);
+
+      if (this_shadowed)
+	{
+	  SET_PT (PT - 1);
+	  insert_string ("  (binding currently shadowed)");
+	  SET_PT (PT + 1);
+	}
     }
 
   if (CHAR_TABLE_P (vector) && ! NILP (XCHAR_TABLE (vector)->defalt))