changeset 60066:eca75f16d020

(describe_map_tree): New arg MENTION_SHADOW. Calls changed. (describe_map, describe_vector): Likewise. When it's 1, don't omit shadowed bindings, instead mark them as shadowed.
author Richard M. Stallman <rms@gnu.org>
date Tue, 15 Feb 2005 06:39:18 +0000
parents 42e18861b7b8
children 77fc0086f304
files src/keymap.c
diffstat 1 files changed, 60 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/src/keymap.c	Tue Feb 15 06:36:17 2005 +0000
+++ b/src/keymap.c	Tue Feb 15 06:39:18 2005 +0000
@@ -120,10 +120,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.			*/
@@ -2834,7 +2835,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.  */
@@ -2847,7 +2848,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
@@ -2868,7 +2869,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);
 	}
 
@@ -2896,7 +2898,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);
 	}
 
@@ -2906,23 +2909,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;
@@ -2943,17 +2946,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;
@@ -3055,7 +3062,7 @@
 
       describe_map (Fcdr (elt), prefix,
 		    transl ? describe_translation : describe_command,
-		    partial, sub_shadows, &seen, nomenu);
+		    partial, sub_shadows, &seen, nomenu, mention_shadow);
 
     skip: ;
     }
@@ -3135,7 +3142,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));
@@ -3143,6 +3151,7 @@
      Lisp_Object shadow;
      Lisp_Object *seen;
      int nomenu;
+     int mention_shadow;
 {
   Lisp_Object tail, definition, event;
   Lisp_Object tem;
@@ -3172,9 +3181,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.
@@ -3203,7 +3213,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);
@@ -3223,6 +3239,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))
 	{
@@ -3261,7 +3284,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);
 }
@@ -3303,7 +3326,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));
@@ -3313,6 +3337,7 @@
      int *indices;
      int char_table_depth;
      int keymap_p;
+     int mention_shadow;
 {
   Lisp_Object definition;
   Lisp_Object tem2;
@@ -3396,6 +3421,7 @@
 
   for (i = from; i < to; i++)
     {
+      int this_shadowed = 0;
       QUIT;
 
       if (CHAR_TABLE_P (vector))
@@ -3455,7 +3481,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
@@ -3531,7 +3563,8 @@
 	  insert ("\n", 1);
 	  describe_vector (definition, prefix, args, elt_describer,
 			   partial, shadow, entire_map,
-			   indices, char_table_depth + 1, keymap_p);
+			   indices, char_table_depth + 1, keymap_p,
+			   mention_shadow);
 	  continue;
 	}
 
@@ -3605,6 +3638,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);
+	}
     }
 
   /* For (sub) char-table, print `defalt' slot at last.  */