(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)
(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)
(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
;; 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))))))
(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)
(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.
(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
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)))
"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)