emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/info.el [lexbind]


From: Miles Bader
Subject: [Emacs-diffs] Changes to emacs/lisp/info.el [lexbind]
Date: Tue, 14 Oct 2003 19:52:04 -0400

Index: emacs/lisp/info.el
diff -c emacs/lisp/info.el:1.304.2.1 emacs/lisp/info.el:1.304.2.2
*** emacs/lisp/info.el:1.304.2.1        Fri Apr  4 01:20:08 2003
--- emacs/lisp/info.el  Tue Oct 14 19:51:09 2003
***************
*** 107,113 ****
    "List of directories to search for Info documentation files.
  If nil, meaning not yet initialized, Info uses the environment
  variable INFOPATH to initialize it, or `Info-default-directory-list'
! if there is no INFOPATH variable in the environment.
  
  When `Info-directory-list' is initialized from the value of
  `Info-default-directory-list', and Emacs is installed in one of the
--- 107,114 ----
    "List of directories to search for Info documentation files.
  If nil, meaning not yet initialized, Info uses the environment
  variable INFOPATH to initialize it, or `Info-default-directory-list'
! if there is no INFOPATH variable in the environment, or the
! concatenation of the two if INFOPATH ends with a colon.
  
  When `Info-directory-list' is initialized from the value of
  `Info-default-directory-list', and Emacs is installed in one of the
***************
*** 138,144 ****
    :type '(repeat directory)
    :group 'info)
  
