From: Stefan Kangas Date: Fri, 13 Nov 2020 14:28:29 +0000 (+0100) Subject: Don't show key ranges if shadowed by different commands X-Git-Tag: emacs-28.0.90~5073 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=a6490343366f2b2331a91dcb693effb3a9dd78f5;p=emacs.git Don't show key ranges if shadowed by different commands * 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. --- diff --git a/src/keymap.c b/src/keymap.c index 181dcdad3ad..749f4b6b91c 100644 --- a/src/keymap.c +++ b/src/keymap.c @@ -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. */ diff --git a/test/src/keymap-tests.el b/test/src/keymap-tests.el index 610234c5a13..68a8438cb4a 100644 --- a/test/src/keymap-tests.el +++ b/test/src/keymap-tests.el @@ -200,6 +200,33 @@ commit 86c19714b097aa477d339ed99ffb5136c755a046." (where-is-internal 'execute-extended-command global-map t)) [#x8000078]))) + +;;;; 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 +"))))) + + +;;;; apropos-internal + (ert-deftest keymap-apropos-internal () (should (equal (apropos-internal "^next-line$") '(next-line))) (should (>= (length (apropos-internal "^help")) 100))