Commit a6490343 authored by Stefan Kangas's avatar Stefan Kangas

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.
parent 0a8cd011
......@@ -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. */
......
......@@ -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))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment