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 [emacs-unicode-2]


From: Miles Bader
Subject: [Emacs-diffs] Changes to emacs/lisp/info.el [emacs-unicode-2]
Date: Mon, 28 Jun 2004 04:40:43 -0400

Index: emacs/lisp/info.el
diff -c emacs/lisp/info.el:1.367.2.1 emacs/lisp/info.el:1.367.2.2
*** emacs/lisp/info.el:1.367.2.1        Fri Apr 16 12:50:05 2004
--- emacs/lisp/info.el  Mon Jun 28 07:28:41 2004
***************
*** 66,94 ****
  (put 'Info-enable-active-nodes 'risky-local-variable t)
  
  (defface info-node
!   '((((class color) (background light)) (:foreground "brown" :weight bold 
:slant italic))
!     (((class color) (background dark)) (:foreground "white" :weight bold 
:slant italic))
!     (t (:weight bold :slant italic)))
    "Face for Info node names."
    :group 'info)
  
  (defface info-menu-5
!   '((((class color)) (:foreground "red1"))
!     (t (:underline t)))
    "Face for every third `*' in an Info menu."
    :group 'info)
  
  (defface info-xref
!   '((((class color) (background light)) (:foreground "blue"))
!     (((class color) (background dark)) (:foreground "cyan"))
!     (t (:underline t)))
    "Face for Info cross-references."
    :group 'info)
  
  (defface info-xref-visited
!   '((((class color) (background light)) (:foreground "magenta4"))
!     (((class color) (background dark)) (:foreground "magenta4"))
!     (t (:underline t)))
    "Face for visited Info cross-references."
    :group 'info)
  
--- 66,94 ----
  (put 'Info-enable-active-nodes 'risky-local-variable t)
  
  (defface info-node
!   '((((class color) (background light)) :foreground "brown" :weight bold 
:slant italic)
!     (((class color) (background dark)) :foreground "white" :weight bold 
:slant italic)
!     (t :weight bold :slant italic))
    "Face for Info node names."
    :group 'info)
  
  (defface info-menu-5
!   '((((class color)) :foreground "red1")
!     (t :underline t))
    "Face for every third `*' in an Info menu."
    :group 'info)
  
  (defface info-xref
!   '((((class color) (background light)) :foreground "blue")
!     (((class color) (background dark)) :foreground "cyan")
!     (t :underline t))
    "Face for Info cross-references."
    :group 'info)
  
  (defface info-xref-visited
!   '((t :inherit info-xref)
!     (((class color) (background light)) :foreground "magenta4")
!     (((class color) (background dark)) :foreground "magenta3")) ;"violet"?
    "Face for visited Info cross-references."
    :group 'info)
  
