Mercurial > emacs
changeset 66602:f1d7e489a526
(Info-file-supports-index-cookies): New variable.
(Info-find-node-2): Check makeinfo version for index cookie support.
(Info-index-nodes): Search for nodes with index cookies only when
Info-file-supports-index-cookies is t. Otherwise, search nodes
with "Index" in the node name.
(Info-index-node): Search index cookie in the current node only when
Info-file-supports-index-cookies is t. Otherwise, check the word
"Index" in the node name.
(Info-find-emacs-command-nodes): Remove code that searches nodes
with "Index" node name in the top menu.
author | Juri Linkov <juri@jurta.org> |
---|---|
date | Tue, 01 Nov 2005 09:45:10 +0000 |
parents | 2f18208cd84b |
children | d087393d31cc |
files | lisp/info.el |
diffstat | 1 files changed, 84 insertions(+), 71 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/info.el Tue Nov 01 09:31:26 2005 +0000 +++ b/lisp/info.el Tue Nov 01 09:45:10 2005 +0000 @@ -310,6 +310,9 @@ (defvar Info-current-file-completions nil "Cached completion list for current Info file.") +(defvar Info-file-supports-index-cookies nil + "Non-nil if current Info file supports index cookies.") + (defvar Info-index-alternatives nil "List of possible matches for last `Info-index' command.") @@ -842,6 +845,19 @@ (info-insert-file-contents filename nil) (setq default-directory (file-name-directory filename)))) (set-buffer-modified-p nil) + + ;; Check makeinfo version for index cookie support + (let ((found nil)) + (goto-char (point-min)) + (condition-case () + (if (and (re-search-forward + "makeinfo version \\([0-9]+.[0-9]+\\)" + (line-beginning-position 3) t) + (not (version< (match-string 1) "4.7"))) + (setq found t)) + (error nil)) + (set (make-local-variable 'Info-file-supports-index-cookies) found)) + ;; See whether file has a tag table. Record the location if yes. (goto-char (point-max)) (forward-line -8) @@ -2649,62 +2665,63 @@ (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 Info-file-supports-index-cookies + ;; 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) + ;; Else 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))) @@ -2718,17 +2735,17 @@ (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))))) + (if Info-file-supports-index-cookies + (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)) + (save-match-data + (string-match "\\<Index\\>" (or node Info-current-node "")))))) (defun Info-goto-index () "Go to the first index node." @@ -3504,10 +3521,6 @@ (setq info-file file file-list nil)) (setq file-list (cdr file-list)))))) (Info-find-node info-file "Top") - (or (and (search-forward "\n* menu:" nil t) - (re-search-forward "\n\\* \\(.*\\<Index\\>\\)" nil t)) - (error "Info file `%s' appears to lack an index" info-file)) - (goto-char (match-beginning 1)) ;; Bind Info-history to nil, to prevent the index nodes from ;; getting into the node history. (let ((Info-history nil)