X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/5147931d624ce62d2382398859a06fa1f334fd56..ed571ccb1d14abc788a29c3b3bbf08aa4b951ab8:/lisp/info.el diff --git a/lisp/info.el b/lisp/info.el index 3fa35bb4d0..042ff15836 100644 --- a/lisp/info.el +++ b/lisp/info.el @@ -1,6 +1,6 @@ ;; info.el --- info package for Emacs -;; Copyright (C) 1985-1986, 1992-2011 Free Software Foundation, Inc. +;; Copyright (C) 1985-1986, 1992-2012 Free Software Foundation, Inc. ;; Maintainer: FSF ;; Keywords: help @@ -52,6 +52,15 @@ Each element of the stack is a list (FILENAME NODENAME BUFFERPOS).") "List of all Info nodes user has visited. Each element of the list is a list (FILENAME NODENAME).") +(defcustom Info-history-skip-intermediate-nodes t + "Non-nil means don't record intermediate Info nodes to the history. +Intermediate Info nodes are nodes visited by Info internally in the process of +searching the node to display. Intermediate nodes are not presented +to the user." + :type 'boolean + :group 'info + :version "24.1") + (defcustom Info-enable-edit nil "Non-nil means the \\\\[Info-edit] command in Info can edit the current node. This is convenient if you want to write Info files by hand. @@ -222,6 +231,12 @@ want to set `Info-refill-paragraphs'." (const :tag "Replace tag and hide reference" t) (const :tag "Hide tag and reference" hide) (other :tag "Only replace tag" tag)) + :set (lambda (sym val) + (set sym val) + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (when (eq major-mode 'Info-mode) + (revert-buffer t t))))) :group 'info) (defcustom Info-refill-paragraphs nil @@ -255,7 +270,7 @@ Before leaving the initial Info node, where isearch was started, it fails once with the error message [initial node], and with subsequent C-s/C-r continues through other nodes without failing with this error message in other nodes. When isearch fails for -the rest of the manual, it wraps aroung the whole manual and +the rest of the manual, it wraps around the whole manual and restarts the search from the top/final node depending on search direction. @@ -640,7 +655,8 @@ See a list of available Info commands in `Info-mode'." (read-file-name "Info file name: " nil nil t)) (if (numberp current-prefix-arg) (format "*info*<%s>" current-prefix-arg)))) - (info-setup file-or-node (switch-to-buffer (or buffer "*info*")))) + (info-setup file-or-node + (pop-to-buffer-same-window (or buffer "*info*")))) (defun info-setup (file-or-node buffer) "Display Info node FILE-OR-NODE in BUFFER." @@ -801,10 +817,6 @@ otherwise, that defaults to `Top'." (concat default-directory (buffer-name)))) (Info-find-node-2 nil nodename)) -;; It's perhaps a bit nasty to kill the *info* buffer to force a re-read, -;; but at least it keeps this routine (which is for makeinfo-buffer and -;; Info-revert-buffer-function) out of the way of normal operations. -;; (defun Info-revert-find-node (filename nodename) "Go to an Info node FILENAME and NODENAME, re-reading disk contents. When *info* is already displaying FILENAME and NODENAME, the window position @@ -812,27 +824,23 @@ is preserved, if possible." (or (eq major-mode 'Info-mode) (switch-to-buffer "*info*")) (let ((old-filename Info-current-file) (old-nodename Info-current-node) - (old-buffer-name (buffer-name)) + (window-selected (eq (selected-window) (get-buffer-window))) (pcolumn (current-column)) (pline (count-lines (point-min) (line-beginning-position))) (wline (count-lines (point-min) (window-start))) - (old-history-forward Info-history-forward) - (old-history Info-history) (new-history (and Info-current-file (list Info-current-file Info-current-node (point))))) - (kill-buffer (current-buffer)) - (switch-to-buffer (or old-buffer-name "*info*")) - (Info-mode) + ;; When `Info-current-file' is nil, `Info-find-node-2' rereads the file. + (setq Info-current-file nil) (Info-find-node filename nodename) - (setq Info-history-forward old-history-forward) - (setq Info-history old-history) (if (and (equal old-filename Info-current-file) (equal old-nodename Info-current-node)) (progn ;; note goto-line is no good, we want to measure from point-min - (goto-char (point-min)) - (forward-line wline) - (set-window-start (selected-window) (point)) + (when window-selected + (goto-char (point-min)) + (forward-line wline) + (set-window-start (selected-window) (point))) (goto-char (point-min)) (forward-line pline) (move-to-column pcolumn)) @@ -1077,7 +1085,7 @@ a case-insensitive match is tried." ;; Add anchors to the history too (setq Info-history-list (cons new-history - (delete new-history Info-history-list)))) + (remove new-history Info-history-list)))) (goto-char anchorpos)) ((numberp Info-point-loc) (forward-line (- Info-point-loc 2)) @@ -1157,6 +1165,12 @@ a case-insensitive match is tried." (progn (setq file (expand-file-name "dir.info" truename)) (file-attributes file)) (progn (setq file (expand-file-name "DIR.INFO" truename)) + (file-attributes file)) + ;; Shouldn't really happen, but sometimes does, + ;; eg on Debian systems with buggy packages; + ;; so may as well try it. + ;; http://lists.gnu.org/archive/html/emacs-devel/2012-03/msg00005.html + (progn (setq file (expand-file-name "dir.gz" truename)) (file-attributes file))))) (setq dirs-done (cons truename @@ -1504,7 +1518,7 @@ escaped (\\\",\\\\)." ;; Add a new unique history item to full history list (let ((new-history (list Info-current-file Info-current-node))) (setq Info-history-list - (cons new-history (delete new-history Info-history-list))) + (cons new-history (remove new-history Info-history-list))) (setq Info-history-forward nil)) (if (not (eq Info-fontify-maximum-menu-size nil)) (Info-fontify-node)) @@ -1761,12 +1775,14 @@ If DIRECTION is `backward', search in the reverse direction." ;; If no subfiles, give error now. (if give-up (if (null Info-current-subfile) - (let ((search-spaces-regexp - (if (or (not isearch-mode) isearch-regexp) - Info-search-whitespace-regexp))) - (if backward - (re-search-backward regexp) - (re-search-forward regexp))) + (if isearch-mode + (signal 'search-failed (list regexp "end of manual")) + (let ((search-spaces-regexp + (if (or (not isearch-mode) isearch-regexp) + Info-search-whitespace-regexp))) + (if backward + (re-search-backward regexp) + (re-search-forward regexp)))) (setq found nil))) (if (and bound (not found)) @@ -1836,7 +1852,9 @@ If DIRECTION is `backward', search in the reverse direction." (setq list nil))) (if found (message "") - (signal 'search-failed (list regexp)))) + (signal 'search-failed (if isearch-mode + (list regexp "end of manual") + (list regexp))))) (if (not found) (progn (Info-read-subfile osubfile) (goto-char opoint) @@ -2005,7 +2023,7 @@ Submatch 1 is the complete node name. Submatch 2 if non-nil is the parenthesized file name part of the node name. Submatch 3 is the local part of the node name. End of submatch 0, 1, and 3 are the same, so you can safely concat." - (concat "[ \t]*" ;Skip leading space. + (concat "[ \t\n]*" ;Skip leading space. "\\(\\(([^)]+)\\)?" ;Node name can start with a file name. "\\([" (or allowedchars "^,\t\n") "]*" ;Any number of allowed chars. "[" (or allowedchars "^,\t\n") " ]" ;The last char can't be a space. @@ -2143,7 +2161,7 @@ If SAME-FILE is non-nil, do not move to a different Info file." (insert "Recently Visited Nodes\n") (insert "**********************\n\n") (insert "* Menu:\n\n") - (let ((hl (delete '("*History*" "Top") Info-history-list))) + (let ((hl (remove '("*History*" "Top") Info-history-list))) (while hl (let ((file (nth 0 (car hl))) (node (nth 1 (car hl)))) @@ -2239,7 +2257,7 @@ Table of contents is created from the tree structure of menus." (match-string-no-properties 1))) (section "Top") menu-items) - (when (string-match "(" upnode) (setq upnode nil)) + (when (and upnode (string-match "(" upnode)) (setq upnode nil)) (when (and (not (Info-index-node nodename file)) (re-search-forward "^\\* Menu:" bound t)) (forward-line 1) @@ -2576,7 +2594,9 @@ new buffer." (list item current-prefix-arg)))) ;; there is a problem here in that if several menu items have the same ;; name you can only go to the node of the first with this command. - (Info-goto-node (Info-extract-menu-item menu-item) (if fork menu-item))) + (Info-goto-node (Info-extract-menu-item menu-item) + (and fork + (if (stringp fork) fork menu-item)))) (defun Info-extract-menu-item (menu-item) (setq menu-item (regexp-quote menu-item)) @@ -2668,10 +2688,13 @@ N is the digit argument used to invoke this command." "top"))) (let ((old-node Info-current-node)) (Info-up) - (let (Info-history success) + (let ((old-history Info-history) + success) (unwind-protect (setq success (Info-forward-node t nil no-error)) - (or success (Info-goto-node old-node)))))) + (or success (Info-goto-node old-node))) + (if Info-history-skip-intermediate-nodes + (setq Info-history old-history))))) (no-error nil) (t (error "No pointer forward from this node"))))) @@ -2693,10 +2716,12 @@ N is the digit argument used to invoke this command." ;; If we move back at the same level, ;; go down to find the last subnode*. (Info-prev) - (let (Info-history) + (let ((old-history Info-history)) (while (and (not (Info-index-node)) (save-excursion (search-forward "\n* Menu:" nil t))) - (Info-goto-node (Info-extract-menu-counting nil))))) + (Info-goto-node (Info-extract-menu-counting nil))) + (if Info-history-skip-intermediate-nodes + (setq Info-history old-history)))) (t (error "No pointer backward from this node"))))) @@ -2752,8 +2777,10 @@ N is the digit argument used to invoke this command." ;; Since logically we are done with the node with that menu, ;; move on from it. But don't add intermediate nodes ;; to the history on recursive calls. - (let (Info-history) - (Info-next-preorder))) + (let ((old-history Info-history)) + (Info-next-preorder) + (if Info-history-skip-intermediate-nodes + (setq Info-history old-history)))) (t (error "No more nodes")))) @@ -2767,24 +2794,28 @@ N is the digit argument used to invoke this command." ;; so we can scroll back through it. (goto-char (point-max)))) ;; Keep going down, as long as there are nested menu nodes. - (let (Info-history) ; Don't add intermediate nodes to the history. + (let ((old-history Info-history)) (while (Info-no-error (Info-last-menu-item) ;; If we go down a menu item, go to the end of the node ;; so we can scroll back through it. - (goto-char (point-max))))) + (goto-char (point-max)))) + (if Info-history-skip-intermediate-nodes + (setq Info-history old-history))) (recenter -1)) ((and (Info-no-error (Info-extract-pointer "prev")) (not (equal (Info-extract-pointer "up") (Info-extract-pointer "prev")))) (Info-no-error (Info-prev)) (goto-char (point-max)) - (let (Info-history) ; Don't add intermediate nodes to the history. + (let ((old-history Info-history)) (while (Info-no-error (Info-last-menu-item) ;; If we go down a menu item, go to the end of the node ;; so we can scroll back through it. - (goto-char (point-max))))) + (goto-char (point-max)))) + (if Info-history-skip-intermediate-nodes + (setq Info-history old-history))) (recenter -1)) ((Info-no-error (Info-up t)) (goto-char (point-min)) @@ -3219,7 +3250,7 @@ search results." (Info-index topic) (push (cons (cons Info-current-file topic) Info-index-alternatives) Info-virtual-index-nodes) - ;; Clean up unneccessary side-effects of `Info-index'. + ;; Clean up unnecessary side-effects of `Info-index'. (setq Info-history-list ohist-list) (Info-goto-node orignode) (message ""))) @@ -3307,7 +3338,7 @@ Return a list of matches where each element is in the format (Info-directory) ;; current-node and current-file are nil when they invoke info-apropos ;; as the first Info command, i.e. info-apropos loads info.el. In that - ;; case, we use (DIR)Top instead, to avoid signalling an error after + ;; case, we use (DIR)Top instead, to avoid signaling an error after ;; the search is complete. (when (null current-node) (setq current-file Info-current-file) @@ -3382,7 +3413,7 @@ Build a menu of the possible matches." (declare-function finder-unknown-keywords "finder" ()) (declare-function lm-commentary "lisp-mnt" (&optional file)) (defvar finder-keywords-hash) -(defvar package-alist) ; finder requires package +(defvar package--builtins) ; finder requires package (defun Info-finder-find-node (_filename nodename &optional _no-going-back) "Finder-specific implementation of `Info-find-node-2'." @@ -3396,14 +3427,14 @@ Build a menu of the possible matches." (insert "***************\n\n") (insert "* Menu:\n\n") (dolist (assoc (append '((all . "All package info") - (unknown . "unknown keywords")) + (unknown . "Unknown keywords")) finder-known-keywords)) (let ((keyword (car assoc))) (insert (format "* %s %s.\n" (concat (symbol-name keyword) ": " - "kw:" (symbol-name keyword) ".") + "Keyword " (symbol-name keyword) ".") (cdr assoc)))))) - ((equal nodename "unknown") + ((equal nodename "Keyword unknown") ;; Display unknown keywords (insert (format "\n\^_\nFile: %s, Node: %s, Up: Top\n\n" Info-finder-file nodename)) @@ -3413,24 +3444,29 @@ Build a menu of the possible matches." (mapc (lambda (assoc) (insert (format "* %-14s %s.\n" - (concat (symbol-name (car assoc)) "::") + (concat (symbol-name (car assoc)) ": " + "Keyword " (symbol-name (car assoc)) ".") (cdr assoc)))) (finder-unknown-keywords))) - ((equal nodename "all") + ((equal nodename "Keyword all") ;; Display all package info. (insert (format "\n\^_\nFile: %s, Node: %s, Up: Top\n\n" Info-finder-file nodename)) (insert "Finder Package Info\n") (insert "*******************\n\n") - (dolist (package package-alist) - (insert (format "%s - %s\n" - (format "*Note %s::" (nth 0 package)) - (nth 1 package))))) - ((string-match "\\`kw:" nodename) + (insert "* Menu:\n\n") + (let (desc) + (dolist (package package--builtins) + (setq desc (cdr-safe package)) + (when (vectorp desc) + (insert (format "* %-16s %s.\n" + (concat (symbol-name (car package)) "::") + (aref desc 2))))))) + ((string-match "\\`Keyword " nodename) (setq nodename (substring nodename (match-end 0))) ;; Display packages that match the keyword ;; or the list of keywords separated by comma. - (insert (format "\n\^_\nFile: %s, Node: kw:%s, Up: Top\n\n" + (insert (format "\n\^_\nFile: %s, Node: Keyword %s, Up: Top\n\n" Info-finder-file nodename)) (insert "Finder Packages\n") (insert "***************\n\n") @@ -3442,11 +3478,11 @@ Build a menu of the possible matches." (split-string nodename ",[ \t\n]*" t) (list nodename)))) hits desc) - (dolist (kw keywords) - (push (copy-tree (gethash kw finder-keywords-hash)) hits)) + (dolist (keyword keywords) + (push (copy-tree (gethash keyword finder-keywords-hash)) hits)) (setq hits (delete-dups (apply 'append hits))) (dolist (package hits) - (setq desc (cdr-safe (assq package package-alist))) + (setq desc (cdr-safe (assq package package--builtins))) (when (vectorp desc) (insert (format "* %-16s %s.\n" (concat (symbol-name package) "::") @@ -3678,7 +3714,7 @@ If FORK is non-nil, it is passed to `Info-goto-node'." (define-key map "b" 'beginning-of-buffer) (put 'beginning-of-buffer :advertised-binding "b") (define-key map "d" 'Info-directory) - (define-key map "e" 'Info-edit) + (define-key map "e" 'end-of-buffer) (define-key map "f" 'Info-follow-reference) (define-key map "g" 'Info-goto-node) (define-key map "h" 'Info-help)