]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't show key ranges if shadowed by different commands
authorStefan Kangas <stefan@marxist.se>
Fri, 13 Nov 2020 14:28:29 +0000 (15:28 +0100)
committerStefan Kangas <stefan@marxist.se>
Sun, 22 Nov 2020 01:45:03 +0000 (02:45 +0100)
* src/keymap.c (describe_vector): Make sure found consecutive keys
are either not shadowed or, if they are, that they are shadowed by
the same command.  (Bug#9293)
* test/src/keymap-tests.el
(help--describe-vector/bug-9293-one-shadowed-in-range): New test.

src/keymap.c
test/src/keymap-tests.el

index 181dcdad3adc623cefbd2712107186190c86479e..749f4b6b91c6b97924756b44dbcee999089169d9 100644 (file)
@@ -3085,6 +3085,7 @@ describe_vector (Lisp_Object vector, Lisp_Object prefix, Lisp_Object args,
   for (i = from; ; i++)
     {
       bool this_shadowed = 0;
+      Lisp_Object shadowed_by = Qnil;
       int range_beg, range_end;
       Lisp_Object val;
 
@@ -3127,11 +3128,9 @@ describe_vector (Lisp_Object vector, Lisp_Object prefix, Lisp_Object args,
       /* If this binding is shadowed by some other map, ignore it.  */
       if (!NILP (shadow))
        {
-         Lisp_Object tem;
-
-         tem = shadow_lookup (shadow, kludge, Qt, 0);
+         shadowed_by = shadow_lookup (shadow, kludge, Qt, 0);
 
-         if (!NILP (tem))
+         if (!NILP (shadowed_by))
            {
              if (mention_shadow)
                this_shadowed = 1;
@@ -3186,6 +3185,21 @@ describe_vector (Lisp_Object vector, Lisp_Object prefix, Lisp_Object args,
               && !NILP (Fequal (tem2, definition)))
          i++;
 
+      /* Make sure found consecutive keys are either not shadowed or,
+        if they are, that they are shadowed by the same command.  */
+      if (CHAR_TABLE_P (vector) && i != starting_i)
+       {
+         Lisp_Object tem;
+         Lisp_Object key = make_nil_vector (1);
+         for (int j = starting_i + 1; j <= i; j++)
+           {
+             ASET (key, 0, make_fixnum (j));
+             tem = shadow_lookup (shadow, key, Qt, 0);
+             if (NILP (Fequal (tem, shadowed_by)))
+               i = j - 1;
+           }
+       }
+
       /* If we have a range of more than one character,
         print where the range reaches to.  */
 
index 610234c5a13631588254a5b2681ed664a4d41339..68a8438cb4a1ff39361b87bd957f4273e6cfd3c8 100644 (file)
@@ -200,6 +200,33 @@ commit 86c19714b097aa477d339ed99ffb5136c755a046."
             (where-is-internal 'execute-extended-command global-map t))
           [#x8000078])))
 
+\f
+;;;; describe_vector
+
+(ert-deftest help--describe-vector/bug-9293-one-shadowed-in-range ()
+  "Check that we only show a range if shadowed by the same command."
+  (let ((orig-map (let ((map (make-keymap)))
+                    (define-key map "e" 'foo)
+                    (define-key map "f" 'foo)
+                    (define-key map "g" 'foo)
+                    (define-key map "h" 'foo)
+                    map))
+        (shadow-map (let ((map (make-keymap)))
+                      (define-key map "f" 'bar)
+                      map)))
+    (with-temp-buffer
+      (help--describe-vector (cadr orig-map) nil #'help--describe-command
+                             t shadow-map orig-map t)
+      (should (equal (buffer-string)
+                     "
+e              foo
+f              foo  (binding currently shadowed)
+g .. h         foo
+")))))
+
+\f
+;;;; apropos-internal
+
 (ert-deftest keymap-apropos-internal ()
   (should (equal (apropos-internal "^next-line$") '(next-line)))
   (should (>= (length (apropos-internal "^help")) 100))