***************
*** 110,121 ****
    :group 'info)
  
  (defface info-header-xref
!   '((t (:inherit info-xref)))
    "Face for Info cross-references in a node header."
    :group 'info)
  
  (defface info-header-node
!   '((t (:inherit info-node)))
    "Face for Info nodes in a node header."
    :group 'info)
  
--- 110,121 ----
    :group 'info)
  
  (defface info-header-xref
!   '((t :inherit info-xref))
    "Face for Info cross-references in a node header."
    :group 'info)
  
  (defface info-header-node
!   '((t :inherit info-node))
    "Face for Info nodes in a node header."
    :group 'info)
  
***************
*** 239,248 ****
  (defvar Info-index-alternatives nil
    "List of possible matches for last `Info-index' command.")
  
! (defvar Info-reference-name nil
!   "Name of the selected cross-reference.
! Point is moved to the proper occurrence of this name within a node
! after selecting it.")
  
  (defvar Info-standalone nil
    "Non-nil if Emacs was started solely as an Info browser.")
--- 239,249 ----
  (defvar Info-index-alternatives nil
    "List of possible matches for last `Info-index' command.")
  
! (defvar Info-point-loc nil
!   "Point location within a selected node.
! If string, the point is moved to the proper occurrence of the
! name of the followed cross reference within a selected node.
! If number, the point is moved to the corresponding line.")
  
  (defvar Info-standalone nil
    "Non-nil if Emacs was started solely as an Info browser.")
***************
*** 449,476 ****
    "Like `info' but show the Info buffer in another window."
    (interactive (if current-prefix-arg
                   (list (read-file-name "Info file name: " nil nil t))))
!   (let (same-window-buffer-names)
      (info file)))
  
! ;;;###autoload (add-hook 'same-window-buffer-names "*info*")
  
  ;;;###autoload
! (defun info (&optional file)
    "Enter Info, the documentation browser.
  Optional argument FILE specifies the file to examine;
  the default is the top-level directory of Info.
  Called from a program, FILE may specify an Info node of the form
  `(FILENAME)NODENAME'.
! 
! In interactive use, a prefix argument directs this command
! to read a file name from the minibuffer.
  
  The search path for Info files is in the variable `Info-directory-list'.
  The top-level Info directory is made by combining all the files named `dir'
  in all the directories in that path."
!   (interactive (if current-prefix-arg
!                  (list (read-file-name "Info file name: " nil nil t))))
!   (pop-to-buffer "*info*")
    (if file
        ;; If argument already contains parentheses, don't add another set
        ;; since the argument will then be parsed improperly.  This also
--- 450,488 ----
    "Like `info' but show the Info buffer in another window."
    (interactive (if current-prefix-arg
                   (list (read-file-name "Info file name: " nil nil t))))
!   (let (same-window-buffer-names same-window-regexps)
      (info file)))
  
! ;;;###autoload (add-hook 'same-window-regexps "\\*info\\*\\(\\|<[0-9]+>\\)")
  
  ;;;###autoload
! (defun info (&optional file buffer)
    "Enter Info, the documentation browser.
  Optional argument FILE specifies the file to examine;
  the default is the top-level directory of Info.
  Called from a program, FILE may specify an Info node of the form
  `(FILENAME)NODENAME'.
! Optional argument BUFFER specifies the Info buffer name;
! the default buffer name is *info*.  If BUFFER exists,
! just switch to BUFFER.  Otherwise, create a new buffer
! with the top-level Info directory.
! 
! In interactive use, a non-numeric prefix argument directs
! this command to read a file name from the minibuffer.
! A numeric prefix argument selects an Info buffer with the prefix number
! appended to the Info buffer name.
  
  The search path for Info files is in the variable `Info-directory-list'.
  The top-level Info directory is made by combining all the files named `dir'
  in all the directories in that path."
!   (interactive (list
!                 (if (and current-prefix-arg (not (numberp 
current-prefix-arg)))
!                     (read-file-name "Info file name: " nil nil t))
!                 (if (numberp current-prefix-arg)
!                     (format "*info*<%s>" current-prefix-arg))))
!   (pop-to-buffer (or buffer "*info*"))
!   (if (and buffer (not (eq major-mode 'Info-mode)))
!       (Info-mode))
    (if file
        ;; If argument already contains parentheses, don't add another set
        ;; since the argument will then be parsed improperly.  This also
***************
*** 480,486 ****
          (Info-goto-node file)
        (Info-goto-node (concat "(" file ")")))
      (if (zerop (buffer-size))
!       (Info-directory))))
  
  ;;;###autoload
  (defun info-emacs-manual ()
--- 492,498 ----
          (Info-goto-node file)
        (Info-goto-node (concat "(" file ")")))
      (if (zerop (buffer-size))
!         (Info-directory))))
  
  ;;;###autoload
  (defun info-emacs-manual ()
***************
*** 535,545 ****
    (if (stringp filename)
        (let (temp temp-downcase found)
          (setq filename (substitute-in-file-name filename))
!       (cond 
         ((string= (downcase filename) "dir")
          (setq found t))
         ((string= filename "apropos")
          (setq found 'apropos))
         (t
          (let ((dirs (if (string-match "^\\./" filename)
                            ;; If specified name starts with `./'
--- 547,561 ----
    (if (stringp filename)
        (let (temp temp-downcase found)
          (setq filename (substitute-in-file-name filename))
!       (cond
         ((string= (downcase filename) "dir")
          (setq found t))
         ((string= filename "apropos")
          (setq found 'apropos))
+        ((string= filename "history")
+         (setq found 'history))
+        ((string= filename "toc")
+         (setq found 'toc))
         (t
          (let ((dirs (if (string-match "^\\./" filename)
                            ;; If specified name starts with `./'
***************
*** 742,747 ****
--- 758,767 ----
                (Info-insert-dir))
               ((eq filename 'apropos)
                (insert-buffer-substring " *info-apropos*"))
+              ((eq filename 'history)
+               (insert-buffer-substring " *info-history*"))
+              ((eq filename 'toc)
+               (insert-buffer-substring " *info-toc*"))
               (t
                  (info-insert-file-contents filename nil)
                  (setq default-directory (file-name-directory filename))))
***************
*** 782,787 ****
--- 802,809 ----
                    (cond
                     ((eq filename t) "dir")
                     ((eq filename 'apropos) "apropos")
+                    ((eq filename 'history) "history")
+                    ((eq filename 'toc) "toc")
                     (t filename)))
              ))
          ;; Use string-equal, not equal, to ignore text props.
***************
*** 842,850 ****
              (let ((pos (Info-find-node-in-buffer regexp)))
                (when pos
                  (goto-char pos)
!                 (throw 'foo t))
!               (error "No such anchor in tag table or node in tag table or 
file: %s"
!                      nodename)))
  
            (Info-select-node)
            (goto-char (point-min))
--- 864,880 ----
              (let ((pos (Info-find-node-in-buffer regexp)))
                (when pos
                  (goto-char pos)
!                 (throw 'foo t)))
! 
!               (when (string-match "\\([^.]+\\)\\." nodename)
!                 (let (Info-point-loc)
!                   (Info-find-node-2
!                    filename (match-string 1 nodename) no-going-back))
!                 (widen)
!                 (throw 'foo t))
! 
!               ;; No such anchor in tag table or node in tag table or file
!               (error "No such node or anchor: %s" nodename))
  
            (Info-select-node)
            (goto-char (point-min))
***************
*** 856,864 ****
                             (cons new-history
                                   (delete new-history Info-history-list))))
                     (goto-char anchorpos))
!                 (Info-reference-name
!                  (Info-find-index-name Info-reference-name)
!                  (setq Info-reference-name nil))))))
      ;; If we did not finish finding the specified node,
      ;; go back to the previous one.
      (or Info-current-node no-going-back (null Info-history)
--- 886,897 ----
                             (cons new-history
                                   (delete new-history Info-history-list))))
                     (goto-char anchorpos))
!                   ((numberp Info-point-loc)
!                    (forward-line (1- Info-point-loc))
!                    (setq Info-point-loc nil))
!                 ((stringp Info-point-loc)
!                  (Info-find-index-name Info-point-loc)
!                  (setq Info-point-loc nil))))))
      ;; If we did not finish finding the specified node,
      ;; go back to the previous one.
      (or Info-current-node no-going-back (null Info-history)
***************
*** 982,990 ****
                    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))
--- 1015,1021 ----
                    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))
***************
*** 1053,1059 ****
      (goto-char (point-min))
      ;; Remove duplicate headings in the same menu.
      (while (search-forward "\n* Menu:" nil t)
!       (setq limit (save-excursion (search-forward "\n" nil t)))
        ;; Look for the next heading to unify.
        (while (re-search-forward "^\\(\\w.*\\)\n\\*" limit t)
        (let ((name (match-string 1))
--- 1084,1090 ----
      (goto-char (point-min))
      ;; Remove duplicate headings in the same menu.
      (while (search-forward "\n* Menu:" nil t)
!       (setq limit (save-excursion (search-forward "\n\^_" nil t)))
        ;; Look for the next heading to unify.
        (while (re-search-forward "^\\(\\w.*\\)\n\\*" limit t)
        (let ((name (match-string 1))
***************
*** 1264,1270 ****
        (let ((new-history (list Info-current-file Info-current-node)))
          (setq Info-history-list
                (cons new-history (delete new-history Info-history-list))))
!       (Info-fontify-node)
        (Info-display-images-node)
        (Info-hide-cookies-node)
        (run-hooks 'Info-selection-hook)))))
--- 1295,1302 ----
        (let ((new-history (list Info-current-file Info-current-node)))
          (setq Info-history-list
                (cons new-history (delete new-history Info-history-list))))
!       (if (not (eq Info-fontify-maximum-menu-size nil))
!             (Info-fontify-node))
        (Info-display-images-node)
        (Info-hide-cookies-node)
        (run-hooks 'Info-selection-hook)))))
***************
*** 1284,1289 ****
--- 1316,1322 ----
  ;; Go to an info node specified with a filename-and-nodename string
  ;; of the sort that is found in pointers in nodes.
  
+ ;;;###autoload
  (defun Info-goto-node (nodename &optional fork)
    "Go to info node named NODENAME.  Give just NODENAME or (FILENAME)NODENAME.
  If NODENAME is of the form (FILENAME)NODENAME, the node is in the Info file
***************
*** 1298,1305 ****
    (if fork
        (set-buffer
         (clone-buffer (concat "*info-" (if (stringp fork) fork nodename) "*") 
t)))
-   (if (member (buffer-name) '("*info-history*" "*info-toc*"))
-       (switch-to-buffer "*info*"))
    (let (filename)
      (string-match "\\s *\\((\\s *\\([^\t)]*\\)\\s *)\\s *\\|\\)\\(.*\\)"
                  nodename)
--- 1331,1336 ----
***************
*** 1307,1315 ****
                       ""
                     (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)))
        (if trim (setq nodename (substring nodename 0 trim))))
      (if transient-mark-mode (deactivate-mark))
      (Info-find-node (if (equal filename "") nil filename)
--- 1338,1346 ----
                       ""
                     (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)))
        (if trim (setq nodename (substring nodename 0 trim))))
      (if transient-mark-mode (deactivate-mark))
      (Info-find-node (if (equal filename "") nil filename)
***************
*** 1616,1690 ****
    (interactive)
    (Info-find-node "dir" "top"))
  
- ;;;###autoload (add-hook 'same-window-buffer-names "*info-history*")
- 
  (defun Info-history ()
!   "Create the buffer *info-history* with a menu of visited nodes."
    (interactive)
    (let ((curr-file Info-current-file)
          (curr-node Info-current-node)
          p)
!     (pop-to-buffer
!      (with-current-buffer (get-buffer-create "*info-history*")
!        (let ((inhibit-read-only t))
!          (erase-buffer)
!          (goto-char (point-min))
!          (insert "Node: History\n\n")
!          (insert "Recently Visited Nodes\n**********************\n\n")
!          (insert "* Menu:\n\n")
!          (let ((hl Info-history-list))
!            (while hl
!              (let ((file (nth 0 (car hl)))
!                    (node (nth 1 (car hl))))
!                (if (and (string-equal file curr-file)
!                         (string-equal node curr-node))
!                    (setq p (point)))
!                (insert "* " node ": (" (file-name-nondirectory file)
!                        ")" node ".\n"))
!              (setq hl (cdr hl))))
!          (or (eq major-mode 'Info-mode) (Info-mode))
!          (setq Info-current-file "info-history")
!          (setq Info-current-node "Info History")
!          (Info-set-mode-line)
!          (if (not (bobp)) (Info-fontify-node))
!          (current-buffer))))
      (goto-char (or p (point-min)))))
  
- ;;;###autoload (add-hook 'same-window-buffer-names "*info-toc*")
- 
  (defun Info-toc ()
!   "Create the buffer *info-toc* with Info file's table of contents."
    (interactive)
    (let ((curr-file Info-current-file)
          (curr-node Info-current-node)
          p)
!     (pop-to-buffer
!      (with-current-buffer (get-buffer-create "*info-toc*")
!        (if (not (equal Info-current-file curr-file))
!            (let ((inhibit-read-only t)
!                  (node-list (Info-build-toc curr-file)))
!              (erase-buffer)
!              (goto-char (point-min))
!              (insert "Node: Contents\n\n")
!              (insert "Table of Contents\n*****************\n\n")
!              (insert "*Note Top::\n")
!              (Info-insert-toc
!               (nth 2 (assoc "Top" node-list)) ; get Top nodes
!               node-list 0)
!              (or (eq major-mode 'Info-mode) (Info-mode))
!              (setq Info-current-file curr-file)
!              (setq Info-current-node "Contents")
!              (Info-set-mode-line)))
!        (if (not (bobp))
!            (let ((Info-hide-note-references 'hide))
!              (Info-fontify-node)))
!        (goto-char (point-min))
!        (if (setq p (search-forward (concat "*Note " curr-node "::") nil t))
!            (setq p (- p (length curr-node) 2)))
!        (current-buffer)))
      (goto-char (or p (point-min)))))
  
! (defun Info-insert-toc (nodes node-list level)
    "Insert table of contents with references to nodes."
    (let ((section "Top"))
      (while nodes
--- 1647,1709 ----
    (interactive)
    (Info-find-node "dir" "top"))
  
  (defun Info-history ()
!   "Go to a node with a menu of visited nodes."
    (interactive)
    (let ((curr-file Info-current-file)
          (curr-node Info-current-node)
          p)
!     (with-current-buffer (get-buffer-create " *info-history*")
!       (let ((inhibit-read-only t))
!         (erase-buffer)
!         (goto-char (point-min))
!         (insert "\n\^_\nFile: history Node: Top, Up: (dir)\n\n")
!         (insert "Recently Visited Nodes\n**********************\n\n")
!         (insert "* Menu:\n\n")
!         (let ((hl (delete '("history" "Top") Info-history-list)))
!           (while hl
!             (let ((file (nth 0 (car hl)))
!                   (node (nth 1 (car hl))))
!               (if (and (string-equal file curr-file)
!                        (string-equal node curr-node))
!                   (setq p (point)))
!               (insert "* " node ": (" (file-name-nondirectory file)
!                       ")" node ".\n"))
!             (setq hl (cdr hl))))))
!     (Info-find-node "history" "Top")
      (goto-char (or p (point-min)))))
  
  (defun Info-toc ()
!   "Go to a node with table of contents of the current Info file.
! Table of contents is created from the tree structure of menus."
    (interactive)
    (let ((curr-file Info-current-file)
          (curr-node Info-current-node)
          p)
!     (with-current-buffer (get-buffer-create " *info-toc*")
!       (let ((inhibit-read-only t)
!             (node-list (Info-build-toc curr-file)))
!         (erase-buffer)
!         (goto-char (point-min))
!         (insert "\n\^_\nFile: toc Node: Top, Up: (dir)\n\n")
!         (insert "Table of Contents\n*****************\n\n")
!         (insert "*Note Top::\n")
!         (Info-insert-toc
!          (nth 2 (assoc "Top" node-list)) ; get Top nodes
!          node-list 0 (substring-no-properties curr-file)))
!       (if (not (bobp))
!           (let ((Info-hide-note-references 'hide)
!                 (Info-fontify-visited-nodes nil))
!             (Info-mode)
!             (setq Info-current-file "toc" Info-current-node "Top")
!             (Info-fontify-node)))
!       (goto-char (point-min))
!       (if (setq p (search-forward (concat "*Note " curr-node ":") nil t))
!           (setq p (- p (length curr-node) 2))))
!     (Info-find-node "toc" "Top")
      (goto-char (or p (point-min)))))
  
! (defun Info-insert-toc (nodes node-list level curr-file)
    "Insert table of contents with references to nodes."
    (let ((section "Top"))
      (while nodes
***************
*** 1692,1699 ****
          (unless (member (nth 1 node) (list nil section))
            (insert (setq section (nth 1 node)) "\n"))
          (insert (make-string level ?\t))
!         (insert "*Note " (car nodes) "::\n")
!         (Info-insert-toc (nth 2 node) node-list (1+ level))
          (setq nodes (cdr nodes))))))
  
  (defun Info-build-toc (file)
--- 1711,1718 ----
          (unless (member (nth 1 node) (list nil section))
            (insert (setq section (nth 1 node)) "\n"))
          (insert (make-string level ?\t))
!         (insert "*Note " (car nodes) ": (" curr-file ")" (car nodes) ".\n")
!         (Info-insert-toc (nth 2 node) node-list (1+ level) curr-file)
          (setq nodes (cdr nodes))))))
  
  (defun Info-build-toc (file)
***************
*** 1701,1716 ****
    (if (equal file "dir")
        (error "Table of contents for Info directory is not supported yet"))
    (with-temp-buffer
!     (let ((default-directory (or (and (stringp file)
!                                       (file-name-directory
!                                        (setq file (Info-find-file file))))
!                                  default-directory))
!           (sections '(("Top" "Top")))
!           nodes subfiles)
!       (while (or file subfiles)
!         (or file (message "Searching subfile %s..." (car subfiles)))
          (erase-buffer)
!         (info-insert-file-contents (or file (car subfiles)))
          (while (and (search-forward "\n\^_\nFile:" nil 'move)
                      (search-forward "Node: " nil 'move))
            (let ((nodename (substring-no-properties 
(Info-following-node-name)))
--- 1720,1737 ----
    (if (equal file "dir")
        (error "Table of contents for Info directory is not supported yet"))
    (with-temp-buffer
!     (let* ((default-directory (or (and (stringp file)
!                                        (file-name-directory
!                                         (setq file (Info-find-file file))))
!                                   default-directory))
!            (main-file file)
!            (sections '(("Top" "Top")))
!            nodes subfiles)
!       (while (or main-file subfiles)
!         (or main-file (message "Searching subfile %s..." (car subfiles)))
          (erase-buffer)
!         (info-insert-file-contents (or main-file (car subfiles)))
!         (goto-char (point-min))
          (while (and (search-forward "\n\^_\nFile:" nil 'move)
                      (search-forward "Node: " nil 'move))
            (let ((nodename (substring-no-properties 
(Info-following-node-name)))
***************
*** 1718,1724 ****
                                (point-max)) 2))
                  (section "Top")
                  menu-items)
!             (when (and (not (string-match "\\<index\\>" nodename))
                         (re-search-forward "^\\* Menu:" bound t))
                (forward-line 1)
                (beginning-of-line)
--- 1739,1745 ----
                                (point-max)) 2))
                  (section "Top")
                  menu-items)
!             (when (and (not (Info-index-node nodename file))
                         (re-search-forward "^\\* Menu:" bound t))
                (forward-line 1)
                (beginning-of-line)
***************
*** 1750,1756 ****
                                      (nreverse menu-items))
                                nodes))
              (goto-char bound)))
!         (if file
              (save-excursion
                (goto-char (point-min))
                (if (search-forward "\n\^_\nIndirect:" nil t)
--- 1771,1777 ----
                                      (nreverse menu-items))
                                nodes))
              (goto-char bound)))
!         (if main-file
              (save-excursion
                (goto-char (point-min))
                (if (search-forward "\n\^_\nIndirect:" nil t)
***************
*** 1759,1765 ****
                        (setq subfiles (cons (match-string-no-properties 1)
                                             subfiles)))))
                (setq subfiles (nreverse subfiles)
!                     file nil))
            (setq subfiles (cdr subfiles))))
        (message "")
        (nreverse nodes))))
--- 1780,1786 ----
                        (setq subfiles (cons (match-string-no-properties 1)
                                             subfiles)))))
                (setq subfiles (nreverse subfiles)
!                     main-file nil))
            (setq subfiles (cdr subfiles))))
        (message "")
        (nreverse nodes))))
***************
*** 1838,1845 ****
            (if (and (save-excursion
                       (goto-char (+ (point) 5)) ; skip a possible *note
                       (re-search-backward "\\*note[ \n\t]+" nil t)
!                      (looking-at (concat "\\*note[ \n\t]+"
!                                          (Info-following-node-name-re 
"^.,\t"))))
                     (<= (point) (match-end 0)))
                (goto-char (match-beginning 0))))
        ;; Go to the reference closest to point
--- 1859,1865 ----
            (if (and (save-excursion
                       (goto-char (+ (point) 5)) ; skip a possible *note
                       (re-search-backward "\\*note[ \n\t]+" nil t)
!                      (looking-at str))
                     (<= (point) (match-end 0)))
                (goto-char (match-beginning 0))))
        ;; Go to the reference closest to point
***************
*** 1867,1877 ****
  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)
--- 1887,1913 ----
  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 index-node)
    (skip-chars-forward " \t\n")
    (when (looking-at (concat Info-menu-entry-name-re ":\\(:\\|"
                            (Info-following-node-name-re
!                              (cond
!                               (index-node "^,\t\n")
!                               (multi-line "^.,\t")
!                               (t          "^.,\t\n")))
!                             "\\)"
!                             (if index-node
!                                 "\\.\\(?:[ \t\n]+(line +\\([0-9]+\\))\\)?"
!                               "")))
!     (if index-node
!         (setq Info-point-loc
!               (if (match-beginning 5)
!                   (string-to-number (match-string 5))
!                 (buffer-substring (match-beginning 0) (1- (match-beginning 
1)))))
! ;;; Comment out the next line to use names of cross-references:
! ;;;       (setq Info-point-loc
! ;;;             (buffer-substring (match-beginning 0) (1- (match-beginning 
1))))
!       )
      (replace-regexp-in-string
       "[ \n]+" " "
       (or (match-string 2)
***************
*** 1886,1891 ****
--- 1922,1928 ----
  
  (defvar Info-complete-menu-buffer)
  (defvar Info-complete-next-re nil)
+ (defvar Info-complete-nodes nil)
  (defvar Info-complete-cache nil)
  
  (defconst Info-node-spec-re
***************
*** 1899,1904 ****
--- 1936,1944 ----
    ;; - `Info-complete-next-re' which, if non-nil, indicates that we should
    ;; also look for menu items in subsequent nodes as long as those
    ;; nodes' names match `Info-complete-next-re'.  This feature is currently
+   ;; not used.
+   ;; - `Info-complete-nodes' which, if non-nil, indicates that we should
+   ;; also look for menu items in these nodes.  This feature is currently
    ;; only used for completion in Info-index.
  
    ;; Note that `Info-complete-menu-buffer' could be current already,
***************
*** 1922,1927 ****
--- 1962,1968 ----
          (if (and (equal (nth 0 Info-complete-cache) Info-current-file)
                   (equal (nth 1 Info-complete-cache) Info-current-node)
                   (equal (nth 2 Info-complete-cache) Info-complete-next-re)
+                  (equal (nth 5 Info-complete-cache) Info-complete-nodes)
                   (let ((prev (nth 3 Info-complete-cache)))
                     (eq t (compare-strings string 0 (length prev)
                                            prev 0 nil t))))
***************
*** 1934,1942 ****
                    (push (match-string-no-properties 1)
                          completions))
                  ;; Check subsequent nodes if applicable.
!                 (and Info-complete-next-re
!                      (setq nextnode (Info-extract-pointer "next" t))
!                      (string-match Info-complete-next-re nextnode)))
              (Info-goto-node nextnode))
            ;; Go back to the start node (for the next completion).
            (unless (equal Info-current-node orignode)
--- 1975,1986 ----
                    (push (match-string-no-properties 1)
                          completions))
                  ;; Check subsequent nodes if applicable.
!                 (or (and Info-complete-next-re
!                          (setq nextnode (Info-extract-pointer "next" t))
!                          (string-match Info-complete-next-re nextnode))
!                     (and Info-complete-nodes
!                          (setq Info-complete-nodes (cdr Info-complete-nodes)
!                                nextnode (car Info-complete-nodes)))))
              (Info-goto-node nextnode))
            ;; Go back to the start node (for the next completion).
            (unless (equal Info-current-node orignode)
***************
*** 1944,1950 ****
            ;; Update the cache.
            (set (make-local-variable 'Info-complete-cache)
                 (list Info-current-file Info-current-node
!                      Info-complete-next-re string completions)))
          (if action
              (all-completions string completions predicate)
            (try-completion string completions predicate)))))))
--- 1988,1995 ----
            ;; Update the cache.
            (set (make-local-variable 'Info-complete-cache)
                 (list Info-current-file Info-current-node
!                      Info-complete-next-re string completions
!                      Info-complete-nodes)))
          (if action
              (all-completions string completions predicate)
            (try-completion string completions predicate)))))))
***************
*** 2013,2019 ****
            (error "No such item in menu"))
        (beginning-of-line)
        (forward-char 2)
!       (Info-extract-menu-node-name)))))
  
  ;; If COUNT is nil, use the last item in the menu.
  (defun Info-extract-menu-counting (count)
--- 2058,2064 ----
            (error "No such item in menu"))
        (beginning-of-line)
        (forward-char 2)
!       (Info-extract-menu-node-name nil (Info-index-node))))))
  
  ;; If COUNT is nil, use the last item in the menu.
  (defun Info-extract-menu-counting (count)
***************
*** 2028,2034 ****
                (error "Too few items in menu"))
          (while (search-forward "\n* " nil t)
            nil))
