Subject: 28.0.50; Info-next-reference skips next reference
From: Stephen Berman <[email-masked]>
To: [email-masked]
Date: Sat, 28 Nov 2020 20:21:50 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

0. emacs -Q
1. C-h r (if emacs is installed, otherwise `C-u h i /path/to/emacs.info
   RET')
2. Repeat `C-n' until the cursor is on the '*' before the first menu
   item 'Distrib'.
3. Type TAB
=> The cursor jumps over 'Distrib' and goes to the second menu item
   'Intro'.

The same thing happens if the cursor is on the space between '*' and
'Distrib' and you then press TAB.  In both cases, I expected the cursor
to go to the immediately following link instead of skipping it.  This
behavior annoys me every time I run into it, but I haven't debugged it
till now.  The attached patch fixes it.  (The code responsible for the
current behavior in Info-next-reference has not changed since the
command was added to Emacs, but I hope you'll nevertheless agree it's a
bug.)

In GNU Emacs 28.0.50 (build 42, x86_64-pc-linux-gnu, GTK+ Version 3.24.17, cairo version 1.17.3)
 of 2020-11-21 built on strobe-jhalfs
Repository revision: 0a8cd0116204354e95fbb4ebde64c58123502aa2
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 11.0.12008000
System Description: Linux From Scratch SVN-20200401

Configured using:
 'configure --with-xwidgets 'CFLAGS=-Og -g3'
 PKG_CONFIG_PATH=/opt/qt5/lib/pkgconfig'

Configured features:
XPM JPEG TIFF GIF PNG RSVG CAIRO SOUND DBUS GSETTINGS GLIB NOTIFY
INOTIFY ACL GNUTLS LIBXML2 FREETYPE HARFBUZZ ZLIB TOOLKIT_SCROLL_BARS
GTK3 X11 XDBE XIM MODULES THREADS XWIDGETS LIBSYSTEMD PDUMPER LCMS2

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

diff --git a/lisp/info.el b/lisp/info.el
index c3684deb96..5c383836c8 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -3148,6 +3148,12 @@ Info-next-reference
 	    (old-pt (point))
 	    (case-fold-search t))
 	(or (eobp) (forward-char 1))
+        ;; Don't jump over the cross-reference or menu item when the
+        ;; cursor is on the '*' or space in front of it.
+	(unless (looking-at " Menu:")
+	  (let ((lbp (line-beginning-position)))
+	    (when (looking-back "^\\* ?" lbp)
+	      (backward-char (if (looking-back "^\\* " lbp) 2 1)))))
 	(or (Info-next-reference-or-link pat 'link)
 	    (progn
 	      (goto-char (point-min))