From ecc913fe599488c1878118de4283fd6134ff50cf Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Fri, 13 Nov 2020 15:28:29 +0100 Subject: [PATCH 1/3] 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. --- src/keymap.c | 22 ++++++++++++++++++---- test/src/keymap-tests.el | 27 +++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/keymap.c b/src/keymap.c index 181dcdad3a..4616f27c25 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 = NULL; 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 e3dd8420d7..b230958b36 100644 --- a/test/src/keymap-tests.el +++ b/test/src/keymap-tests.el @@ -170,6 +170,33 @@ keymap-where-is-internal/preferred-modifier-is-a-string (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)) -- 2.29.2