]> code.delx.au - gnu-emacs/blobdiff - lisp/info.el
(lm-font-lock-face-O, lm-font-lock-face-X)
[gnu-emacs] / lisp / info.el
index 76abc9043f9176fe1f36957f59343d84eebfe007..16e19c56757bf4c09f0141b766a0f0e0aee507fd 100644 (file)
@@ -259,30 +259,31 @@ Do the right thing if the file has been compressed or zipped."
                       (expand-file-name "info/" installation-directory)))
          alternative)
       (setq Info-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))))))))))
+           (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)
@@ -430,6 +431,76 @@ else defaults to `Top'."
   (set (make-local-variable 'Info-current-file) t)
   (Info-find-node-2 nil nodename))
 
+(defun Info-find-in-tag-table-1 (marker regexp case-fold)
+  "Find a node in a tag table.
+MARKER specifies the buffer and position to start searching at.
+REGEXP is a regular expression matching nodes or references.  Its first
+group should match `Node:' or `Ref:'.
+CASE-FOLD t means search for a case-insensitive match.
+If a match was found, value is a list (FOUND-ANCHOR POS MODE), where
+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)
+    
+      ;; Search tag table
+      (beginning-of-line)
+      (when (re-search-forward regexp nil t)
+       (list (string-equal "Ref:" (match-string 1))
+             (1+ (read (current-buffer)))
+             major-mode)))))
+
+(defun Info-find-in-tag-table (marker regexp)
+  "Find a node in a tag table.
+MARKER specifies the buffer and position to start searching at.
+REGEXP is a regular expression matching nodes or references.  Its first
+group should match `Node:' or `Ref:'.
+If a match was found, value is a list (FOUND-ANCHOR POS MODE), where
+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.
+This function tries to find a case-sensitive match first, then a
+case-insensitive match is tried."
+  (let ((result (Info-find-in-tag-table-1 marker regexp nil)))
+    (when (null (car result))
+      (setq result (Info-find-in-tag-table-1 marker regexp t)))
+    result))
+
+(defun Info-find-node-in-buffer-1 (regexp case-fold)
+  "Find a node or anchor in the current buffer.
+REGEXP is a regular expression matching nodes or references.  Its first
+group should match `Node:' or `Ref:'.
+CASE-FOLD t means search for a case-insensitive match.
+Value is the position at which a match was found, or nil if not found."
+  (let ((case-fold-search case-fold)
+       found)
+    (save-excursion
+      (when (Info-node-at-bob-matching regexp)
+       (setq found (point)))
+      (while (and (not found)
+                 (search-forward "\n\^_" nil t))
+       (forward-line 1)
+       (let ((beg (point)))
+         (forward-line 1)
+         (when (re-search-backward regexp beg t)
+           (beginning-of-line)
+           (setq found (point)))))
+      found)))
+                 
+(defun Info-find-node-in-buffer (regexp)
+  "Find a node or anchor in the current buffer.
+REGEXP is a regular expression matching nodes or references.  Its first
+group should match `Node:' or `Ref:'.
+Value is the position at which a match was found, or nil if not found.
+This function looks for a case-sensitive match first.  If none is found,
+a case-insensitive match is tried."
+  (or (Info-find-node-in-buffer-1 regexp nil)
+      (Info-find-node-in-buffer-1 regexp t)))
+  
 (defun Info-find-node-2 (filename nodename &optional no-going-back)
   (buffer-disable-undo (current-buffer))
   (or (eq major-mode 'Info-mode)
@@ -437,7 +508,6 @@ else defaults to `Top'."
   (widen)
   (setq Info-current-node nil)
   (unwind-protect
-      ;; Bind case-fold-search in case the user sets it to nil.
       (let ((case-fold-search t)
            anchorpos)
         ;; Switch files if necessary
@@ -505,73 +575,49 @@ else defaults to `Top'."
 
           ;; Search file for a suitable node.
          (let ((guesspos (point-min))
-               (regexp
-                (concat "\\(Node:\\|Ref:\\) *\\("
-                        (regexp-quote nodename)
-                        "\\) *[,\t\n\177]"))
+               (regexp (concat "\\(Node:\\|Ref:\\) *\\("
+                               (regexp-quote nodename)
+                               "\\) *[,\t\n\177]"))
                (nodepos nil))
 
            (catch 'foo
+             
              ;; First, search a tag table, if any
-             (if (marker-position Info-tag-table-marker)
-                 (let (found-in-tag-table
-                       found-anchor
-                       found-mode
-                       (m Info-tag-table-marker))
-                   (save-excursion
-                     (set-buffer (marker-buffer m))
-                     (goto-char m)
-                     (beginning-of-line) ; so re-search will work.
-
-                     ;; Search tag table
-                     (setq found-in-tag-table
-                           (re-search-forward regexp nil t)
-                           found-anchor
-                           (string-equal "Ref:" (match-string 1)))
-                     (if found-in-tag-table
-                         (setq guesspos (1+ (read (current-buffer)))))
-                     (setq found-mode major-mode))
-
-                   ;; Indirect file among split files
-                   (if found-in-tag-table
-                       (progn
-                         ;; If this is an indirect file, determine
-                         ;; which file really holds this node and
-                         ;; read it in.
-                         (if (not (eq found-mode 'Info-mode))
-                             ;; Note that the current buffer must be
-                             ;; the *info* buffer on entry to
-                             ;; Info-read-subfile.  Thus the hackery
-                             ;; above.
-                             (setq guesspos (Info-read-subfile guesspos)))))
+             (when (marker-position Info-tag-table-marker)
+               (let* ((m Info-tag-table-marker)
+                      (found (Info-find-in-tag-table m regexp)))
+                 
+                 (when found
+                   ;; FOUND is (ANCHOR POS MODE).
+                   (setq guesspos (nth 1 found))
+                   
+                   ;; If this is an indirect file, determine which
+                   ;; file really holds this node and read it in.
+                   (unless (eq (nth 2 found) 'Info-mode)
+                     ;; Note that the current buffer must be the
+                     ;; *info* buffer on entry to
+                     ;; Info-read-subfile.  Thus the hackery above.
+                     (setq guesspos (Info-read-subfile guesspos)))
 
                    ;; Handle anchor
-                   (if found-anchor
-                       (progn
-                         (goto-char (setq anchorpos guesspos))
-                         (throw 'foo t)))))
+                   (when (nth 0 found)
+                     (goto-char (setq anchorpos guesspos))
+                     (throw 'foo t)))))
 
              ;; Else we may have a node, which we search for:
              (goto-char (max (point-min)
                              (- (byte-to-position guesspos) 1000)))
-             ;; Now search from our advised position
-             ;; (or from beg of buffer)
-             ;; to find the actual node.
-             ;; First, check whether the node is right
-             ;; where we are, in case the buffer begins
-             ;; with a node.
-             (or (Info-node-at-bob-matching regexp)
-                 (while (search-forward "\n\^_" nil t)
-                   (forward-line 1)
-                   (let ((beg (point)))
-                     (forward-line 1)
-                     (if (re-search-backward regexp beg t)
-                         (progn
-                           (beginning-of-line)
-                           (throw 'foo t)))))
-                 (error
-                  "No such anchor in tag table or node in tag table or file: %s"
-                  nodename)))
+             
+             ;; Now search from our advised position (or from beg of
+             ;; buffer) to find the actual node.  First, check
+             ;; whether the node is right where we are, in case the
+             ;; buffer begins with a node.
+             (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 (or anchorpos (point-min))))))
@@ -963,16 +1009,17 @@ If FORK is a string, it is the name to use for the new buffer."
          (setq hl nil))                ;terminate the while at next iter
       (setq hl (cdr hl)))))
 \f
-(defvar Info-last-search nil
-  "Default regexp for \\<Info-mode-map>\\[Info-search] command to search for.")
+(defvar Info-search-history nil
+  "The history list for `Info-search'.")
 
 (defun Info-search (regexp)
   "Search for REGEXP, starting from point, and select node it's found in."
-  (interactive "sSearch (regexp): ")
-  (if transient-mark-mode (deactivate-mark))
-  (if (equal regexp "")
-      (setq regexp Info-last-search)
-    (setq Info-last-search regexp))
+  (interactive (list (read-string "Regexp search: "
+                                 nil 'Info-search-history)))
+  (when transient-mark-mode
+    (deactivate-mark))
+  (when (equal regexp "")
+    (setq regexp (car Info-search-history)))
   (when regexp
     (let ((found ()) current
          (onode Info-current-node)
@@ -1872,37 +1919,38 @@ If no reference to follow, moves to the next node, or up if none."
       (Info-extract-pointer item)
     (error nil)))
 
-(easy-menu-define Info-mode-menu Info-mode-map
-                 "Menu for info files."
-                 '("Info"
-                   ["Up" Info-up (Info-check-pointer "up")
-                    :help "Go up in the Info tree"]
-                   ["Next" Info-next (Info-check-pointer "next")
-                    :help "Go to the next node"]
-                   ["Previous" Info-prev (Info-check-pointer "prev[ious]*")
-                    :help "Go to the previous node"]
-                   ["Backward" Info-backward-node t
-                    :help "Go backward one node, considering all as a sequence"]
-                   ["Forward" Info-forward-node t
-                    :help "Go forward one node, considering all as a sequence"]
-                   ["Top" Info-top-node t
-                    :help "Go to top node of file"]
-                   ["Final node" Info-final-node t
-                    :help "Go to final node in this file"]
-                   ("Menu item" ["You should never see this" report-emacs-bug t])
-                   ("Reference" ["You should never see this" report-emacs-bug t])
-                   ["Search..." Info-search t
-                    :help "Search for regular expression in this Info file"]
-                   ["Goto node..." Info-goto-node t
-                    :help "Go to a named node]"]
-                   ["Last" Info-last Info-history
-                    :help "Go to the last node you were at"]
-                   ("Index..."
-                    ["Lookup a String" Info-index t
-                     :help "Look for a string in the index items"]
-                    ["Next Matching Item" Info-index-next t
-                     :help "Look for another occurrence of previous item"])
-                   ["Exit" Info-exit t]))
+(easy-menu-define
+ Info-mode-menu Info-mode-map
+ "Menu for info files."
+ '("Info"
+   ["Up" Info-up :active (Info-check-pointer "up")
+    :help "Go up in the Info tree"]
+   ["Next" Info-next :active (Info-check-pointer "next")
+    :help "Go to the next node"]
+   ["Previous" Info-prev :active (Info-check-pointer "prev[ious]*")
+    :help "Go to the previous node"]
+   ["Backward" Info-backward-node
+    :help "Go backward one node, considering all as a sequence"]
+   ["Forward" Info-forward-node
+    :help "Go forward one node, considering all as a sequence"]
+   ["Top" Info-top-node
+    :help "Go to top node of file"]
+   ["Final Node" Info-final-node
+    :help "Go to final node in this file"]
+   ("Menu Item" ["You should never see this" report-emacs-bug t])
+   ("Reference" ["You should never see this" report-emacs-bug t])
+   ["Search..." Info-search
+    :help "Search for regular expression in this Info file"]
+   ["Goto Node..." Info-goto-node
+    :help "Go to a named node"]
+   ["Last" Info-last Info-history
+    :help "Go to the last node you were at"]
+   ("Index..."
+    ["Lookup a String" Info-index
+     :help "Look for a string in the index items"]
+    ["Next Matching Item" Info-index-next
+     :help "Look for another occurrence of previous item"])
+   ["Exit" Info-exit t]))
 
 (defvar Info-menu-last-node nil)
 ;; Last node the menu was created for.
@@ -1935,7 +1983,7 @@ If no reference to follow, moves to the next node, or up if none."
              (setq entries (cons ["Other..." Info-menu t] entries)))
          (or entries
              (setq entries (list ["No menu" nil nil])))
-         (easy-menu-change '("Info") "Menu item" (nreverse entries)))
+         (easy-menu-change '("Info") "Menu Item" (nreverse entries)))
        ;; Update reference menu.  Code stolen from `Info-follow-reference'.
        (let ((items nil)
              str i entries current
@@ -2211,7 +2259,7 @@ Interactively, if the binding is `execute-extended-command', a command is read.
 The command is found by looking up in Emacs manual's Command Index
 or in another manual found via COMMAND's `info-file' property or
 the variable `Info-file-list-for-emacs'."
-  (interactive "kFind documentation for key:")
+  (interactive "kFind documentation for key: ")
   (let ((command (key-binding key)))
     (cond ((null command)
           (message "%s is undefined" (key-description key)))
@@ -2237,15 +2285,6 @@ the variable `Info-file-list-for-emacs'."
   "Face for Info titles at level 3."
   :group 'info)
 
-(defcustom Info-title-face-alist
-  '((?* (face (variable-pitch bold) display (height (+ 4))))
-    (?= (face (variable-pitch bold) display (height (+ 3))))
-    (?- (face (variable-pitch bold) display (height (+ 2)))))
-  "*Alist of face or list of faces to use for pseudo-underlined titles.
-The alist key is the character the title is underlined with (?*, ?= or ?-)."
-  :type '(repeat (list character face face))
-  :group 'info)
-
 (defun Info-fontify-node ()
   (save-excursion
     (let ((buffer-read-only nil)