!       (Info-extract-menu-node-name)))))
  
  (defun Info-nth-menu-item ()
    "Go to the node of the Nth menu item.
--- 2073,2079 ----
                (error "Too few items in menu"))
          (while (search-forward "\n* " nil t)
            nil))
!       (Info-extract-menu-node-name nil (Info-index-node))))))
  
  (defun Info-nth-menu-item ()
    "Go to the node of the Nth menu item.
***************
*** 2055,2061 ****
      ;; move forward until we can't go any farther.
      (while (Info-forward-node t t) nil)
      ;; Then keep moving down to last subnode, unless we reach an index.
!     (while (and (not (string-match "\\<index\\>" Info-current-node))
                (save-excursion (search-forward "\n* Menu:" nil t)))
        (Info-goto-node (Info-extract-menu-counting nil)))))
  
--- 2100,2106 ----
      ;; move forward until we can't go any farther.
      (while (Info-forward-node t t) nil)
      ;; Then keep moving down to last subnode, unless we reach an index.
!     (while (and (not (Info-index-node))
                (save-excursion (search-forward "\n* Menu:" nil t)))
        (Info-goto-node (Info-extract-menu-counting nil)))))
  
***************
*** 2071,2077 ****
      ;;     3. next node is up and next
      (cond ((and (not not-down)
                (save-excursion (search-forward "\n* menu:" nil t))
!               (not (string-match "\\<index\\>" Info-current-node)))
           (Info-goto-node (Info-extract-menu-counting 1))
           t)
          ((save-excursion (search-backward "next:" nil t))
--- 2116,2122 ----
      ;;     3. next node is up and next
      (cond ((and (not not-down)
                (save-excursion (search-forward "\n* menu:" nil t))
!               (not (Info-index-node)))
           (Info-goto-node (Info-extract-menu-counting 1))
           t)
          ((save-excursion (search-backward "next:" nil t))
***************
*** 2109,2115 ****
           ;; go down to find the last subnode*.
           (Info-prev)
           (let (Info-history)
!            (while (and (not (string-match "\\<index\\>" Info-current-node))
                         (save-excursion (search-forward "\n* Menu:" nil t)))
               (Info-goto-node (Info-extract-menu-counting nil)))))
          (t
--- 2154,2160 ----
           ;; go down to find the last subnode*.
           (Info-prev)
           (let (Info-history)
!            (while (and (not (Info-index-node))
                         (save-excursion (search-forward "\n* Menu:" nil t)))
               (Info-goto-node (Info-extract-menu-counting nil)))))
          (t
***************
*** 2300,2331 ****
        (if recur
            (error "No cross references in this node")
          (Info-prev-reference t)))))
  
  (defun Info-goto-index ()
!   (Info-goto-node "Top")
!   (or (search-forward "\n* menu:" nil t)
!       (error "No index"))
!   (or (re-search-forward "\n\\* \\(.*\\<Index\\>\\)" nil t)
!       (error "No index"))
!   (goto-char (match-beginning 1))
!   ;; Protect Info-history so that the current node (Top) is not added to it.
!   (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
- name contains the word \"Index\", plus any immediately following
- nodes whose names also contain the word \"Index\".
  If there are no exact matches to the specified topic, this chooses
  the first match which is a case-insensitive substring of a topic.
! Use the `,' command to see the other matches.
  Give a blank topic name to go to the Index node itself."
    (interactive
     (list
      (let ((Info-complete-menu-buffer (clone-buffer))
!         (Info-complete-next-re "\\<Index\\>"))
        (if (equal Info-current-file "dir")
          (error "The Info directory node has no index; use m to select a 
manual"))
        (unwind-protect
--- 2345,2468 ----
        (if recur
            (error "No cross references in this node")
          (Info-prev-reference t)))))
+ 
+ (defvar Info-index-nodes nil
+   "Alist of cached index node names of visited Info files.
+ Each element has the form (INFO-FILE INDEX-NODE-NAMES-LIST).")
+ 
+ (defun Info-index-nodes (&optional file)
+   "Return a list of names of all index nodes in Info FILE.
+ If FILE is omitted, it defaults to the current Info file.
+ First look in a list of cached index node names.  Then scan Info
+ file and its subfiles for nodes with the index cookie.  Then try
+ to find index nodes starting from the first node in the top level
+ menu whose name contains the word \"Index\", plus any immediately
+ following nodes whose names also contain the word \"Index\"."
+   (or file (setq file Info-current-file))
+   (or (assoc file Info-index-nodes)
+       ;; Skip virtual Info files
+       (and (member file '("dir" "history" "toc" "apropos"))
+            (setq Info-index-nodes (cons (cons file nil) Info-index-nodes)))
+       (not (stringp file))
+       ;; Find nodes with index cookie
+       (let* ((default-directory (or (and (stringp file)
+                                          (file-name-directory
+                                           (setq file (Info-find-file file))))
+                                     default-directory))
+              Info-history Info-history-list Info-fontify-maximum-menu-size
+              (main-file file) subfiles nodes node)
+         (condition-case nil
+             (with-temp-buffer
+               (while (or main-file subfiles)
+                 (erase-buffer)
+                 (info-insert-file-contents (or main-file (car subfiles)))
+                 (goto-char (point-min))
+                 (while (search-forward "\0\b[index\0\b]" nil 'move)
+                   (save-excursion
+                     (re-search-backward "^\^_")
+                     (search-forward "Node: ")
+                     (setq nodes (cons (Info-following-node-name) nodes))))
+                 (if main-file
+                     (save-excursion
+                       (goto-char (point-min))
+                       (if (search-forward "\n\^_\nIndirect:" nil t)
+                           (let ((bound (save-excursion (search-forward 
"\n\^_" nil t))))
+                             (while (re-search-forward "^\\(.*\\): [0-9]+$" 
bound t)
+                               (setq subfiles (cons 
(match-string-no-properties 1)
+                                                    subfiles)))))
+                       (setq subfiles (nreverse subfiles)
+                             main-file nil))
+                   (setq subfiles (cdr subfiles)))))
+           (error nil))
+         (if nodes
+             (setq nodes (nreverse nodes)
+                   Info-index-nodes (cons (cons file nodes) Info-index-nodes)))
+         nodes)
+       ;; Find nodes with the word "Index" in the node name
+       (let ((case-fold-search t)
+             Info-history Info-history-list Info-fontify-maximum-menu-size
+             nodes node)
+         (condition-case nil
+             (with-temp-buffer
+               (Info-mode)
+               (Info-find-node file "Top")
+               (when (and (search-forward "\n* menu:" nil t)
+                          (re-search-forward "\n\\* \\(.*\\<Index\\>\\)" nil 
t))
+                 (goto-char (match-beginning 1))
+                 (setq nodes (list (Info-extract-menu-node-name)))
+                 (Info-goto-node (car nodes))
+                 (while (and (setq node (Info-extract-pointer "next" t))
+                             (string-match "\\<Index\\>" node))
+                   (setq nodes (cons node nodes))
+                   (Info-goto-node node))))
+           (error nil))
+         (if nodes
+             (setq nodes (nreverse nodes)
+                   Info-index-nodes (cons (cons file nodes) Info-index-nodes)))
+         nodes)
+       ;; If file has no index nodes, still add it to the cache
+       (setq Info-index-nodes (cons (cons file nil) Info-index-nodes)))
+   (cdr (assoc file Info-index-nodes)))
+ 
+ (defun Info-index-node (&optional node file)
+   "Return non-nil value if NODE is an index node.
+ If NODE is nil, check the current Info node.
+ If FILE is nil, check the current Info file."
+   (if (or (and node (not (equal node Info-current-node)))
+           (assoc (or file Info-current-file) Info-index-nodes))
+       (member (or node Info-current-node) (Info-index-nodes file))
+     ;; Don't search all index nodes if request is only for the current node
+     ;; and file is not in the cache of index nodes
+     (or
+      (save-match-data
+        (string-match "\\<Index\\>" (or node Info-current-node "")))
+      (save-excursion
+        (goto-char (+ (or (save-excursion
+                            (search-backward "\n\^_" nil t))
+                          (point-min)) 2))
+        (search-forward "\0\b[index\0\b]"
+                        (or (save-excursion
+                              (search-forward "\n\^_" nil t))
+                            (point-max)) t)))))
  
  (defun Info-goto-index ()
!   "Go to the first index node."
!   (let ((node (car (Info-index-nodes))))
!     (or node (error "No index"))
!     (Info-goto-node node)))
  
  ;;;###autoload
  (defun Info-index (topic)
    "Look up a string TOPIC in the index for this file.
  If there are no exact matches to the specified topic, this chooses
  the first match which is a case-insensitive substring of a topic.
! Use the \\<Info-mode-map>\\[Info-index-next] command to see the other matches.
  Give a blank topic name to go to the Index node itself."
    (interactive
     (list
      (let ((Info-complete-menu-buffer (clone-buffer))
!         (Info-complete-nodes (Info-index-nodes))
!         (Info-history-list nil))
        (if (equal Info-current-file "dir")
          (error "The Info directory node has no index; use m to select a 
manual"))
        (unwind-protect
***************
*** 2336,2344 ****
    (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)
!       (pattern (format "\n\\* +\\([^\n]*%s[^\n]*\\):[ \t]+\\([^.\n]*\\)\\.[ 
\t]*\\([0-9]*\\)"
                         (regexp-quote topic)))
!       node
        (case-fold-search t))
      (Info-goto-index)
      (or (equal topic "")
--- 2473,2482 ----
    (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)
!       (pattern (format "\n\\* +\\([^\n]*%s[^\n]*\\):[ 
\t]+\\([^\n]*\\)\\.\\(?:[ \t\n]*(line +\\([0-9]+\\))\\)?"
                         (regexp-quote topic)))
!       node (nodes (Info-index-nodes))
!       (ohist-list Info-history-list)
        (case-fold-search t))
      (Info-goto-index)
      (or (equal topic "")
***************
*** 2360,2367 ****
                              (string-to-number (concat "0"
                                                        (match-string 3))))
                        matches))
!               (and (setq node (Info-extract-pointer "next" t))
!                    (string-match "\\<Index\\>" node)))
            (Info-goto-node node))
          (or matches
              (progn
--- 2498,2504 ----
                              (string-to-number (concat "0"
                                                        (match-string 3))))
                        matches))
!               (setq nodes (cdr nodes) node (car nodes)))
            (Info-goto-node node))
          (or matches
              (progn
***************
*** 2371,2381 ****
          (while (setq found (assoc topic matches))
            (setq exact (cons found exact)
                  matches (delq found matches)))
          (setq Info-index-alternatives (nconc exact (nreverse matches)))
          (Info-index-next 0)))))
  
  (defun Info-index-next (num)
!   "Go to the next matching index item from the last `i' command."
    (interactive "p")
    (or Info-index-alternatives
        (error "No previous `i' command"))
--- 2508,2519 ----
          (while (setq found (assoc topic matches))
            (setq exact (cons found exact)
                  matches (delq found matches)))
+           (setq Info-history-list ohist-list)
          (setq Info-index-alternatives (nconc exact (nreverse matches)))
          (Info-index-next 0)))))
  
  (defun Info-index-next (num)
!   "Go to the next matching index item from the last 
\\<Info-mode-map>\\[Info-index] command."
    (interactive "p")
    (or Info-index-alternatives
        (error "No previous `i' command"))
***************
*** 2388,2394 ****
          num (1- num)))
    (Info-goto-node (nth 1 (car Info-index-alternatives)))
    (if (> (nth 3 (car Info-index-alternatives)) 0)
!       (forward-line (nth 3 (car Info-index-alternatives)))
      (forward-line 3)                  ; don't search in headers
      (let ((name (car (car Info-index-alternatives))))
        (Info-find-index-name name)))
