X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/ca53db337fe95e923eb0b030999d313e16b100a9..e37c185467272848cccbf794292070ff5402a1bd:/lisp/info.el diff --git a/lisp/info.el b/lisp/info.el index 8aaf7755df..20e031c134 100644 --- a/lisp/info.el +++ b/lisp/info.el @@ -1,7 +1,7 @@ ;;; info.el --- info package for Emacs -;; Copyright (C) 1985,86,92,93,94,95,96,97,98,99,2000,01,02,03,2004 -;; Free Software Foundation, Inc. +;; Copyright (C) 1985, 1986, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +;; 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. ;; Maintainer: FSF ;; Keywords: help @@ -47,6 +47,10 @@ "Stack of info nodes user has visited. Each element of list is a list (FILENAME NODENAME BUFFERPOS).") +(defvar Info-history-forward nil + "Stack of info nodes user has visited with `Info-history-back' command. +Each element of list is a list (FILENAME NODENAME BUFFERPOS).") + (defvar Info-history-list nil "List of all info nodes user has visited. Each element of list is a list (FILENAME NODENAME).") @@ -79,14 +83,18 @@ The Lisp code is executed when the node is selected.") :group 'info) (defface info-xref - '((((class color) (background light)) :foreground "blue" :underline t) + '((((min-colors 88) + (class color) (background light)) :foreground "blue1" :underline t) + (((class color) (background light)) :foreground "blue" :underline t) + (((min-colors 88) + (class color) (background dark)) :foreground "cyan1" :underline t) (((class color) (background dark)) :foreground "cyan" :underline t) (t :underline t)) "Face for Info cross-references." :group 'info) (defface info-xref-visited - '((t :inherit info-xref) + '((default :inherit info-xref) (((class color) (background light)) :foreground "magenta4") (((class color) (background dark)) :foreground "magenta3")) ;"violet"? "Face for visited Info cross-references." @@ -94,7 +102,7 @@ The Lisp code is executed when the node is selected.") (defcustom Info-fontify-visited-nodes t "*Non-nil means to fontify visited nodes in a different face." - :version "21.4" + :version "22.1" :type 'boolean :group 'info) @@ -165,7 +173,7 @@ that you visit a subnode before getting to the end of the menu. Setting this option to nil results in behavior similar to the stand-alone Info reader program, which visits the first subnode from the menu only when you hit the end of the current node." - :version "21.4" + :version "22.1" :type 'boolean :group 'info) @@ -173,7 +181,7 @@ when you hit the end of the current node." "*If non-nil, hide the tag and section reference in *note and * menu items. If value is non-nil but not `hide', also replaces the \"*note\" with \"see\". If value is non-nil but not t or `hide', the reference section is still shown." - :version "21.4" + :version "22.1" :type '(choice (const :tag "No hiding" nil) (const :tag "Replace tag and hide reference" t) (const :tag "Hide tag and reference" hide) @@ -184,11 +192,11 @@ If value is non-nil but not t or `hide', the reference section is still shown." "*If non-nil, attempt to refill paragraphs with hidden references. This refilling may accidentally remove explicit line breaks in the info file, so be prepared for a few surprises if you enable this feature." - :version "21.4" + :version "22.1" :type 'boolean :group 'info) -(defcustom Info-search-whitespace-regexp "\\(?:\\s-+\\)" +(defcustom Info-search-whitespace-regexp "\\s-+" "*If non-nil, regular expression to match a sequence of whitespace chars. This applies to Info search for regular expressions. You might want to use something like \"[ \\t\\r\\n]+\" instead. @@ -197,6 +205,24 @@ a tab, a carriage return (control-M), a newline, and `]+'." :type 'regexp :group 'info) +(defcustom Info-isearch-search t + "*If non-nil, isearch in Info searches through multiple nodes. +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 +restarts the search from the top/final node depending on +search direction. + +Setting this option to nil restores the default isearch behavior +with wrapping around the current Info node." + :version "22.1" + :type 'boolean + :group 'info) + +(defvar Info-isearch-initial-node nil) + (defcustom Info-mode-hook ;; Try to obey obsolete Info-fontify settings. (unless (and (boundp 'Info-fontify) (null Info-fontify)) @@ -489,9 +515,10 @@ in all the directories in that path." ;; since the argument will then be parsed improperly. This also ;; has the added benefit of allowing node names to be included ;; following the parenthesized filename. - (if (and (stringp file) (string-match "(.*)" file)) - (Info-goto-node file) - (Info-goto-node (concat "(" file ")"))) + (Info-goto-node + (if (and (stringp file) (string-match "(.*)" file)) + file + (concat "(" file ")"))) (if (zerop (buffer-size)) (Info-directory)))) @@ -610,13 +637,13 @@ NO-GOING-BACK is non-nil if recovering from an error in this function; it says do not attempt further (recursive) error recovery." (info-initialize) (setq filename (Info-find-file filename)) + ;; Go into info buffer. + (or (eq major-mode 'Info-mode) (pop-to-buffer "*info*")) ;; Record the node we are leaving. (if (and Info-current-file (not no-going-back)) (setq Info-history (cons (list Info-current-file Info-current-node (point)) Info-history))) - ;; Go into info buffer. - (or (eq major-mode 'Info-mode) (pop-to-buffer "*info*")) (Info-find-node-2 filename nodename no-going-back)) (defun Info-on-current-buffer (&optional nodename) @@ -657,10 +684,10 @@ is preserved, if possible." (equal old-nodename Info-current-node)) (progn ;; note goto-line is no good, we want to measure from point-min - (beginning-of-buffer) + (goto-char (point-min)) (forward-line wline) (set-window-start (selected-window) (point)) - (beginning-of-buffer) + (goto-char (point-min)) (forward-line pline) (move-to-column pcolumn)) ;; only add to the history when coming from a different file+node @@ -1245,7 +1272,7 @@ any double quotes or backslashes must be escaped (\\\",\\\\)." ;; Hide any construct of the general form ^@[^@-^_][ ... ^@[^@-^_]], ;; including one optional trailing newline. (defun Info-hide-cookies-node () - "Hide unrecognised cookies in current node." + "Hide unrecognized cookies in current node." (save-excursion (let ((inhibit-read-only t) (case-fold-search t)) @@ -1295,7 +1322,8 @@ any double quotes or backslashes must be 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 (delete new-history Info-history-list))) + (setq Info-history-forward nil)) (if (not (eq Info-fontify-maximum-menu-size nil)) (Info-fontify-node)) (Info-display-images-node) @@ -1317,7 +1345,9 @@ any double quotes or backslashes must be escaped (\\\",\\\\)." ;; Go to an info node specified with a filename-and-nodename string ;; of the sort that is found in pointers in nodes. -;;;###autoload +;; Don't autoload this function: the correct entry point for other packages +;; to use is `info'. --Stef +;; ;;;###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 @@ -1349,6 +1379,43 @@ If FORK is a string, it is the name to use for the new buffer." (defvar Info-read-node-completion-table) +(defun Info-read-node-name-2 (string path-and-suffixes action) + "Virtual completion table for file names input in Info node names. +PATH-AND-SUFFIXES is a pair of lists, (DIRECTORIES . SUFFIXES)." + (let* ((names nil) + (suffixes (remove "" (cdr path-and-suffixes))) + (suffix (concat (regexp-opt suffixes t) "\\'")) + (string-dir (file-name-directory string)) + (dirs + (if (file-name-absolute-p string) + (list (file-name-directory string)) + (car path-and-suffixes)))) + (dolist (dir dirs) + (unless dir + (setq dir default-directory)) + (if string-dir (setq dir (expand-file-name string-dir dir))) + (when (file-directory-p dir) + (dolist (file (file-name-all-completions + (file-name-nondirectory string) dir)) + ;; If the file name has no suffix or a standard suffix, + ;; include it. + (and (or (null (file-name-extension file)) + (string-match suffix file)) + ;; But exclude subfiles of split info files. + (not (string-match "-[0-9]+\\'" file)) + ;; And exclude backup files. + (not (string-match "~\\'" file)) + (push (if string-dir (concat string-dir file) file) names)) + ;; If the file name ends in a standard suffix, + ;; add the unsuffixed name as a completion option. + (when (string-match suffix file) + (setq file (substring file 0 (match-beginning 0))) + (push (if string-dir (concat string-dir file) file) names))))) + (cond + ((eq action t) (all-completions string names)) + ((null action) (try-completion string names)) + (t (test-completion string names))))) + ;; This function is used as the "completion table" while reading a node name. ;; It does completion using the alist in Info-read-node-completion-table ;; unless STRING starts with an open-paren. @@ -1359,15 +1426,16 @@ If FORK is a string, it is the name to use for the new buffer." (let ((file (substring string 1))) (cond ((eq code nil) - (let ((comp (try-completion file 'locate-file-completion + (let ((comp (try-completion file 'Info-read-node-name-2 (cons Info-directory-list (mapcar 'car Info-suffix-list))))) (cond ((eq comp t) (concat string ")")) (comp (concat "(" comp))))) - ((eq code t) (all-completions file 'locate-file-completion - (cons Info-directory-list - (mapcar 'car Info-suffix-list)))) + ((eq code t) + (all-completions file 'Info-read-node-name-2 + (cons Info-directory-list + (mapcar 'car Info-suffix-list)))) (t nil)))) ;; If a file name was given, then any node is fair game. ((string-match "\\`(" string) @@ -1383,6 +1451,10 @@ If FORK is a string, it is the name to use for the new buffer." (t (test-completion string Info-read-node-completion-table predicate)))) +;; Arrange to highlight the proper letters in the completion list buffer. +(put 'Info-read-node-name-1 'completion-base-size-function + (lambda () 1)) + (defun Info-read-node-name (prompt &optional default) (let* ((completion-ignore-case t) (Info-read-node-completion-table (Info-build-node-completions)) @@ -1468,10 +1540,6 @@ If DIRECTION is `backward', search in the reverse direction." (opoint-max (point-max)) (ostart (window-start)) (osubfile Info-current-subfile)) - (when Info-search-whitespace-regexp - (setq regexp - (mapconcat 'identity (split-string regexp "[ \t\n]+") - Info-search-whitespace-regexp))) (setq Info-search-case-fold case-fold-search) (save-excursion (save-restriction @@ -1484,27 +1552,46 @@ If DIRECTION is `backward', search in the reverse direction." (1- (point))) (point-max))) (while (and (not give-up) - (or (null found) - (if backward - (isearch-range-invisible found beg-found) - (isearch-range-invisible beg-found found)) - ;; Skip node header line - (save-excursion (forward-line -1) - (looking-at "\^_")))) - (if (if backward - (re-search-backward regexp bound t) - (re-search-forward regexp bound t)) - (setq found (point) beg-found (if backward (match-end 0) - (match-beginning 0))) - (setq give-up t))))) + (save-match-data + (or (null found) + (if backward + (isearch-range-invisible found beg-found) + (isearch-range-invisible beg-found found)) + ;; Skip node header line + (and (save-excursion (forward-line -1) + (looking-at "\^_")) + (forward-line (if backward -1 1))) + ;; Skip Tag Table node + (save-excursion + (and (search-backward "\^_" nil t) + (looking-at "\^_\nTag Table")))))) + (let ((search-spaces-regexp Info-search-whitespace-regexp)) + (if (if backward + (re-search-backward regexp bound t) + (re-search-forward regexp bound t)) + (setq found (point) beg-found (if backward (match-end 0) + (match-beginning 0))) + (setq give-up t)))))) + + (when (and isearch-mode Info-isearch-search + (not Info-isearch-initial-node) + (not bound) + (or give-up (and found (not (and (> found opoint-min) + (< found opoint-max)))))) + (signal 'search-failed (list regexp "initial node"))) + ;; If no subfiles, give error now. (if give-up (if (null Info-current-subfile) - (if backward - (re-search-backward regexp) - (re-search-forward regexp)) + (let ((search-spaces-regexp Info-search-whitespace-regexp)) + (if backward + (re-search-backward regexp) + (re-search-forward regexp))) (setq found nil))) + (if (and bound (not found)) + (signal 'search-failed (list regexp))) + (unless (or found bound) (unwind-protect ;; Try other subfiles. @@ -1522,6 +1609,7 @@ If DIRECTION is `backward', search in the reverse direction." (search-forward (concat "\n" osubfile ": ")) ;; Skip that one. (forward-line (if backward 0 1)) + (if backward (forward-char -1)) ;; Make a list of all following subfiles. ;; Each elt has the form (VIRT-POSITION . SUBFILENAME). (while (not (if backward (bobp) (eobp))) @@ -1552,19 +1640,26 @@ If DIRECTION is `backward', search in the reverse direction." (setq list (cdr list)) (setq give-up nil found nil) (while (and (not give-up) - (or (null found) - (if backward - (isearch-range-invisible found beg-found) - (isearch-range-invisible beg-found found)) - ;; Skip node header line - (save-excursion (forward-line -1) - (looking-at "\^_")))) - (if (if backward - (re-search-backward regexp nil t) - (re-search-forward regexp nil t)) - (setq found (point) beg-found (if backward (match-end 0) - (match-beginning 0))) - (setq give-up t))) + (save-match-data + (or (null found) + (if backward + (isearch-range-invisible found beg-found) + (isearch-range-invisible beg-found found)) + ;; Skip node header line + (and (save-excursion (forward-line -1) + (looking-at "\^_")) + (forward-line (if backward -1 1))) + ;; Skip Tag Table node + (save-excursion + (and (search-backward "\^_" nil t) + (looking-at "\^_\nTag Table")))))) + (let ((search-spaces-regexp Info-search-whitespace-regexp)) + (if (if backward + (re-search-backward regexp nil t) + (re-search-forward regexp nil t)) + (setq found (point) beg-found (if backward (match-end 0) + (match-beginning 0))) + (setq give-up t)))) (if give-up (setq found nil)) (if found @@ -1590,7 +1685,8 @@ If DIRECTION is `backward', search in the reverse direction." ;; Use string-equal, not equal, to ignore text props. (or (and (string-equal onode Info-current-node) (equal ofile Info-current-file)) - (and isearch-mode isearch-wrapped (eq opoint opoint-min)) + (and isearch-mode isearch-wrapped + (eq opoint (if isearch-forward opoint-min opoint-max))) (setq Info-history (cons (list ofile onode opoint) Info-history)))))) @@ -1621,23 +1717,30 @@ If DIRECTION is `backward', search in the reverse direction." (Info-search regexp bound noerror count 'backward)) (defun Info-isearch-search () - (cond - (isearch-word - (if isearch-forward 'word-search-forward 'word-search-backward)) - (isearch-regexp - (lambda (regexp bound noerror) - (condition-case nil - (progn - (Info-search regexp bound noerror nil - (unless isearch-forward 'backward)) - (point)) - (error nil)))) - (t - (if isearch-forward 'search-forward 'search-backward)))) + (if Info-isearch-search + (lambda (string &optional bound noerror count) + (if isearch-word + (Info-search (concat "\\b" (replace-regexp-in-string + "\\W+" "\\\\W+" + (replace-regexp-in-string + "^\\W+\\|\\W+$" "" string)) "\\b") + bound noerror count + (unless isearch-forward 'backward)) + (Info-search (if isearch-regexp string (regexp-quote string)) + bound noerror count + (unless isearch-forward 'backward)) + (point))) + (let ((isearch-search-fun-function nil)) + (isearch-search-fun)))) (defun Info-isearch-wrap () - (if isearch-regexp - (if isearch-forward (Info-top-node) (Info-final-node)) + (if Info-isearch-search + (if Info-isearch-initial-node + (progn + (if isearch-forward (Info-top-node) (Info-final-node)) + (goto-char (if isearch-forward (point-min) (point-max)))) + (setq Info-isearch-initial-node Info-current-node) + (setq isearch-wrapped nil)) (goto-char (if isearch-forward (point-min) (point-max))))) (defun Info-isearch-push-state () @@ -1649,6 +1752,8 @@ If DIRECTION is `backward', search in the reverse direction." (string= Info-current-node node)) (progn (Info-find-node file node) (sit-for 0)))) +(defun Info-isearch-start () + (setq Info-isearch-initial-node nil)) (defun Info-extract-pointer (name &optional errorname) "Extract the value of the node-pointer named NAME. @@ -1720,18 +1825,38 @@ If SAME-FILE is non-nil, do not move to a different Info file." (goto-char p) (Info-restore-point Info-history)))) -(defun Info-last () - "Go back to the last node visited." +(defun Info-history-back () + "Go back in the history to the last node visited." (interactive) (or Info-history (error "This is the first Info node you looked at")) - (let (filename nodename opoint) + (let ((history-forward + (cons (list Info-current-file Info-current-node (point)) + Info-history-forward)) + filename nodename opoint) (setq filename (car (car Info-history))) (setq nodename (car (cdr (car Info-history)))) (setq opoint (car (cdr (cdr (car Info-history))))) (setq Info-history (cdr Info-history)) (Info-find-node filename nodename) (setq Info-history (cdr Info-history)) + (setq Info-history-forward history-forward) + (goto-char opoint))) + +(defalias 'Info-last 'Info-history-back) + +(defun Info-history-forward () + "Go forward in the history of visited nodes." + (interactive) + (or Info-history-forward + (error "This is the last Info node you looked at")) + (let ((history-forward (cdr Info-history-forward)) + filename nodename opoint) + (setq filename (car (car Info-history-forward))) + (setq nodename (car (cdr (car Info-history-forward)))) + (setq opoint (car (cdr (cdr (car Info-history-forward))))) + (Info-find-node filename nodename) + (setq Info-history-forward history-forward) (goto-char opoint))) ;;;###autoload @@ -2823,8 +2948,7 @@ if point is in a menu item description, follow that menu item." "Follow a node reference near point. Return non-nil if successful." (let (node) (cond - ((and (Info-get-token (point) "[hf]t?tp://" "[hf]t?tp://\\([^ \t\n\"`({<>})']+\\)") - (or (featurep 'browse-url) (require 'browse-url nil t))) + ((Info-get-token (point) "[hf]t?tp://" "[hf]t?tp://\\([^ \t\n\"`({<>})']+\\)") (setq node t) (browse-url (browse-url-url-at-point))) ((setq node (Info-get-token (point) "\\*note[ \n\t]+" @@ -2884,12 +3008,13 @@ if point is in a menu item description, follow that menu item." (define-key Info-mode-map "g" 'Info-goto-node) (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-back) (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 "r" 'Info-history-forward) (define-key Info-mode-map "s" 'Info-search) (define-key Info-mode-map "S" 'Info-search-case-sensitively) ;; For consistency with Rmail. @@ -2903,6 +3028,7 @@ if point is in a menu item description, follow that menu item." (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) + (define-key Info-mode-map [follow-link] 'mouse-face) ) (defun Info-check-pointer (item) @@ -2941,18 +3067,20 @@ if point is in a menu item description, follow that menu item." :help "Search for another occurrence of regular expression"] ["Go to Node..." Info-goto-node :help "Go to a named node"] - ["Last" Info-last :active Info-history - :help "Go to the last node you were at"] + ["Back in history" Info-history-back :active Info-history + :help "Go back in history to the last node you were at"] + ["Forward in history" Info-history-forward :active Info-history-forward + :help "Go forward in history"] ["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 + ("Index" + ["Lookup a String..." Info-index :help "Look for a string in the index items"] - ["Next Matching Item" Info-index-next + ["Next Matching Item" Info-index-next :active Info-index-alternatives :help "Look for another occurrence of previous item"] - ["Lookup a string in all indices" info-apropos + ["Lookup a string in all indices..." info-apropos :help "Look for a string in the indices of all manuals"]) ["Edit" Info-edit :help "Edit contents of this node" :active Info-enable-edit] @@ -2970,7 +3098,8 @@ if point is in a menu item description, follow that menu item." (tool-bar-local-item-from-menu 'Info-prev "left_arrow" map Info-mode-map) (tool-bar-local-item-from-menu 'Info-next "right_arrow" map Info-mode-map) (tool-bar-local-item-from-menu 'Info-up "up_arrow" map Info-mode-map) - (tool-bar-local-item-from-menu 'Info-last "undo" map Info-mode-map) + (tool-bar-local-item-from-menu 'Info-history-back "back_arrow" map Info-mode-map) + (tool-bar-local-item-from-menu 'Info-history-forward "fwd_arrow" map Info-mode-map) (tool-bar-local-item-from-menu 'Info-top-node "home" map Info-mode-map) (tool-bar-local-item-from-menu 'Info-index "index" map Info-mode-map) (tool-bar-local-item-from-menu 'Info-goto-node "jump_to" map Info-mode-map) @@ -3090,7 +3219,8 @@ Selecting other nodes: Picking a menu item causes another node to be selected. \\[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-back] Move back in history to the last node you were at. +\\[Info-history-forward] Move forward in history to the node you returned from after using \\[Info-history-back]. \\[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. @@ -3147,6 +3277,7 @@ Advanced commands: (make-local-variable 'Info-tag-table-buffer) (setq Info-tag-table-buffer nil) (make-local-variable 'Info-history) + (make-local-variable 'Info-history-forward) (make-local-variable 'Info-index-alternatives) (setq header-line-format (if Info-use-header-line @@ -3157,9 +3288,13 @@ Advanced commands: (make-local-variable 'line-move-ignore-invisible) (setq line-move-ignore-invisible t) (make-local-variable 'desktop-save-buffer) + (make-local-variable 'widen-automatically) + (setq widen-automatically nil) (setq desktop-save-buffer 'Info-desktop-buffer-misc-data) + (add-hook 'kill-buffer-hook 'Info-kill-buffer nil t) (add-hook 'clone-buffer-hook 'Info-clone-buffer-hook nil t) (add-hook 'change-major-mode-hook 'font-lock-defontify nil t) + (add-hook 'isearch-mode-hook 'Info-isearch-start nil t) (set (make-local-variable 'isearch-search-fun-function) 'Info-isearch-search) (set (make-local-variable 'isearch-wrap-function) @@ -3169,7 +3304,14 @@ Advanced commands: (set (make-local-variable 'search-whitespace-regexp) Info-search-whitespace-regexp) (Info-set-mode-line) - (run-hooks 'Info-mode-hook)) + (run-mode-hooks 'Info-mode-hook)) + +;; When an Info buffer is killed, make sure the associated tags buffer +;; is killed too. +(defun Info-kill-buffer () + (and (eq major-mode 'Info-mode) + Info-tag-table-buffer + (kill-buffer Info-tag-table-buffer))) (defun Info-clone-buffer-hook () (when (bufferp Info-tag-table-buffer) @@ -3204,7 +3346,7 @@ which returns to Info mode for browsing. (setq buffer-read-only nil) (force-mode-line-update) (buffer-enable-undo (current-buffer)) - (run-hooks 'Info-edit-mode-hook)) + (run-mode-hooks 'Info-edit-mode-hook)) (defun Info-edit () "Edit the contents of this Info node. @@ -3358,7 +3500,7 @@ COMMAND must be a symbol or string." (message "Found %d other entr%s. Use %s to see %s." (1- num-matches) (if (> num-matches 2) "ies" "y") - (substitute-command-keys "\\[Info-last]") + (substitute-command-keys "\\[Info-history-back]") (if (> num-matches 2) "them" "it"))))) (error "Couldn't find documentation for %s" command)))) @@ -3382,29 +3524,37 @@ the variable `Info-file-list-for-emacs'." (t (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." +(defface info-title-1 + '((((type tty pc) (class color)) :foreground "green" :weight bold) + (t :height 1.2 :inherit info-title-2)) + "Face for info titles at level 1." :group 'info) +;; backward-compatibility alias +(put 'Info-title-1-face 'face-alias 'info-title-1) -(defface Info-title-2-face +(defface info-title-2 '((((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." + (t :height 1.2 :inherit info-title-3)) + "Face for info titles at level 2." :group 'info) +;; backward-compatibility alias +(put 'Info-title-2-face 'face-alias 'info-title-2) -(defface Info-title-3-face +(defface info-title-3 '((((type tty pc) (class color)) :weight bold) - (t :height 1.2 :inherit Info-title-4-face)) - "Face for Info titles at level 3." + (t :height 1.2 :inherit info-title-4)) + "Face for info titles at level 3." :group 'info) +;; backward-compatibility alias +(put 'Info-title-3-face 'face-alias 'info-title-3) -(defface Info-title-4-face +(defface info-title-4 '((((type tty pc) (class color)) :weight bold) (t :weight bold :inherit variable-pitch)) - "Face for Info titles at level 4." + "Face for info titles at level 4." :group 'info) +;; backward-compatibility alias +(put 'Info-title-4-face 'face-alias 'info-title-4) (defface info-menu-header '((((type tty pc)) @@ -3443,6 +3593,7 @@ Preserve text properties." (define-key keymap [header-line mouse-2] 'Info-next) (define-key keymap [header-line down-mouse-1] 'ignore) (define-key keymap [mouse-2] 'Info-next) + (define-key keymap [follow-link] 'mouse-face) keymap) "Keymap to put on the Next link in the text or the header line.") @@ -3452,6 +3603,7 @@ Preserve text properties." (define-key keymap [header-line mouse-2] 'Info-prev) (define-key keymap [header-line down-mouse-1] 'ignore) (define-key keymap [mouse-2] 'Info-prev) + (define-key keymap [follow-link] 'mouse-face) keymap) "Keymap to put on the Prev link in the text or the header line.") @@ -3462,6 +3614,7 @@ Preserve text properties." (define-key keymap [header-line mouse-2] 'Info-up) (define-key keymap [header-line down-mouse-1] 'ignore) (define-key keymap [mouse-2] 'Info-up) + (define-key keymap [follow-link] 'mouse-face) keymap) "Keymap to put on the Up link in the text or the header line.") @@ -3496,7 +3649,7 @@ Preserve text properties." (put-text-property tbeg nend 'mouse-face 'highlight) (put-text-property tbeg nend 'help-echo - (concat "Go to node " + (concat "mouse-2: Go to node " (buffer-substring nbeg nend))) ;; Always set up the text property keymap. ;; It will either be used in the buffer @@ -3537,14 +3690,14 @@ Preserve text properties." ;; Fontify titles (goto-char (point-min)) (when not-fontified-p - (while (re-search-forward "\n\\([^ \t\n].+\\)\n\\(\\*+\\|=+\\|-+\\|\\.+\\)$" + (while (re-search-forward "\n\\([^ \t\n].+\\)\n\\(\\*\\*+\\|==+\\|--+\\|\\.\\.+\\)$" nil t) (let* ((c (preceding-char)) (face - (cond ((= c ?*) 'Info-title-1-face) - ((= c ?=) 'Info-title-2-face) - ((= c ?-) 'Info-title-3-face) - (t 'Info-title-4-face)))) + (cond ((= c ?*) 'info-title-1) + ((= c ?=) 'info-title-2) + ((= c ?-) 'info-title-3) + (t 'info-title-4)))) (put-text-property (match-beginning 1) (match-end 1) 'font-lock-face face)) ;; This is a serious problem for trying to handle multiple @@ -3701,76 +3854,78 @@ Preserve text properties." (let ((n 0) cont) (while (re-search-forward - (concat "^\\* +\\(" Info-menu-entry-name-re "\\)\\(:" - Info-node-spec-re "\\([ \t]*\\)\\)") + (concat "^\\* Menu:\\|\\(?:^\\* +\\(" Info-menu-entry-name-re "\\)\\(:" + Info-node-spec-re "\\([ \t]*\\)\\)\\)") nil t) - (when not-fontified-p - (setq n (1+ n)) - (if (and (<= n 9) (zerop (% n 3))) ; visual aids to help with 1-9 keys - (put-text-property (match-beginning 0) - (1+ (match-beginning 0)) - 'font-lock-face 'info-menu-5))) - (when not-fontified-p - (add-text-properties - (match-beginning 1) (match-end 1) - (list - 'help-echo (if (match-end 3) - (concat "mouse-2: go to " (match-string 3)) - "mouse-2: go to this node") - 'mouse-face 'highlight))) - (when (or not-fontified-p fontify-visited-p) - (add-text-properties - (match-beginning 1) (match-end 1) - (list - 'font-lock-face - ;; Display visited menu items in a different face - (if (and Info-fontify-visited-nodes - (save-match-data - (let ((node (if (equal (match-string 3) "") - (match-string 1) - (match-string 3))) - (file (file-name-nondirectory Info-current-file)) - (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)))) - (while hl - (if (and (string-equal node (nth 1 (car hl))) - (string-equal file - (file-name-nondirectory - (nth 0 (car hl))))) - (setq res (car hl) hl nil) - (setq hl (cdr hl)))) - res))) 'info-xref-visited 'info-xref)))) - (when (and not-fontified-p (memq Info-hide-note-references '(t hide))) - (put-text-property (match-beginning 2) (1- (match-end 6)) - 'invisible t) - ;; Unhide the file name in parens - (if (and (match-end 4) (not (eq (char-after (match-end 4)) ?.))) - (remove-text-properties (match-beginning 4) (match-end 4) - '(invisible t))) - ;; We need a stretchable space like :align-to but with - ;; a minimum value. - (put-text-property (1- (match-end 6)) (match-end 6) 'display - (if (>= 22 (- (match-end 1) - (match-beginning 0))) - '(space :align-to 24) - '(space :width 2))) - (setq cont (looking-at ".")) - (while (and (= (forward-line 1) 0) - (looking-at "\\([ \t]+\\)[^*\n]")) - (put-text-property (match-beginning 1) (1- (match-end 1)) - 'invisible t) - (put-text-property (1- (match-end 1)) (match-end 1) - 'display - (if cont - '(space :align-to 26) - '(space :align-to 24))) - (setq cont t)))))) + (when (match-beginning 1) + (when not-fontified-p + (setq n (1+ n)) + (if (and (<= n 9) (zerop (% n 3))) ; visual aids to help with 1-9 keys + (put-text-property (match-beginning 0) + (1+ (match-beginning 0)) + 'font-lock-face 'info-menu-5))) + (when not-fontified-p + (add-text-properties + (match-beginning 1) (match-end 1) + (list + 'help-echo (if (and (match-end 3) + (not (equal (match-string 3) ""))) + (concat "mouse-2: go to " (match-string 3)) + "mouse-2: go to this node") + 'mouse-face 'highlight))) + (when (or not-fontified-p fontify-visited-p) + (add-text-properties + (match-beginning 1) (match-end 1) + (list + 'font-lock-face + ;; Display visited menu items in a different face + (if (and Info-fontify-visited-nodes + (save-match-data + (let ((node (if (equal (match-string 3) "") + (match-string 1) + (match-string 3))) + (file (file-name-nondirectory Info-current-file)) + (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)))) + (while hl + (if (and (string-equal node (nth 1 (car hl))) + (string-equal file + (file-name-nondirectory + (nth 0 (car hl))))) + (setq res (car hl) hl nil) + (setq hl (cdr hl)))) + res))) 'info-xref-visited 'info-xref)))) + (when (and not-fontified-p (memq Info-hide-note-references '(t hide))) + (put-text-property (match-beginning 2) (1- (match-end 6)) + 'invisible t) + ;; Unhide the file name in parens + (if (and (match-end 4) (not (eq (char-after (match-end 4)) ?.))) + (remove-text-properties (match-beginning 4) (match-end 4) + '(invisible t))) + ;; We need a stretchable space like :align-to but with + ;; a minimum value. + (put-text-property (1- (match-end 6)) (match-end 6) 'display + (if (>= 22 (- (match-end 1) + (match-beginning 0))) + '(space :align-to 24) + '(space :width 2))) + (setq cont (looking-at ".")) + (while (and (= (forward-line 1) 0) + (looking-at "\\([ \t]+\\)[^*\n]")) + (put-text-property (match-beginning 1) (1- (match-end 1)) + 'invisible t) + (put-text-property (1- (match-end 1)) (match-end 1) + 'display + (if cont + '(space :align-to 26) + '(space :align-to 24))) + (setq cont t))))))) ;; Fontify menu headers ;; Add the face `info-menu-header' to any header before a menu entry @@ -3800,16 +3955,6 @@ Preserve text properties." (set-buffer-modified-p nil)))) - -;; When an Info buffer is killed, make sure the associated tags buffer -;; is killed too. -(defun Info-kill-buffer () - (and (eq major-mode 'Info-mode) - Info-tag-table-buffer - (kill-buffer Info-tag-table-buffer))) - -(add-hook 'kill-buffer-hook 'Info-kill-buffer) - ;;; Speedbar support: ;; These functions permit speedbar to display the "tags" in the ;; current info node. @@ -3992,12 +4137,24 @@ BUFFER is the buffer speedbar is requesting buttons for." (Info-speedbar-hierarchy-buttons nil 0) ) -(dolist (mess '("^Node has no Previous$" +(dolist (mess '("^First node in file$" + "^No `.*' in index$" + "^No cross-reference named" + "^No cross.references in this node$" + "^No current info node$" "^No menu in this node$" - "^Node has no Next$" - "^No cross-references in this node^" - search-failed - "^No \".*\" in index$")) + "^No more items in menu$" + "^No more nodes$" + "^No pointer \\(?:forward\\|backward\\) from this node$" + "^No previous `i' command$" + "^No previous items in menu$" + "^No previous nodes$" + "^No such item in menu$" + "^No such node or anchor" + "^Node has no" + "^Point neither on reference nor in menu item description$" + "^This is the \\(?:first\\|last\\) Info node you looked at$" + search-failed)) (add-to-list 'debug-ignored-errors mess)) ;;;; Desktop support @@ -4023,5 +4180,5 @@ BUFFER is the buffer speedbar is requesting buttons for." (provide 'info) -;;; arch-tag: f2480fe2-2139-40c1-a49b-6314991164ac +;; arch-tag: f2480fe2-2139-40c1-a49b-6314991164ac ;;; info.el ends here