! (defcustom Info-scroll-prefer-subnodes t
    "*If non-nil, \\<Info-mode-map>\\[Info-scroll-up] in a menu visits subnodes.
  If this is non-nil, and you scroll far enough in a node that its menu
  appears on the screen, the next \\<Info-mode-map>\\[Info-scroll-up]
--- 139,145 ----
    :type '(repeat directory)
    :group 'info)
  
! (defcustom Info-scroll-prefer-subnodes nil
    "*If non-nil, \\<Info-mode-map>\\[Info-scroll-up] in a menu visits subnodes.
  If this is non-nil, and you scroll far enough in a node that its menu
  appears on the screen, the next \\<Info-mode-map>\\[Info-scroll-up]
***************
*** 148,153 ****
--- 149,155 ----
  Setting this option to nil results in behavior similar to the stand-alone
  Info reader program, which visits the first subnode from the menu only
  when you hit the end of the current node."
+   :version "21.4"
    :type 'boolean
    :group 'info)
  
***************
*** 161,167 ****
                 (other :tag "Replace only tag" tag))
    :group 'info)
  
! (defcustom Info-mode-hook '(turn-on-font-lock)
    "Hooks run when `info-mode' is called."
    :type 'hook
    :group 'info)
--- 163,180 ----
                 (other :tag "Replace only tag" tag))
    :group 'info)
  
! (defcustom Info-refill-paragraphs nil
!   "*If non-nil, attempt to refill paragraphs with hidden references.
! This refilling may accidentally remove explicit line breaks in the info
! file, so be prepared for a few surprises if you enable this feature."
!   :version "21.4"
!   :type 'boolean
!   :group 'info)
! 
! (defcustom Info-mode-hook
!   ;; Try to obey obsolete Info-fontify settings.
!   (unless (and (boundp 'Info-fontify) (null Info-fontify))
!     '(turn-on-font-lock))
    "Hooks run when `info-mode' is called."
    :type 'hook
    :group 'info)
***************
*** 336,386 ****
                   (car decoder) t t nil (cdr decoder))))
        (insert-file-contents fullname visit))))
  
  (defun info-initialize ()
    "Initialize `Info-directory-list', if that hasn't been done yet."
    (unless Info-directory-list
!     (let ((path (getenv "INFOPATH"))
!         (source (expand-file-name "info/" source-directory))
!         (sibling (if installation-directory
!                      (expand-file-name "info/" installation-directory)
!                    (if invocation-directory
!                        (let ((infodir (expand-file-name
!                                        "../info/"
!                                        invocation-directory)))
!                          (if (file-exists-p infodir)
!                              infodir
!                            (setq infodir (expand-file-name
!                                           "../../../info/"
!                                           invocation-directory))
!                            (and (file-exists-p infodir)
!                                 infodir))))))
!         alternative)
        (setq Info-directory-list
            (prune-directory-list
             (if path
!                (split-string path (regexp-quote path-separator))
!              (if (and sibling (file-exists-p sibling))
!                  ;; Uninstalled, Emacs builddir != srcdir.
!                  (setq alternative sibling)
!                ;; Uninstalled, builddir == srcdir
!                (setq alternative source))
!              (if (or (member alternative Info-default-directory-list)
!                      ;; On DOS/NT, we use movable executables always,
!                      ;; and we must always find the Info dir at run time.
!                      (if (memq system-type '(ms-dos windows-nt))
!                          nil
!                        ;; Use invocation-directory for Info
!                        ;; only if we used it for exec-directory also.
!                        (not (string= exec-directory
!                                      (expand-file-name "lib-src/"
!                                                        
installation-directory))))
!                      (not (file-exists-p alternative)))
!                  Info-default-directory-list
!                ;; `alternative' contains the Info files that came with this
!                ;; version, so we should look there first.  `Info-insert-dir'
!                ;; currently expects to find `alternative' first on the list.
!                (cons alternative
!                      (reverse (cdr (reverse 
Info-default-directory-list)))))))))))
  
  ;;;###autoload
  (defun info-other-window (&optional file)
--- 349,407 ----
                   (car decoder) t t nil (cdr decoder))))
        (insert-file-contents fullname visit))))
  
+ (defun Info-default-dirs ()
+   (let ((source (expand-file-name "info/" source-directory))
+       (sibling (if installation-directory
+                    (expand-file-name "info/" installation-directory)
+                  (if invocation-directory
+                      (let ((infodir (expand-file-name
+                                      "../info/"
+                                      invocation-directory)))
+                        (if (file-exists-p infodir)
+                            infodir
+                          (setq infodir (expand-file-name
+                                         "../../../info/"
+                                         invocation-directory))
+                          (and (file-exists-p infodir)
+                               infodir))))))
+       alternative)
+     (setq alternative
+         (if (and sibling (file-exists-p sibling))
+             ;; Uninstalled, Emacs builddir != srcdir.
+             sibling
+           ;; Uninstalled, builddir == srcdir
+           source))
+     (if (or (member alternative Info-default-directory-list)
+           ;; On DOS/NT, we use movable executables always,
+           ;; and we must always find the Info dir at run time.
+           (if (memq system-type '(ms-dos windows-nt))
+               nil
+             ;; Use invocation-directory for Info
+             ;; only if we used it for exec-directory also.
+             (not (string= exec-directory
+                           (expand-file-name "lib-src/"
+                                             installation-directory))))
+           (not (file-exists-p alternative)))
+       Info-default-directory-list
+       ;; `alternative' contains the Info files that came with this
+       ;; version, so we should look there first.  `Info-insert-dir'
+       ;; currently expects to find `alternative' first on the list.
+       (cons alternative
+           (reverse (cdr (reverse Info-default-directory-list)))))))
+ 
  (defun info-initialize ()
    "Initialize `Info-directory-list', if that hasn't been done yet."
    (unless Info-directory-list
!     (let ((path (getenv "INFOPATH")))
        (setq Info-directory-list
            (prune-directory-list
             (if path
!                (if (string-match ":\\'" path)
!                    (append (split-string (substring path 0 -1)
!                                          (regexp-quote path-separator))
!                            (Info-default-dirs))
!                  (split-string path (regexp-quote path-separator)))
!              (Info-default-dirs)))))))
  
  ;;;###autoload
  (defun info-other-window (&optional file)
***************
*** 587,594 ****
  FOUND-ANCHOR is non-nil if a `Ref:' was matched, POS is the position
  where the match was found, and MODE is `major-mode' of the buffer in
  which the match was found."
!   (let ((case-fold-search case-fold)
!       found-mode guesspos found-anchor)
      (save-excursion
        (set-buffer (marker-buffer marker))
        (goto-char marker)
--- 608,614 ----
  FOUND-ANCHOR is non-nil if a `Ref:' was matched, POS is the position
  where the match was found, and MODE is `major-mode' of the buffer in
  which the match was found."
!   (let ((case-fold-search case-fold))
      (save-excursion
        (set-buffer (marker-buffer marker))
        (goto-char marker)
***************
*** 725,732 ****
                                (if (stringp nodename)
                                    (regexp-quote nodename)
                                  "")
!                               "\\) *[,\t\n\177]"))
!               (nodepos nil))
  
            (catch 'foo
  
--- 745,751 ----
                                (if (stringp nodename)
                                    (regexp-quote nodename)
                                  "")
!                               "\\) *[,\t\n\177]")))
  
            (catch 'foo
  
***************
*** 892,898 ****
                    nodename end)
                (re-search-backward "^\^_")
                (search-forward "Node: ")
!               (setq nodename (Info-following-node-name))
                (search-forward "\n\^_" nil 'move)
                (beginning-of-line)
                (setq end (point))
--- 911,919 ----
                    nodename end)
                (re-search-backward "^\^_")
                (search-forward "Node: ")
!               (setq nodename
!                     (and (looking-at (Info-following-node-name-re))
!                          (match-string 1)))
                (search-forward "\n\^_" nil 'move)
                (beginning-of-line)
                (setq end (point))
***************
*** 1064,1076 ****
      (if (numberp nodepos)
        (+ (- nodepos lastfilepos) (point)))))
  
! (defvar Info-header-line nil
!   "If the info node header is hidden, the text of the header.")
! (put 'Info-header-line 'risky-local-variable t)
  
  (defun Info-select-node ()
! "Select the info node that point is in.
! Bind this in case the user sets it to nil."
    (let ((case-fold-search t))
      (save-excursion
        ;; Find beginning of node.
--- 1085,1148 ----
      (if (numberp nodepos)
        (+ (- nodepos lastfilepos) (point)))))
  
! (defun Info-unescape-quotes (value)
!   "Unescape double quotes and backslashes in VALUE"
!   (let ((start 0)
!       (unquote value))
!     (while (string-match "[^\\\"]*\\(\\\\\\)[\\\\\"]" unquote start)
!       (setq unquote (replace-match "" t t unquote 1))
!       (setq start (- (match-end 0) 1)))
!     unquote))
! 
! ;; As of Texinfo 4.6, makeinfo writes constructs like
! ;;   \0\h[image param=value ...\h\0]
! ;; into the Info file for handling images.
! (defun Info-split-parameter-string (parameter-string)
!   "Return alist of (\"KEY\" . \"VALUE\") from PARAMETER-STRING; a
!    whitespace separated list of KEY=VALUE pairs.  If VALUE
!    contains whitespace or double quotes, it must be quoted in
!    double quotes and any double quotes or backslashes must be
!    escaped (\\\",\\\\)."
!   (let ((start 0)
!       (parameter-alist))
!     (while (string-match
!           "\\s *\\([^=]+\\)=\\(?:\\([^\\s 
\"]+\\)\\|\\(?:\"\\(\\(?:[^\\\"]\\|\\\\[\\\\\"]\\)*\\)\"\\)\\)"
!           parameter-string start)
!       (setq start (match-end 0))
!       (push (cons (match-string 1 parameter-string)
!                 (or (match-string 2 parameter-string)
!                     (Info-unescape-quotes
!                      (match-string 3 parameter-string))))
!           parameter-alist))
!     parameter-alist))
! 
! (defun Info-display-images-node ()
!   "Display images in current node."
!   (save-excursion
!     (let ((inhibit-read-only t)
!         (case-fold-search t))
!       (goto-char (point-min))
!       (while (re-search-forward
!             "\\(\0\b[[]image\\(\\(?:[^\b]\\|[^\0]+\b\\)*\\)\0\b[]]\\)"
!             nil t)
!       (let* ((start (match-beginning 1))
!              (parameter-alist (Info-split-parameter-string (match-string 2)))
!              (src (cdr (assoc-string "src" parameter-alist)))
!              (image-file (if src (if (file-name-absolute-p src) src
!                                    (concat default-directory src))
!                            ""))
!              (image (if (file-exists-p image-file)
!                         (create-image image-file)
!                       "[broken image]")))
!         (message "Found image: %S" image-file)
!         (if (not (get-text-property start 'display))
!             (add-text-properties
!              start (point) `(display ,image rear-nonsticky (display)))))))
!     (set-buffer-modified-p nil)))
  
  (defun Info-select-node ()
!   "Select the info node that point is in."
!   ;; Bind this in case the user sets it to nil.
    (let ((case-fold-search t))
      (save-excursion
        ;; Find beginning of node.
***************
*** 1103,1109 ****
                            (point-max)))
        (if Info-enable-active-nodes (eval active-expression))
        (Info-fontify-node)
!       (setq Info-header-line (get-text-property (point-min) 'header-line))
        (run-hooks 'Info-selection-hook)))))
  
  (defun Info-set-mode-line ()
--- 1175,1181 ----
                            (point-max)))
        (if Info-enable-active-nodes (eval active-expression))
        (Info-fontify-node)
!       (Info-display-images-node)
        (run-hooks 'Info-selection-hook)))))
  
  (defun Info-set-mode-line ()
***************
*** 1140,1147 ****
                  nodename)
      (setq filename (if (= (match-beginning 1) (match-end 1))
                       ""
!                    (substring nodename (match-beginning 2) (match-end 2)))
!         nodename (substring nodename (match-beginning 3) (match-end 3)))
      (let ((trim (string-match "\\s *\\'" filename)))
        (if trim (setq filename (substring filename 0 trim))))
      (let ((trim (string-match "\\s *\\'" nodename)))
--- 1212,1219 ----
                  nodename)
      (setq filename (if (= (match-beginning 1) (match-end 1))
                       ""
!                    (match-string 2 nodename))
!         nodename (match-string 3 nodename))
      (let ((trim (string-match "\\s *\\'" filename)))
        (if trim (setq filename (substring filename 0 trim))))
      (let ((trim (string-match "\\s *\\'" nodename)))
***************
*** 1256,1262 ****
    (when (equal regexp "")
      (setq regexp (car Info-search-history)))
    (when regexp
!     (let ((found ()) current
          (onode Info-current-node)
          (ofile Info-current-file)
          (opoint (point))
--- 1328,1334 ----
    (when (equal regexp "")
      (setq regexp (car Info-search-history)))
    (when regexp
!     (let (found beg-found give-up
          (onode Info-current-node)
          (ofile Info-current-file)
          (opoint (point))
***************
*** 1265,1317 ****
        (save-excursion
        (save-restriction
          (widen)
          (if (null Info-current-subfile)
!             (progn (re-search-forward regexp) (setq found (point)))
!           (condition-case err
!               (progn (re-search-forward regexp) (setq found (point)))
!             (search-failed nil)))))
!       (if (not found)                 ;can only happen in subfile case -- 
else would have erred
!         (unwind-protect
!             (let ((list ()))
!               (save-excursion
!                 (set-buffer (marker-buffer Info-tag-table-marker))
                  (goto-char (point-min))
!                 (search-forward "\n\^_\nIndirect:")
!                 (save-restriction
!                   (narrow-to-region (point)
!                                     (progn (search-forward "\n\^_")
!                                            (1- (point))))
!                   (goto-char (point-min))
!                   ;; Find the subfile we just searched.
!                   (search-forward (concat "\n" osubfile ": "))
!                   ;; Skip that one.
!                   (forward-line 1)
!                   ;; Make a list of all following subfiles.
!                   ;; Each elt has the form (VIRT-POSITION . SUBFILENAME).
!                   (while (not (eobp))
!                     (re-search-forward "\\(^.*\\): [0-9]+$")
!                     (goto-char (+ (match-end 1) 2))
!                     (setq list (cons (cons (+ (point-min)
!                                               (read (current-buffer)))
!                                            (match-string-no-properties 1))
!                                      list))
!                     (goto-char (1+ (match-end 0))))
!                   ;; Put in forward order
!                   (setq list (nreverse list))))
!               (while list
!                 (message "Searching subfile %s..." (cdr (car list)))
!                 (Info-read-subfile (car (car list)))
!                 (setq list (cdr list))
                  (if (re-search-forward regexp nil t)
!                     (setq found (point) list ())))
                (if found
!                   (message "")
!                 (signal 'search-failed (list regexp))))
!           (if (not found)
!               (progn (Info-read-subfile osubfile)
!                      (goto-char opoint)
!                      (Info-select-node)
!                      (set-window-start (selected-window) ostart)))))
        (widen)
        (goto-char found)
        (Info-select-node)
--- 1337,1406 ----
        (save-excursion
        (save-restriction
          (widen)
+         (while (and (not give-up)
+                     (or (null found)
+                         (isearch-range-invisible beg-found found)))
+           (if (re-search-forward regexp nil t)
+               (setq found (point) beg-found (match-beginning 0))
+             (setq give-up t)))))
+       ;; If no subfiles, give error now.
+       (if give-up
          (if (null Info-current-subfile)
!             (re-search-forward regexp)
!           (setq found nil)))
! 
!       (unless found
!       (unwind-protect
!           ;; Try other subfiles.
!           (let ((list ()))
!             (save-excursion
!               (set-buffer (marker-buffer Info-tag-table-marker))
!               (goto-char (point-min))
!               (search-forward "\n\^_\nIndirect:")
!               (save-restriction
!                 (narrow-to-region (point)
!                                   (progn (search-forward "\n\^_")
!                                          (1- (point))))
                  (goto-char (point-min))
!                 ;; Find the subfile we just searched.
!                 (search-forward (concat "\n" osubfile ": "))
!                 ;; Skip that one.
!                 (forward-line 1)
!                 ;; Make a list of all following subfiles.
!                 ;; Each elt has the form (VIRT-POSITION . SUBFILENAME).
!                 (while (not (eobp))
!                   (re-search-forward "\\(^.*\\): [0-9]+$")
!                   (goto-char (+ (match-end 1) 2))
!                   (setq list (cons (cons (+ (point-min)
!                                             (read (current-buffer)))
!                                          (match-string-no-properties 1))
!                                    list))
!                   (goto-char (1+ (match-end 0))))
!                 ;; Put in forward order
!                 (setq list (nreverse list))))
!             (while list
!               (message "Searching subfile %s..." (cdr (car list)))
!               (Info-read-subfile (car (car list)))
!               (setq list (cdr list))
!               (setq give-up nil found nil)
!               (while (and (not give-up)
!                           (or (null found)
!                               (isearch-range-invisible beg-found found)))
                  (if (re-search-forward regexp nil t)
!                     (setq found (point) beg-found (match-beginning 0))
!                   (setq give-up t)))
!               (if give-up
!                   (setq found nil))
                (if found
!                   (setq list nil)))
!             (if found
!                 (message "")
!               (signal 'search-failed (list regexp))))
!         (if (not found)
!             (progn (Info-read-subfile osubfile)
!                    (goto-char opoint)
!                    (Info-select-node)
!                    (set-window-start (selected-window) ostart)))))
        (widen)
        (goto-char found)
        (Info-select-node)
***************
*** 1324,1358 ****
  (defun Info-extract-pointer (name &optional errorname)
    "Extract the value of the node-pointer named NAME.
  If there is none, use ERRORNAME in the error message;
! if ERRORNAME is nil, just return nil.
! Bind this in case the user sets it to nil."
    (let ((case-fold-search t))
      (save-excursion
!       (save-restriction
!       (goto-char (point-min))
!       (let ((bound (point)))
!         (forward-line 1)
!         (cond ((re-search-backward (concat name ":") bound t)
!                (goto-char (match-end 0))
!                (Info-following-node-name))
!               ((not (eq errorname t))
!                (error "Node has no %s"
!                       (capitalize (or errorname name))))))))))
  
! (defun Info-following-node-name (&optional allowedchars)
!   "Return the node name in the buffer following point.
  ALLOWEDCHARS, if non-nil, goes within [...] to make a regexp
! saying which chars may appear in the node name."
!   (skip-chars-forward " \t")
!   (buffer-substring-no-properties
!    (point)
!    (progn
!      (while (looking-at (concat "[" (or allowedchars "^,\t\n") "]"))
!        (skip-chars-forward (concat (or allowedchars "^,\t\n") "("))
!        (if (looking-at "(")
!          (skip-chars-forward "^)")))
!      (skip-chars-backward " ")
!      (point))))
  
  (defun Info-next ()
    "Go to the next node of this node."
--- 1413,1450 ----
  (defun Info-extract-pointer (name &optional errorname)
    "Extract the value of the node-pointer named NAME.
  If there is none, use ERRORNAME in the error message;
! if ERRORNAME is nil, just return nil."
!   ;; Bind this in case the user sets it to nil.
    (let ((case-fold-search t))
      (save-excursion
!       (goto-char (point-min))
!       (let ((bound (point)))
!       (forward-line 1)
!       (cond ((re-search-backward
!               (concat name ":" (Info-following-node-name-re)) bound t)
!              (match-string 1))
!             ((not (eq errorname t))
!              (error "Node has no %s"
!                     (capitalize (or errorname name)))))))))
  
! (defun Info-following-node-name-re (&optional allowedchars)
!   "Return a regexp matching a node name.
  ALLOWEDCHARS, if non-nil, goes within [...] to make a regexp
! saying which chars may appear in the node name.
! Submatch 1 is the complete node name.
! Submatch 2 if non-nil is the parenthesized file name part of the node name.
! Submatch 3 is the local part of the node name.
! End of submatch 0, 1, and 3 are the same, so you can safely concat."
!   (concat "[ \t]*"                    ;Skip leading space.
!         "\\(\\(([^)]+)\\)?"   ;Node name can start with a file name.
!         "\\([" (or allowedchars "^,\t\n") "]*" ;Any number of allowed chars.
!         "[" (or allowedchars "^,\t\n") " ]" ;The last char can't be a space.
!         "\\|\\)\\)"))                       ;Allow empty node names.
! 
! ;;; For compatibility; other files have used this name.
! (defun Info-following-node-name ()
!   (and (looking-at (Info-following-node-name-re))
!        (match-string 1)))
  
  (defun Info-next ()
    "Go to the next node of this node."
***************
*** 1411,1419 ****
  
         (goto-char (point-min))
         (while (re-search-forward "\\*note[ \n\t]*\\([^:]*\\):" nil t)
!        (setq str (buffer-substring-no-properties
!                   (match-beginning 1)
!                   (1- (point))))
         ;; See if this one should be the default.
         (and (null default)
              (<= (match-beginning 0) start-point)
--- 1503,1509 ----
  
         (goto-char (point-min))
         (while (re-search-forward "\\*note[ \n\t]*\\([^:]*\\):" nil t)
!        (setq str (match-string-no-properties 1))
         ;; See if this one should be the default.
         (and (null default)
              (<= (match-beginning 0) start-point)
***************
*** 1433,1455 ****
         (if (eq default t) (setq default str))
         (if (eq alt-default t) (setq alt-default str))
         ;; Don't add this string if it's a duplicate.
!        ;; We use a loop instead of "(assoc str completions)" because
!        ;; we want to do a case-insensitive compare.
!        (let ((tail completions)
!              (tem (downcase str)))
!          (while (and tail
!                      (not (string-equal tem (downcase (car (car tail))))))
!            (setq tail (cdr tail)))
!          (or tail
!              (setq completions
!                    (cons (cons str nil)
!                          completions))))))
       ;; If no good default was found, try an alternate.
       (or default
         (setq default alt-default))
       ;; If only one cross-reference found, then make it default.
       (if (eq (length completions) 1)
!          (setq default (car (car completions))))
       (if completions
         (let ((input (completing-read (if default
                                           (concat
--- 1523,1536 ----
         (if (eq default t) (setq default str))
         (if (eq alt-default t) (setq alt-default str))
         ;; Don't add this string if it's a duplicate.
!        (or (assoc-string str completions t)
!            (push str completions))))
       ;; If no good default was found, try an alternate.
       (or default
         (setq default alt-default))
       ;; If only one cross-reference found, then make it default.
       (if (eq (length completions) 1)
!          (setq default (car completions)))
       (if completions
         (let ((input (completing-read (if default
                                           (concat
***************
*** 1464,1470 ****
    (unless footnotename
      (error "No reference was specified"))
  
!   (let (target beg i (str (concat "\\*note " (regexp-quote footnotename)))
               (case-fold-search t))
      (while (setq i (string-match " " str i))
        (setq str (concat (substring str 0 i) "[ \t\n]+" (substring str (1+ 
i))))
--- 1545,1551 ----
    (unless footnotename
      (error "No reference was specified"))
  
!   (let (target i (str (concat "\\*note " (regexp-quote footnotename)))
               (case-fold-search t))
      (while (setq i (string-match " " str i))
        (setq str (concat (substring str 0 i) "[ \t\n]+" (substring str (1+ 
i))))
***************
*** 1475,1500 ****
          (error "No cross-reference named %s" footnotename))
        (goto-char (+ (match-beginning 0) 5))
        (setq target
!           (Info-extract-menu-node-name "Bad format cross reference" t)))
      (while (setq i (string-match "[ \t\n]+" target i))
        (setq target (concat (substring target 0 i) " "
                           (substring target (match-end 0))))
        (setq i (+ i 1)))
      (Info-goto-node target)))
  
! (defun Info-extract-menu-node-name (&optional errmessage multi-line)
    (skip-chars-forward " \t\n")
!   (let ((beg (point))
!       str i)
!     (while (not (looking-at ":*[,.;() \t\n]"))
!       (skip-chars-forward "^:")
!       (forward-char 1))
!     (setq str
!         (if (looking-at ":")
!             (buffer-substring-no-properties beg (1- (point)))
!           (skip-chars-forward " \t\n")
!           (Info-following-node-name (if multi-line "^.,\t" "^.,\t\n"))))
!     (replace-regexp-in-string "[ \n]+" " " str)))
  
  ;; No one calls this.
  ;;(defun Info-menu-item-sequence (list)
--- 1556,1585 ----
          (error "No cross-reference named %s" footnotename))
        (goto-char (+ (match-beginning 0) 5))
        (setq target
!           (Info-extract-menu-node-name t)))
      (while (setq i (string-match "[ \t\n]+" target i))
        (setq target (concat (substring target 0 i) " "
                           (substring target (match-end 0))))
        (setq i (+ i 1)))
      (Info-goto-node target)))
  
! (defconst Info-menu-entry-name-re "\\(?:[^:]\\|:[^:,.;() \t\n]\\)*"
!   ;; We allow newline because this is also used in Info-follow-reference,
!   ;; where the xref name might be wrapped over two lines.
!   "Regexp that matches a menu entry name upto but not including the colon.
! Because of ambiguities, this should be concatenated with something like
! `:' and `Info-following-node-name-re'.")
! 
! (defun Info-extract-menu-node-name (&optional multi-line)
    (skip-chars-forward " \t\n")
!   (when (looking-at (concat Info-menu-entry-name-re ":\\(:\\|"
!                           (Info-following-node-name-re
!                            (if multi-line "^.,\t" "^.,\t\n")) "\\)"))
!     (replace-regexp-in-string
!      "[ \n]+" " "
!      (or (match-string 2)
!        ;; If the node name is the menu entry name (using `entry::').
!        (buffer-substring (match-beginning 0) (1- (match-beginning 1)))))))
  
  ;; No one calls this.
  ;;(defun Info-menu-item-sequence (list)
***************
*** 1506,1511 ****
--- 1591,1600 ----
  (defvar Info-complete-next-re nil)
  (defvar Info-complete-cache nil)
  
+ (defconst Info-node-spec-re
+   (concat (Info-following-node-name-re "^.,:") "[,:.]")
+   "Regexp to match the text after a : until the terminating `.'.")
+ 
  (defun Info-complete-menu-item (string predicate action)
    ;; This uses two dynamically bound variables:
    ;; - `Info-complete-menu-buffer' which contains the buffer in which
***************
*** 1514,1519 ****
--- 1603,1611 ----
    ;; also look for menu items in subsequent nodes as long as those
    ;; nodes' names match `Info-complete-next-re'.  This feature is currently
    ;; only used for completion in Info-index.
+ 
+   ;; Note that `Info-complete-menu-buffer' could be current already,
+   ;; so we want to save point.
    (save-excursion
      (set-buffer Info-complete-menu-buffer)
      (let ((completion-ignore-case t)
***************
*** 1527,1533 ****
           (concat "\n\\* +" (regexp-quote string) ":") nil t)
        (let ((pattern (concat "\n\\* +\\("
                               (regexp-quote string)
!                              "[^\t\n]*\\):"))
              completions)
          ;; Check the cache.
          (if (and (equal (nth 0 Info-complete-cache) Info-current-file)
--- 1619,1625 ----
           (concat "\n\\* +" (regexp-quote string) ":") nil t)
        (let ((pattern (concat "\n\\* +\\("
                               (regexp-quote string)
!                              Info-menu-entry-name-re "\\):" 
Info-node-spec-re))
              completions)
          ;; Check the cache.
          (if (and (equal (nth 0 Info-complete-cache) Info-current-file)
***************
*** 1585,1591 ****
            (save-excursion
              (goto-char p)
              (end-of-line)
!             (if (re-search-backward "\n\\* +\\([^\t\n]*\\):" beg t)
                  (setq default (match-string-no-properties 1))))))
       (let ((item nil))
         (while (null item)
--- 1677,1685 ----
            (save-excursion
              (goto-char p)
              (end-of-line)
!             (if (re-search-backward (concat "\n\\* +\\("
!                                             Info-menu-entry-name-re
!                                             "\\):") beg t)
                  (setq default (match-string-no-properties 1))))))
       (let ((item nil))
         (while (null item)
***************
*** 1921,1926 ****
--- 2015,2021 ----
    (let ((Info-history nil))
      (Info-goto-node (Info-extract-menu-node-name))))
  
+ ;;;###autoload
  (defun Info-index (topic)
    "Look up a string TOPIC in the index for this file.
  The index is defined as the first node in the top level menu whose
***************
*** 1944,1950 ****
    (if (equal Info-current-file "dir")
        (error "The Info directory node has no index; use m to select a 
manual"))
    (let ((orignode Info-current-node)
-       (rnode nil)
        (pattern (format "\n\\* +\\([^\n]*%s[^\n]*\\):[ \t]+\\([^.\n]*\\)\\.[ 
\t]*\\([0-9]*\\)"
                         (regexp-quote topic)))
        node
--- 2039,2044 ----
***************
*** 2023,2030 ****
                 (search-forward
                  (format "`%s'" (substring name 0 (match-beginning 1)))
                  nil t))
!           (search-forward name nil t))
!       (beginning-of-line)
        (goto-char (point-min)))))
  
  (defun Info-undefined ()
--- 2117,2127 ----
                 (search-forward
                  (format "`%s'" (substring name 0 (match-beginning 1)))
                  nil t))
!           (search-forward name nil t)
!           ;; Try again without the " <1>" makeinfo can append
!             (and (string-match "\\`\\(.*\\) <[0-9]+>\\'" name)
!                  (Info-find-index-name (match-string 1 name))))
!       (progn (beginning-of-line) t)  ;; non-nil for recursive call
        (goto-char (point-min)))))
  
  (defun Info-undefined ()
***************
*** 2167,2173 ****
    (define-key Info-mode-map " " 'Info-scroll-up)
    (define-key Info-mode-map "\C-m" 'Info-follow-nearest-node)
    (define-key Info-mode-map "\t" 'Info-next-reference)
!   (define-key Info-mode-map "\e\t" 'Info-prev-reference)
    (define-key Info-mode-map "1" 'Info-nth-menu-item)
    (define-key Info-mode-map "2" 'Info-nth-menu-item)
    (define-key Info-mode-map "3" 'Info-nth-menu-item)
--- 2264,2271 ----
    (define-key Info-mode-map " " 'Info-scroll-up)
    (define-key Info-mode-map "\C-m" 'Info-follow-nearest-node)
    (define-key Info-mode-map "\t" 'Info-next-reference)
!   (define-key Info-mode-map [(shift tab)] 'Info-prev-reference)
!   (define-key Info-mode-map [backtab] 'Info-prev-reference)
    (define-key Info-mode-map "1" 'Info-nth-menu-item)
    (define-key Info-mode-map "2" 'Info-nth-menu-item)
    (define-key Info-mode-map "3" 'Info-nth-menu-item)
***************
*** 2306,2314 ****
          (save-excursion
            (goto-char (point-min))
            (while (re-search-forward "\\*note[ \n\t]*\\([^:]*\\):" nil t)
!             (setq str (buffer-substring
!                        (match-beginning 1)
!                        (1- (point))))
              (setq i 0)
              (while (setq i (string-match "[ \n\t]+" str i))
                (setq str (concat (substring str 0 i) " "
--- 2404,2410 ----
          (save-excursion
            (goto-char (point-min))
            (while (re-search-forward "\\*note[ \n\t]*\\([^:]*\\):" nil t)
!             (setq str (match-string 1))
              (setq i 0)
              (while (setq i (string-match "[ \n\t]+" str i))
                (setq str (concat (substring str 0 i) " "
***************
*** 2399,2405 ****
  \\[beginning-of-buffer]       Go to beginning of node.
  
  Advanced commands:
! \\[Info-exit] Quit Info: reselect previously selected buffer.
  \\[Info-edit] Edit contents of selected node.
  1     Pick first item in node's menu.
  2, 3, 4, 5   Pick second ... fifth item in node's menu.
--- 2495,2501 ----
  \\[beginning-of-buffer]       Go to beginning of node.
  
  Advanced commands:
! \\[Info-copy-current-node-name]       Put name of current info node in the 
kill ring.
  \\[Info-edit] Edit contents of selected node.
  1     Pick first item in node's menu.
  2, 3, 4, 5   Pick second ... fifth item in node's menu.
***************
*** 2429,2436 ****
    (setq Info-tag-table-buffer nil)
    (make-local-variable 'Info-history)
    (make-local-variable 'Info-index-alternatives)
!   (make-local-variable 'Info-header-line)
!   (setq header-line-format (if Info-use-header-line 'Info-header-line))
    (set (make-local-variable 'tool-bar-map) info-tool-bar-map)
    ;; This is for the sake of the invisible text we use handling titles.
    (make-local-variable 'line-move-ignore-invisible)
--- 2525,2534 ----
    (setq Info-tag-table-buffer nil)
    (make-local-variable 'Info-history)
    (make-local-variable 'Info-index-alternatives)
!   (setq header-line-format
!       (if Info-use-header-line
!           '(:eval (get-text-property (point-min) 'header-line))
!         nil)) ; so the header line isn't displayed
    (set (make-local-variable 'tool-bar-map) info-tool-bar-map)
    ;; This is for the sake of the invisible text we use handling titles.
    (make-local-variable 'line-move-ignore-invisible)
***************
*** 2564,2571 ****
      ;; Bind Info-history to nil, to prevent the index nodes from
      ;; getting into the node history.
      (let ((Info-history nil)
!         (exact nil)
!         node found)
        (Info-goto-node (Info-extract-menu-node-name))
        (while
          (progn
--- 2662,2668 ----
      ;; Bind Info-history to nil, to prevent the index nodes from
      ;; getting into the node history.
      (let ((Info-history nil)
!         node)
        (Info-goto-node (Info-extract-menu-node-name))
        (while
          (progn
***************
*** 2586,2593 ****
    "Go to the Info node in the Emacs manual for command COMMAND.
  The command is found by looking up in Emacs manual's indices
  or in another manual found via COMMAND's `info-file' property or
! the variable `Info-file-list-for-emacs'."
    (interactive "CFind documentation for command: ")
    (or (commandp command)
        (signal 'wrong-type-argument (list 'commandp command)))
    (let ((where (Info-find-emacs-command-nodes command)))
--- 2683,2694 ----
    "Go to the Info node in the Emacs manual for command COMMAND.
  The command is found by looking up in Emacs manual's indices
  or in another manual found via COMMAND's `info-file' property or
! the variable `Info-file-list-for-emacs'. COMMAND must be a symbol
! or string."
    (interactive "CFind documentation for command: ")
+   ;; If command is given as a string, convert it to a symbol.
+   (if (stringp command)
+       (setq command (intern command)))  
    (or (commandp command)
        (signal 'wrong-type-argument (list 'commandp command)))
    (let ((where (Info-find-emacs-command-nodes command)))
***************
*** 2671,2681 ****
    "Face for headers in Info menus."
    :group 'info)
  
  (defun Info-fontify-menu-headers ()
    "Add the face `info-menu-header' to any header before a menu entry."
    (save-excursion
      (goto-char (point-min))
!     (when (re-search-forward "\\* Menu:" nil t)
        (put-text-property (match-beginning 0) (match-end 0)
                         'font-lock-face 'info-menu-header)
        (while (re-search-forward "\n\n\\([^*\n ].*\\)\n\n?[*]" nil t)
--- 2772,2803 ----
    "Face for headers in Info menus."
    :group 'info)
  
+ (defun Info-escape-percent (string)
+   "Double all occurrences of `%' in STRING.
+ 
+ Return a new string with all `%' characters replaced by `%%'.
+ Preserve text properties."
+   (let ((start 0)
+       (end (length string))
+       mb me m matches)
+     (save-match-data
+       (while (and (< start end) (string-match "%" string start))
+       (setq mb (match-beginning 0)
+             me (1+ mb)
+             m (substring string mb me)
+             matches (cons m 
+                           (cons m 
+                                 (cons (substring string start mb) 
+                                       matches)))
+             start me))
+       (push (substring string start end) matches)
+       (apply #'concat (nreverse matches)))))
+ 
  (defun Info-fontify-menu-headers ()
    "Add the face `info-menu-header' to any header before a menu entry."
    (save-excursion
      (goto-char (point-min))
!     (when (re-search-forward "^\\* Menu:" nil t)
        (put-text-property (match-beginning 0) (match-end 0)
                         'font-lock-face 'info-menu-header)
        (while (re-search-forward "\n\n\\([^*\n ].*\\)\n\n?[*]" nil t)
***************
*** 2726,2732 ****
            (let* ((nbeg (match-beginning 2))
                   (nend (match-end 2))
                   (tbeg (match-beginning 1))
!                  (tag (buffer-substring tbeg (match-end 1))))
              (if (string-equal tag "Node")
                  (put-text-property nbeg nend 'font-lock-face 
'info-header-node)
                (put-text-property nbeg nend 'font-lock-face 'info-header-xref)
--- 2848,2854 ----
            (let* ((nbeg (match-beginning 2))
                   (nend (match-end 2))
                   (tbeg (match-beginning 1))
!                  (tag (match-string 1)))
              (if (string-equal tag "Node")
                  (put-text-property nbeg nend 'font-lock-face 
'info-header-node)
                (put-text-property nbeg nend 'font-lock-face 'info-header-xref)
***************
*** 2745,2751 ****
                                    ((equal tag "Up") Info-up-link-keymap))))))
          (when Info-use-header-line
            (goto-char (point-min))
!           (let ((header-end (save-excursion (end-of-line) (point)))
                  header)
              ;; If we find neither Next: nor Prev: link, show the entire
              ;; node header.  Otherwise, don't show the File: and Node:
--- 2867,2873 ----
                                    ((equal tag "Up") Info-up-link-keymap))))))
          (when Info-use-header-line
            (goto-char (point-min))
!           (let ((header-end (line-end-position))
                  header)
              ;; If we find neither Next: nor Prev: link, show the entire
              ;; node header.  Otherwise, don't show the File: and Node:
***************
*** 2757,2770 ****
                  (progn
                    (goto-char (match-beginning 1))
                    (setq header (buffer-substring (point) header-end)))
!               (if (re-search-forward "node:[ \t]*[^ \t]+[ \t]*" nil t)
                    (setq header
                          (concat "No next, prev or up links  --  "
                                  (buffer-substring (point) header-end)))
                  (setq header (buffer-substring (point) header-end))))
  
              (put-text-property (point-min) (1+ (point-min))
!                                'header-line header)
              ;; Hide the part of the first line
              ;; that is in the header, if it is just part.
              (unless (bobp)
--- 2879,2892 ----
                  (progn
                    (goto-char (match-beginning 1))
                    (setq header (buffer-substring (point) header-end)))
!               (if (re-search-forward "node:[ \t]*[^ \t]+[ \t]*" header-end t)
                    (setq header
                          (concat "No next, prev or up links  --  "
                                  (buffer-substring (point) header-end)))
                  (setq header (buffer-substring (point) header-end))))
  
              (put-text-property (point-min) (1+ (point-min))
!                                'header-line (Info-escape-percent header))
              ;; Hide the part of the first line
              ;; that is in the header, if it is just part.
              (unless (bobp)
***************
*** 2786,2793 ****
          ;; frame types at once.  We want this text to be invisible
          ;; on frames that can display the font above.
          (when (memq (framep (selected-frame)) '(x pc w32 mac))
!           (add-text-properties (match-beginning 2) (1+ (match-end 2))
!                                '(invisible t))))
        (goto-char (point-min))
        (while (re-search-forward "\\(\\*Note[ \t]*\\)\n?[ 
\t]*\\([^:]*\\)\\(:[^.,:(]*\\(([^)]*)[^.,:]*\\)?[,:]?\n?\\)" nil t)
          (unless (= (char-after (1- (match-beginning 0))) ?\") ; hack
--- 2908,2915 ----
          ;; frame types at once.  We want this text to be invisible
          ;; on frames that can display the font above.
          (when (memq (framep (selected-frame)) '(x pc w32 mac))
!           (add-text-properties (1- (match-beginning 2)) (match-end 2)
!                                '(invisible t front-sticky nil rear-nonsticky 
t))))
        (goto-char (point-min))
        (while (re-search-forward "\\(\\*Note[ \t]*\\)\n?[ 
\t]*\\([^:]*\\)\\(:[^.,:(]*\\(([^)]*)[^.,:]*\\)?[,:]?\n?\\)" nil t)
          (unless (= (char-after (1- (match-beginning 0))) ?\") ; hack
***************
*** 2800,2870 ****
                (goto-char start)
                (skip-syntax-backward " ")
                (setq other-tag
!                     (cond
!                      ((or (<= (point) (point-min))
!                           (memq (char-after (1- (point))) '( ?\. ?! )))
!                       "See ")
!                      ((memq (char-after (1- (point))) '( ?\( ?\[ ?\{ ?\, ?\; 
?\: ))
!                       "see ")
!                      (t nil)))
                (goto-char next))
              (if hide-tag
                  (add-text-properties (match-beginning 1) (match-end 1)
!                                      '(invisible t)))
!             (add-text-properties (match-beginning 2) (match-end 2)
!                                  '(font-lock-face info-xref
!                                                   mouse-face highlight
!                                                   help-echo "mouse-2: go to 
this node"))
              (when (eq Info-hide-note-references t)
                (add-text-properties (match-beginning 3) (match-end 3)
!                                    '(invisible t)))
              (when other-tag
                (save-excursion
                  (goto-char (match-beginning 1))
                  (insert other-tag)))
!             (when (or hide-tag (eq Info-hide-note-references t))
!               (setq paragraph-markers (cons (set-marker (make-marker) start)
!                                             paragraph-markers))))))
! 
!       (let ((fill-nobreak-invisible t))
!         (goto-char (point-max))
!         (while paragraph-markers
!           (let ((m (car paragraph-markers)))
!             (setq paragraph-markers (cdr paragraph-markers))
!             (when (< m (point))
!               (goto-char m)
!               (fill-paragraph nil)
!               (backward-paragraph 1))
!             (set-marker m nil))))
  
        (goto-char (point-min))
!       (if (and (search-forward "\n* Menu:" nil t)
!                (not (string-match "\\<Index\\>" Info-current-node))
!                ;; Don't take time to annotate huge menus
!                (< (- (point-max) (point)) Info-fontify-maximum-menu-size))
!           (let ((n 0)
!                 cont)
!             (while (re-search-forward "^\\* 
+\\([^:\t\n]*\\)\\(:[^.,:(]*\\(([^)]*)[^.,:]*\\)?[,:.][ \t]*\\)" nil t)
!               (setq n (1+ n))
!               (if (zerop (% n 3)) ; visual aids to help with 1-9 keys
!                   (put-text-property (match-beginning 0)
!                                      (1+ (match-beginning 0))
!                                      'font-lock-face 'info-menu-5))
!               (add-text-properties (match-beginning 1) (match-end 1)
!                                    '(font-lock-face info-xref
!                                      mouse-face highlight
!                                      help-echo "mouse-2: go to this node"))
!               (when (eq Info-hide-note-references t)
!                 (add-text-properties (match-beginning 2) (match-end 2)
!                                      (list 'display
!                                            (make-string (max 2 (- 22 (- 
(match-end 1) (match-beginning 1)))) ? )))
!                 (setq cont (looking-at "[ \t]*[^\n]")))
!               (if (eq Info-hide-note-references t)
!                   (while (and (= (forward-line 1) 0)
!                               (looking-at "\\([ \t]+\\)[^*\n]"))
!                     (add-text-properties (match-beginning 1) (match-end 1)
!                                          (list 'display (make-string (+ 22 
(if cont 4 2)) ? )))
!                     (setq cont t))))))
  
        (Info-fontify-menu-headers)
        (set-buffer-modified-p nil)))))
--- 2922,3030 ----
                (goto-char start)
                (skip-syntax-backward " ")
                (setq other-tag
!                     (cond ((memq (char-before) '(nil ?\. ?! ??))
!                            "See ")
!                           ((memq (char-before) '(?\, ?\; ?\: ?-))
!                            "see ")
!                           ((memq (char-before) '(?\( ?\[ ?\{))
!                            ;; Check whether the paren is preceded by
!                            ;; an end of sentence
!                            (skip-syntax-backward " (")
!                            (if (memq (char-before) '(nil ?\. ?! ??))
!                                "See "
!                              "see "))
!                           ((save-match-data (looking-at "\n\n"))
!                            "See ")))
                (goto-char next))
              (if hide-tag
                  (add-text-properties (match-beginning 1) (match-end 1)
!                                      '(invisible t front-sticky nil 
rear-nonsticky t)))
!             (add-text-properties
!              (match-beginning 2) (match-end 2)
!              (cons 'help-echo
!                    (cons (if (match-end 4)
!                              (concat "mouse-2: go to " (match-string 4))
!                            "mouse-2: go to this node")
!                          '(font-lock-face info-xref
!                            mouse-face highlight))))
              (when (eq Info-hide-note-references t)
                (add-text-properties (match-beginning 3) (match-end 3)
!                                    '(invisible t front-sticky nil 
rear-nonsticky t)))
              (when other-tag
                (save-excursion
                  (goto-char (match-beginning 1))
                  (insert other-tag)))
!             (when (and Info-refill-paragraphs
!                        (or hide-tag (eq Info-hide-note-references t)))
!               (push (set-marker (make-marker) start)
!                     paragraph-markers)))))
! 
!       (when (and Info-refill-paragraphs
!                  paragraph-markers)
!         (let ((fill-nobreak-invisible t)
!               (fill-individual-varying-indent nil)
!               (paragraph-start "\f\\|[ \t]*[-*]\\|[ \t]*$")
!               (paragraph-separate ".*\\.[ \t]*\n[ \t]\\|[ \t]*[-*]\\|[ 
\t\f]*$")
!               (adaptive-fill-mode nil))
!           (goto-char (point-max))
!           (while paragraph-markers
!             (let ((m (car paragraph-markers)))
!               (setq paragraph-markers (cdr paragraph-markers))
!               (when (< m (point))
!                 (goto-char m)
!                 (beginning-of-line)
!                 (let ((beg (point)))
!                   (when (zerop (forward-paragraph))
!                     (fill-individual-paragraphs beg (point) nil nil)
!                     (goto-char beg))))
!               (set-marker m nil)))))
  
        (goto-char (point-min))
!       (when (and (search-forward "\n* Menu:" nil t)
!                  (not (string-match "\\<Index\\>" Info-current-node))
!                  ;; Don't take time to annotate huge menus
!                  (< (- (point-max) (point)) Info-fontify-maximum-menu-size))
!         (let ((n 0)
!               cont)
!           (while (re-search-forward
!                   (concat "^\\* +\\(" Info-menu-entry-name-re "\\)\\(:"
!                           Info-node-spec-re "\\([ \t]*\\)\\)")
!                   nil t)
!             (setq n (1+ n))
!             (if (and (<= n 9) (zerop (% n 3))) ; visual aids to help with 1-9 
keys
!                 (put-text-property (match-beginning 0)
!                                    (1+ (match-beginning 0))
!                                    'font-lock-face 'info-menu-5))
!             (add-text-properties
!              (match-beginning 1) (match-end 1)
!              (cons 'help-echo
!                    (cons
!                     (if (match-end 3)
!                         (concat "mouse-2: go to " (match-string 3))
!                       "mouse-2: go to this node")
!                     '(font-lock-face info-xref
!                       mouse-face highlight))))
!             (when (eq Info-hide-note-references t)
!               (put-text-property (match-beginning 2) (1- (match-end 6))
!                                  'invisible t)
!               ;; We need a stretchable space like :align-to but with
!               ;; a minimum value.
!               (put-text-property (1- (match-end 6)) (match-end 6) 'display
!                                  (if (>= 22 (- (match-end 1)
!                                                (match-beginning 0)))
!                                      '(space :align-to 24)
!                                    '(space :width 2)))
!               (setq cont (looking-at "."))
!               (while (and (= (forward-line 1) 0)
!                           (looking-at "\\([ \t]+\\)[^*\n]"))
!                 (put-text-property (match-beginning 1) (1- (match-end 1))
!                                    'invisible t)
!                 (put-text-property (1- (match-end 1)) (match-end 1)
!                                    'display
!                                    (if cont
!                                        '(space :align-to 26)
!                                      '(space :align-to 24)))
!                 (setq cont t))))))
  
        (Info-fontify-menu-headers)
        (set-buffer-modified-p nil)))))
***************
*** 2960,2973 ****
        (select-frame cf)
        (if completions
          (speedbar-with-writable
!          (while completions
             (speedbar-make-tag-line 'bracket ?+ 'Info-speedbar-expand-node
!                                    (cdr (car completions))
!                                    (car (car completions))
                                     'Info-speedbar-goto-node
!                                    (cdr (car completions))
!                                    'info-xref depth)
!            (setq completions (cdr completions)))
           t)
        nil))))
  
--- 3120,3132 ----
        (select-frame cf)
        (if completions
          (speedbar-with-writable
!          (dolist (completion completions)
             (speedbar-make-tag-line 'bracket ?+ 'Info-speedbar-expand-node
!                                    (cdr completion)
!                                    (car completion)
                                     'Info-speedbar-goto-node
!                                    (cdr completion)
!                                    'info-xref depth))
           t)
        nil))))
  
***************
*** 2986,2995 ****
          (let ((pop-up-frames t)) (select-window (display-buffer buff)))
        (select-frame speedbar-attached-frame)
        (switch-to-buffer buff)))
!     (let ((junk (string-match "^(\\([^)]+\\))\\([^.]+\\)$" node))
!         (file (match-string 1 node))
!         (node (match-string 2 node)))
!       (Info-find-node file node)
        ;; If we do a find-node, and we were in info mode, restore
        ;; the old default method.  Once we are in info mode, it makes
        ;; sense to return to whatever method the user was using before.
--- 3145,3153 ----
          (let ((pop-up-frames t)) (select-window (display-buffer buff)))
        (select-frame speedbar-attached-frame)
        (switch-to-buffer buff)))
!     (if (not (string-match "^(\\([^)]+\\))\\([^.]+\\)$" node))
!       (error "Invalid node %s" node)
!       (Info-find-node (match-string 1 node) (match-string 2 node))
        ;; If we do a find-node, and we were in info mode, restore
        ;; the old default method.  Once we are in info mode, it makes
        ;; sense to return to whatever method the user was using before.
***************
*** 3026,3035 ****
      (if (not (equal major-mode 'Info-mode))
        (Info-mode))
      ;; Get the node into this buffer
!     (let ((junk (string-match "^(\\([^)]+\\))\\([^.]+\\)$" nodespec))
!         (file (match-string 1 nodespec))
!         (node (match-string 2 nodespec)))
!       (Info-find-node file node))
      ;; Scan the created buffer
      (goto-char (point-min))
      (let ((completions nil)
--- 3184,3192 ----
      (if (not (equal major-mode 'Info-mode))
        (Info-mode))
      ;; Get the node into this buffer
!     (if (not (string-match "^(\\([^)]+\\))\\([^.]+\\)$" nodespec))
!       (error "Invalid node specification %s" nodespec)
!       (Info-find-node (match-string 1 nodespec) (match-string 2 nodespec)))
      ;; Scan the created buffer
      (goto-char (point-min))
      (let ((completions nil)
***************
*** 3040,3057 ****
        (re-search-forward "\n\\* \\([^:\t\n]*\\):" nil t)
        (while (re-search-forward "\n\\* \\([^:\t\n]*\\):" nil t)
        (let ((name (match-string 1)))
!         (if (looking-at " *\\(([^)]+)[^.\n]+\\)\\.")
!             (setq name (cons name (match-string 1)))
!           (if (looking-at " *\\(([^)]+)\\)\\.")
!               (setq name (cons name (concat (match-string 1) "Top")))
!             (if (looking-at " \\([^.]+\\).")
!                 (setq name
!                       (cons name (concat "(" thisfile ")" (match-string 1))))
!               (setq name (cons name (concat "(" thisfile ")" name))))))
!         (setq completions (cons name completions))))
        (nreverse completions))))
  
  ;;; Info mode node listing
  (defun Info-speedbar-buttons (buffer)
    "Create a speedbar display to help navigation in an Info file.
  BUFFER is the buffer speedbar is requesting buttons for."
--- 3197,3216 ----
        (re-search-forward "\n\\* \\([^:\t\n]*\\):" nil t)
        (while (re-search-forward "\n\\* \\([^:\t\n]*\\):" nil t)
        (let ((name (match-string 1)))
!         (push (cons name
!                     (if (looking-at " *\\(([^)]+)[^.\n]+\\)\\.")
!                         (match-string 1)
!                       (if (looking-at " *\\(([^)]+)\\)\\.")
!                           (concat (match-string 1) "Top")
!                         (concat "(" thisfile ")"
!                                 (if (looking-at " \\([^.]+\\).")
!                                     (match-string 1)
!                                   name)))))
!               completions)))
        (nreverse completions))))
  
  ;;; Info mode node listing
+ ;; FIXME: Seems not to be used.  -stef
  (defun Info-speedbar-buttons (buffer)
    "Create a speedbar display to help navigation in an Info file.
  BUFFER is the buffer speedbar is requesting buttons for."
***************
*** 3072,3075 ****
--- 3231,3235 ----
  
  (provide 'info)
  
+ ;;; arch-tag: f2480fe2-2139-40c1-a49b-6314991164ac
  ;;; info.el ends here




reply via email to

[Prev in Thread] Current Thread [Next in Thread]