--- 2526,2532 ----
          num (1- num)))
    (Info-goto-node (nth 1 (car Info-index-alternatives)))
    (if (> (nth 3 (car Info-index-alternatives)) 0)
!       (forward-line (1- (nth 3 (car Info-index-alternatives))))
      (forward-line 3)                  ; don't search in headers
      (let ((name (car (car Info-index-alternatives))))
        (Info-find-index-name name)))
***************
*** 2427,2442 ****
  Build a menu of the possible matches."
    (interactive "sIndex apropos: ")
    (unless (string= string "")
!     (let ((pattern (format "\n\\* +\\([^\n]*%s[^\n]*\\):[ \t]+\\([^.]+\\)."
                           (regexp-quote string)))
          (ohist Info-history)
          (ohist-list Info-history-list)
          (current-node Info-current-node)
          (current-file Info-current-file)
!         manuals matches temp-file node)
!       (let ((Info-fontify-maximum-menu-size 0)
!           Info-use-header-lines
!           Info-hide-note-references)
        (Info-directory)
        (message "Searching indices...")
        (goto-char (point-min))
--- 2565,2578 ----
  Build a menu of the possible matches."
    (interactive "sIndex apropos: ")
    (unless (string= string "")
!     (let ((pattern (format "\n\\* +\\([^\n]*%s[^\n]*\\):[ 
\t]+\\([^\n]+\\)\\.\\(?:[ \t\n]*(line +\\([0-9]+\\))\\)?"
                           (regexp-quote string)))
          (ohist Info-history)
          (ohist-list Info-history-list)
          (current-node Info-current-node)
          (current-file Info-current-file)
!         manuals matches node nodes)
!       (let ((Info-fontify-maximum-menu-size nil))
        (Info-directory)
        (message "Searching indices...")
        (goto-char (point-min))
***************
*** 2445,2468 ****
          (add-to-list 'manuals (match-string 1)))
        (dolist (manual manuals)
          (message "Searching %s" manual)
!         (condition-case nil
!             (save-excursion
!               (Info-find-node manual "Top")
!               (when (re-search-forward "\n\\* \\(.*\\<Index\\>\\)" nil t)
!                 (goto-char (match-beginning 1))
!                 (Info-goto-node (Info-extract-menu-node-name))
!                 (while
!                     (progn
!                       (goto-char (point-min))
!                       (while (re-search-forward pattern nil t)
!                         (add-to-list 'matches
!                                      (list (match-string 1)
!                                            (match-string 2)
!                                            manual)))
!                       (and (setq node (Info-extract-pointer "next" t))
!                            (string-match "\\<Index\\>" node)))
!                   (Info-goto-node node))))
!           (error nil))))
        (Info-goto-node (concat "(" current-file ")" current-node))
        (setq Info-history ohist
            Info-history-list ohist-list)
--- 2581,2602 ----
          (add-to-list 'manuals (match-string 1)))
        (dolist (manual manuals)
          (message "Searching %s" manual)
!         (if (setq nodes (Info-index-nodes (Info-find-file manual)))
!               (condition-case nil
!                   (save-excursion
!                     (Info-find-node manual (car nodes))
!                     (while
!                         (progn
!                           (goto-char (point-min))
!                           (while (re-search-forward pattern nil t)
!                             (add-to-list 'matches
!                                          (list manual
!                                                (match-string-no-properties 1)
!                                                (match-string-no-properties 2)
!                                                (match-string-no-properties 
3))))
!                           (setq nodes (cdr nodes) node (car nodes)))
!                       (Info-goto-node node)))
!                 (error nil)))))
        (Info-goto-node (concat "(" current-file ")" current-node))
        (setq Info-history ohist
            Info-history-list ohist-list)
***************
*** 2471,2482 ****
          (message "No matches found")
        (with-current-buffer (get-buffer-create " *info-apropos*")
          (erase-buffer)
!         (insert "\n\nFile: apropos, Node: Top, Up: (dir)\n")
          (insert "* Menu: \nNodes whose indices contain \"" string "\"\n\n")
          (dolist (entry matches)
!           (insert "* " (car entry) " [" (nth 2 entry)
!                   "]: (" (nth 2 entry) ")" (nth 1 entry) ".\n")))
!       (Info-find-node "apropos" "top")))))
  
  (defun Info-undefined ()
    "Make command be undefined in Info."
--- 2605,2623 ----
          (message "No matches found")
        (with-current-buffer (get-buffer-create " *info-apropos*")
          (erase-buffer)
!         (insert "\n\^_\nFile: apropos, Node: Index, Up: (dir)\n")
          (insert "* Menu: \nNodes whose indices contain \"" string "\"\n\n")
          (dolist (entry matches)
!           (insert
!            (format "* %-38s (%s)%s.%s\n"
!                    (concat (nth 1 entry) " [" (nth 0 entry) "]:")
!                    (nth 0 entry)
!                    (nth 2 entry)
!                    (if (nth 3 entry)
!                        (concat " (line " (nth 3 entry) ")")
!                      "")))))
!       (Info-find-node "apropos" "Index")
!       (setq Info-complete-cache nil)))))
  
  (defun Info-undefined ()
    "Make command be undefined in Info."
***************
*** 2592,2612 ****
        (browse-url (browse-url-url-at-point)))
       ((setq node (Info-get-token (point) "\\*note[ \n\t]+"
                                 "\\*note[ \n\t]+\\([^:]*\\):\\(:\\|[ 
\n\t]*(\\)?"))
- ;;;       (or (match-string 2)
- ;;;           (setq Info-reference-name
- ;;;                 (replace-regexp-in-string
- ;;;                  "[ \n\t]+" " " (match-string-no-properties 1))))
        (Info-follow-reference node fork))
       ;; menu item: node name
       ((setq node (Info-get-token (point) "\\* +" "\\* +\\([^:]*\\)::"))
        (Info-goto-node node fork))
!      ;; menu item: index entry
       ((Info-get-token (point) "\\* +" "\\* +\\(.*\\): ")
-       (if (save-match-data (string-match "\\<index\\>" Info-current-node))
-           (setq Info-reference-name (match-string-no-properties 1)))
        (beginning-of-line)
        (forward-char 2)
!       (setq node (Info-extract-menu-node-name))
        (Info-goto-node node fork))
       ((setq node (Info-get-token (point) "Up: " "Up: \\([^,\n\t]*\\)"))
        (Info-goto-node node fork))
--- 2733,2747 ----
        (browse-url (browse-url-url-at-point)))
       ((setq node (Info-get-token (point) "\\*note[ \n\t]+"
                                 "\\*note[ \n\t]+\\([^:]*\\):\\(:\\|[ 
\n\t]*(\\)?"))
        (Info-follow-reference node fork))
       ;; menu item: node name
       ((setq node (Info-get-token (point) "\\* +" "\\* +\\([^:]*\\)::"))
        (Info-goto-node node fork))
!      ;; menu item: node name or index entry
       ((Info-get-token (point) "\\* +" "\\* +\\(.*\\): ")
        (beginning-of-line)
        (forward-char 2)
!       (setq node (Info-extract-menu-node-name nil (Info-index-node)))
        (Info-goto-node node fork))
       ((setq node (Info-get-token (point) "Up: " "Up: \\([^,\n\t]*\\)"))
        (Info-goto-node node fork))
***************
*** 2654,2669 ****
--- 2789,2809 ----
    (define-key Info-mode-map "h" 'Info-help)
    (define-key Info-mode-map "i" 'Info-index)
    (define-key Info-mode-map "l" 'Info-last)
+   (define-key Info-mode-map "L" 'Info-history)
    (define-key Info-mode-map "m" 'Info-menu)
    (define-key Info-mode-map "n" 'Info-next)
    (define-key Info-mode-map "p" 'Info-prev)
    (define-key Info-mode-map "q" 'Info-exit)
    (define-key Info-mode-map "s" 'Info-search)
+   (define-key Info-mode-map "S" 'Info-search-case-sensitively)
    ;; For consistency with Rmail.
    (define-key Info-mode-map "\M-s" 'Info-search)
    (define-key Info-mode-map "\M-n" 'clone-buffer)
    (define-key Info-mode-map "t" 'Info-top-node)
+   (define-key Info-mode-map "T" 'Info-toc)
    (define-key Info-mode-map "u" 'Info-up)
+   ;; For consistency with dired-copy-filename-as-kill.
+   (define-key Info-mode-map "w" 'Info-copy-current-node-name)
    (define-key Info-mode-map "," 'Info-index-next)
    (define-key Info-mode-map "\177" 'Info-scroll-down)
    (define-key Info-mode-map [mouse-2] 'Info-mouse-follow-nearest-node)
***************
*** 2708,2716 ****
     ["Last" Info-last :active Info-history
      :help "Go to the last node you were at"]
     ["History" Info-history :active Info-history-list
!     :help "Go to the history buffer"]
     ["Table of Contents" Info-toc
!     :help "Go to the buffer with a table of contents"]
     ("Index..."
      ["Lookup a String" Info-index
       :help "Look for a string in the index items"]
--- 2848,2856 ----
     ["Last" Info-last :active Info-history
      :help "Go to the last node you were at"]
     ["History" Info-history :active Info-history-list
!     :help "Go to menu of visited nodes"]
     ["Table of Contents" Info-toc
!     :help "Go to table of contents"]
     ("Index..."
      ["Lookup a String" Info-index
       :help "Look for a string in the index items"]
***************
*** 2808,2827 ****
      (error (ding))))
  
  
! (defun Info-copy-current-node-name ()
    "Put the name of the current info node into the kill ring.
! The name of the info file is prepended to the node name in parentheses."
!   (interactive)
    (unless Info-current-node
      (error "No current info node"))
!   (kill-new
!    (concat "("
!          (file-name-nondirectory
!           (if (stringp Info-current-file)
!               Info-current-file
!             (or buffer-file-name "")))
!          ")"
!          Info-current-node)))
  
  
  ;; Info mode is suitable only for specially formatted data.
--- 2948,2970 ----
      (error (ding))))
  
  
! (defun Info-copy-current-node-name (&optional arg)
    "Put the name of the current info node into the kill ring.
! The name of the info file is prepended to the node name in parentheses.
! With a zero prefix arg, put the name inside a function call to `info'."
!   (interactive "P")
    (unless Info-current-node
      (error "No current info node"))
!   (let ((node (concat "(" (file-name-nondirectory
!                            (or (and (stringp Info-current-file)
!                                     Info-current-file)
!                                buffer-file-name
!                                ""))
!                       ")" Info-current-node)))
!     (if (zerop (prefix-numeric-value arg))
!         (setq node (concat "(info \"" node "\")")))
!     (kill-new node)
!     (message "%s" node)))
  
  
  ;; Info mode is suitable only for specially formatted data.
***************
*** 2852,2865 ****
  \\[Info-directory]    Go to the Info directory node.
  \\[Info-follow-reference]     Follow a cross reference.  Reads name of 
reference.
  \\[Info-last] Move to the last node you were at.
! \\[Info-history]      Go to the history buffer.
! \\[Info-toc]  Go to the buffer with a table of contents.
! \\[Info-index]        Look up a topic in this file's Index and move to that 
node.
! \\[Info-index-next]   (comma) Move to the next match from a previous `i' 
command.
  \\[Info-top-node]     Go to the Top node of this file.
  \\[Info-final-node]   Go to the final node in this file.
  \\[Info-backward-node]        Go backward one node, considering all nodes as 
forming one sequence.
  \\[Info-forward-node] Go forward one node, considering all nodes as forming 
one sequence.
  
  Moving within a node:
  \\[Info-scroll-up]    Normally, scroll forward a full screen.
--- 2995,3009 ----
  \\[Info-directory]    Go to the Info directory node.
  \\[Info-follow-reference]     Follow a cross reference.  Reads name of 
reference.
  \\[Info-last] Move to the last node you were at.
! \\[Info-history]      Go to menu of visited nodes.
! \\[Info-toc]  Go to table of contents of the current Info file.
  \\[Info-top-node]     Go to the Top node of this file.
  \\[Info-final-node]   Go to the final node in this file.
  \\[Info-backward-node]        Go backward one node, considering all nodes as 
forming one sequence.
  \\[Info-forward-node] Go forward one node, considering all nodes as forming 
one sequence.
+ \\[Info-index]        Look up a topic in this file's Index and move to that 
node.
+ \\[Info-index-next]   (comma) Move to the next match from a previous 
\\<Info-mode-map>\\[Info-index] command.
+ \\[info-apropos]      Look for a string in the indices of all manuals.
  
  Moving within a node:
  \\[Info-scroll-up]    Normally, scroll forward a full screen.
***************
*** 2876,2892 ****
  \\[Info-copy-current-node-name]       Put name of current info node in the 
kill ring.
  \\[clone-buffer]      Select a new cloned Info buffer in another window.
  \\[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.
  \\[Info-goto-node]    Move to node specified by name.
          You may include a filename as well, as (FILENAME)NODENAME.
  \\[universal-argument] \\[info]       Move to new Info file with completion.
  \\[Info-search]       Search through this Info file for specified regexp,
          and select the node in which the next occurrence is found.
! \\[Info-search-case-sensitively]      Search through this Info file
!         for specified regexp case-sensitively.
  \\[Info-search-next]  Search for another occurrence of regexp
!         from a previous `Info-search' command.
  \\[Info-next-reference]       Move cursor to next cross-reference or menu 
item.
  \\[Info-prev-reference]       Move cursor to previous cross-reference or menu 
item."
    (kill-all-local-variables)
--- 3020,3036 ----
  \\[Info-copy-current-node-name]       Put name of current info node in the 
kill ring.
  \\[clone-buffer]      Select a new cloned Info buffer in another window.
  \\[Info-edit] Edit contents of selected node.
! 1 .. 9        Pick first ... ninth item in node's menu.
!         Every third `*' is highlighted to help pick the right number.
  \\[Info-goto-node]    Move to node specified by name.
          You may include a filename as well, as (FILENAME)NODENAME.
  \\[universal-argument] \\[info]       Move to new Info file with completion.
+ \\[universal-argument] N \\[info]     Select Info buffer with prefix number 
in the name *info*<N>.
  \\[Info-search]       Search through this Info file for specified regexp,
          and select the node in which the next occurrence is found.
! \\[Info-search-case-sensitively]      Search through this Info file for 
specified regexp case-sensitively.
  \\[Info-search-next]  Search for another occurrence of regexp
!         from a previous \\<Info-mode-map>\\[Info-search] command.
  \\[Info-next-reference]       Move cursor to next cross-reference or menu 
item.
  \\[Info-prev-reference]       Move cursor to previous cross-reference or menu 
item."
    (kill-all-local-variables)
***************
*** 2916,2921 ****
--- 3060,3067 ----
    ;; This is for the sake of the invisible text we use handling titles.
    (make-local-variable 'line-move-ignore-invisible)
    (setq line-move-ignore-invisible t)
+   (make-local-variable 'desktop-save-buffer)
+   (setq desktop-save-buffer 'Info-desktop-buffer-misc-data)
    (add-hook 'clone-buffer-hook 'Info-clone-buffer-hook nil t)
    (add-hook 'change-major-mode-hook 'font-lock-defontify nil t)
    (Info-set-mode-line)
***************
*** 3045,3052 ****
      ;; 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
            (goto-char (point-min))
--- 3191,3199 ----
      ;; Bind Info-history to nil, to prevent the index nodes from
      ;; getting into the node history.
      (let ((Info-history nil)
!           (Info-history-list nil)
!         node (nodes (Info-index-nodes)))
!       (Info-goto-node (car nodes))
        (while
          (progn
            (goto-char (point-min))
***************
*** 3056,3063 ****
                                (match-string-no-properties 2)
                                0)
                          where)))
!           (and (setq node (Info-extract-pointer "next" t))
!                (string-match "\\<Index\\>" node)))
        (Info-goto-node node)))
      where))
  
--- 3203,3209 ----
                                (match-string-no-properties 2)
                                0)
                          where)))
!           (and (setq nodes (cdr nodes) node (car nodes))))
        (Info-goto-node node)))
      where))
  
***************
*** 3080,3092 ****
          ;; Get Info running, and pop to it in another window.
          (save-window-excursion
            (info))
!         ;; FIXME It would be cool if this could use a buffer other
!         ;; than *info*.
!         (pop-to-buffer "*info*")
          ;; Bind Info-history to nil, to prevent the last Index node
          ;; visited by Info-find-emacs-command-nodes from being
          ;; pushed onto the history.
!         (let ((Info-history nil))
            (Info-find-node (car (car where))
                            (car (cdr (car where)))))
          (if (> num-matches 1)
--- 3226,3236 ----
          ;; Get Info running, and pop to it in another window.
          (save-window-excursion
            (info))
!         (or (eq major-mode 'Info-mode) (pop-to-buffer "*info*"))
          ;; Bind Info-history to nil, to prevent the last Index node
          ;; visited by Info-find-emacs-command-nodes from being
          ;; pushed onto the history.
!         (let ((Info-history nil) (Info-history-list nil))
            (Info-find-node (car (car where))
                            (car (cdr (car where)))))
          (if (> num-matches 1)
***************
*** 3122,3147 ****
           (Info-goto-emacs-command-node command)))))
  
  (defface Info-title-1-face
!   '((((type tty pc) (class color)) (:foreground "yellow" :weight bold))
!     (t (:height 1.2 :inherit Info-title-2-face)))
    "Face for Info titles at level 1."
    :group 'info)
  
  (defface Info-title-2-face
!   '((((type tty pc) (class color)) (:foreground "lightblue" :weight bold))
!     (t (:height 1.2 :inherit Info-title-3-face)))
    "Face for Info titles at level 2."
    :group 'info)
  
  (defface Info-title-3-face
!   '((((type tty pc) (class color)) (:weight bold))
!     (t (:height 1.2 :inherit Info-title-4-face)))
    "Face for Info titles at level 3."
    :group 'info)
  
  (defface Info-title-4-face
!   '((((type tty pc) (class color)) (:weight bold))
!     (t (:weight bold :inherit variable-pitch)))
    "Face for Info titles at level 4."
    :group 'info)
  
--- 3266,3291 ----
           (Info-goto-emacs-command-node command)))))
  
  (defface Info-title-1-face
!   '((((type tty pc) (class color)) :foreground "yellow" :weight bold)
!     (t :height 1.2 :inherit Info-title-2-face))
    "Face for Info titles at level 1."
    :group 'info)
  
  (defface Info-title-2-face
!   '((((type tty pc) (class color)) :foreground "lightblue" :weight bold)
!     (t :height 1.2 :inherit Info-title-3-face))
    "Face for Info titles at level 2."
    :group 'info)
  
  (defface Info-title-3-face
!   '((((type tty pc) (class color)) :weight bold)
!     (t :height 1.2 :inherit Info-title-4-face))
    "Face for Info titles at level 3."
    :group 'info)
  
  (defface Info-title-4-face
!   '((((type tty pc) (class color)) :weight bold)
!     (t :weight bold :inherit variable-pitch))
    "Face for Info titles at level 4."
    :group 'info)
  
***************
*** 3360,3366 ****
                                    (hl Info-history-list)
                                    res)
                               (if (string-match "(\\([^)]+\\))\\([^)]*\\)" 
node)
!                                  (setq file (match-string 1 node)
                                         node (if (equal (match-string 2 node) 
"")
                                                  "Top"
                                                (match-string 2 node))))
--- 3504,3511 ----
                                    (hl Info-history-list)
                                    res)
                               (if (string-match "(\\([^)]+\\))\\([^)]*\\)" 
node)
!                                  (setq file (file-name-nondirectory
!                                              (match-string 1 node))
                                         node (if (equal (match-string 2 node) 
"")
                                                  "Top"
                                                (match-string 2 node))))
***************
*** 3377,3390 ****
                  (add-text-properties (match-beginning 3) (match-end 3)
                                       '(invisible t front-sticky nil 
rear-nonsticky t))
                  ;; Unhide the file name of the external reference in parens
!                 (if (match-string 6)
                      (remove-text-properties (match-beginning 6) (match-end 6)
                                              '(invisible t front-sticky nil 
rear-nonsticky t)))
                  ;; Unhide newline because hidden newlines cause too long lines
                  (save-match-data
!                   (let ((start3 (match-beginning 3)))
!                     (if (string-match "\n[ \t]*" (match-string 3))
!                         (remove-text-properties (+ start3 (match-beginning 
0)) (+ start3 (match-end 0))
                                                  '(invisible t front-sticky 
nil rear-nonsticky t))))))
                (when (and Info-refill-paragraphs Info-hide-note-references)
                  (push (set-marker (make-marker) start)
--- 3522,3541 ----
                  (add-text-properties (match-beginning 3) (match-end 3)
                                       '(invisible t front-sticky nil 
rear-nonsticky t))
                  ;; Unhide the file name of the external reference in parens
!                 (if (and (match-string 6) (not (eq Info-hide-note-references 
'hide)))
                      (remove-text-properties (match-beginning 6) (match-end 6)
                                              '(invisible t front-sticky nil 
rear-nonsticky t)))
                  ;; Unhide newline because hidden newlines cause too long lines
                  (save-match-data
!                   (let ((beg3 (match-beginning 3))
!                         (end3 (match-end 3)))
!                     (if (and (string-match "\n[ \t]*" (match-string 3))
!                              (not (save-match-data
!                                     (save-excursion
!                                       (goto-char (1+ end3))
!                                       (looking-at "[.)]*$")))))
!                         (remove-text-properties (+ beg3 (match-beginning 0))
!                                                 (+ beg3 (match-end 0))
                                                  '(invisible t front-sticky 
nil rear-nonsticky t))))))
                (when (and Info-refill-paragraphs Info-hide-note-references)
                  (push (set-marker (make-marker) start)
***************
*** 3416,3422 ****
        (goto-char (point-min))
        (when (and (or not-fontified-p fontify-visited-p)
                   (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)
--- 3567,3573 ----
        (goto-char (point-min))
        (when (and (or not-fontified-p fontify-visited-p)
                   (search-forward "\n* Menu:" nil t)
!                  (not (Info-index-node))
                   ;; Don't take time to annotate huge menus
                   (< (- (point-max) (point)) Info-fontify-maximum-menu-size))
          (let ((n 0)
***************
*** 3454,3460 ****
                                   (hl Info-history-list)
                                   res)
                               (if (string-match "(\\([^)]+\\))\\([^)]*\\)" 
node)
!                                  (setq file (match-string 1 node)
                                         node (if (equal (match-string 2 node) 
"")
                                                  "Top"
                                                (match-string 2 node))))
--- 3605,3612 ----
                                   (hl Info-history-list)
                                   res)
                               (if (string-match "(\\([^)]+\\))\\([^)]*\\)" 
node)
!                                  (setq file (file-name-nondirectory
!                                              (match-string 1 node))
                                         node (if (equal (match-string 2 node) 
"")
                                                  "Top"
                                                (match-string 2 node))))
***************
*** 3502,3507 ****
--- 3654,3666 ----
            (put-text-property (match-beginning 1) (match-end 1)
                               'font-lock-face 'info-menu-header)))
  
+       ;; Hide index line numbers
+       (goto-char (point-min))
+       (when (and not-fontified-p (Info-index-node))
+         (while (re-search-forward "[ \t\n]*(line +[0-9]+)" nil t)
+           (put-text-property (match-beginning 0) (match-end 0)
+                              'invisible t)))
+ 
        ;; Fontify http and ftp references
        (goto-char (point-min))
        (when not-fontified-p
***************
*** 3713,3718 ****
--- 3872,3898 ----
                "^No \".*\" in index$"))
    (add-to-list 'debug-ignored-errors mess))
  
+ ;;;;  Desktop support
+ 
+ (defun Info-desktop-buffer-misc-data (desktop-dirname)
+   "Auxiliary information to be saved in desktop file."
+   (if (not (member Info-current-file '("apropos" "history" "toc")))
+       (list Info-current-file Info-current-node)))
+ 
+ ;;;###autoload
+ (defun Info-restore-desktop-buffer (desktop-buffer-file-name
+                                     desktop-buffer-name
+                                     desktop-buffer-misc)
+   "Restore an info buffer specified in a desktop file."
+   (let ((first (nth 0 desktop-buffer-misc))
+         (second (nth 1 desktop-buffer-misc)))
+   (when (and first second)
+     (when desktop-buffer-name
+       (set-buffer (get-buffer-create desktop-buffer-name))
+       (Info-mode))
+     (Info-find-node first second)
+     (current-buffer))))
+ 
  (provide 'info)
  
  ;;; arch-tag: f2480fe2-2139-40c1-a49b-6314991164ac




reply via email to

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