;;; info.el --- info package for Emacs
;; Copyright (C) 1985, 1986, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-;; 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
;; Maintainer: FSF
;; Keywords: help
;; GNU Emacs is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
:group 'info)
(defcustom Info-fontify-maximum-menu-size 100000
- "*Maximum size of menu to fontify if `font-lock-mode' is non-nil."
+ "*Maximum size of menu to fontify if `font-lock-mode' is non-nil.
+Set to nil to disable node fontification."
:type 'integer
:group 'info)
(defvar Info-current-subfile nil
"Info subfile that is actually in the *info* buffer now.
-nil if current Info file is not split into subfiles.")
+It is nil if current Info file is not split into subfiles.")
(defvar Info-current-node nil
"Name of node that Info is now looking at, or nil.")
(expand-file-name "info/" installation-directory)
(if invocation-directory
(let ((infodir (expand-file-name
- "../info/"
+ "../share/info/"
invocation-directory)))
(if (file-exists-p infodir)
infodir
(setq infodir (expand-file-name
- "../../../info/"
+ "../../../share/info/"
invocation-directory))
(and (file-exists-p infodir)
infodir))))))
(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 only for the benefit of
-;; makeinfo-buffer) out of the way of normal operations.
+;; 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.
(if new-history
(setq Info-history (cons new-history Info-history))))))
+(defun Info-revert-buffer-function (ignore-auto noconfirm)
+ (when (or noconfirm (y-or-n-p "Revert info buffer? "))
+ (Info-revert-find-node Info-current-file Info-current-node)
+ (message "Reverted %s" Info-current-file)))
+
(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.
nil t)
(let* ((start (match-beginning 1))
(parameter-alist (Info-split-parameter-string (match-string 2)))
- (src (cdr (assoc-string "src" parameter-alist)))
- (image-file (if src (if (file-name-absolute-p src) src
- (concat default-directory src))
- ""))
- (image (if (file-exists-p image-file)
- (create-image image-file)
- "[broken image]")))
- (if (not (get-text-property start 'display))
- (add-text-properties
- start (point) `(display ,image rear-nonsticky (display)))))))
+ (src (cdr (assoc-string "src" parameter-alist))))
+ (if (display-images-p)
+ (let* ((image-file (if src (if (file-name-absolute-p src) src
+ (concat default-directory src))
+ ""))
+ (image (if (file-exists-p image-file)
+ (create-image image-file)
+ "[broken image]")))
+ (if (not (get-text-property start 'display))
+ (add-text-properties
+ start (point) `(display ,image rear-nonsticky (display)))))
+ ;; text-only display, show alternative text if provided, or
+ ;; otherwise a clue that there's meant to be a picture
+ (delete-region start (point))
+ (insert (or (cdr (assoc-string "text" parameter-alist))
+ (cdr (assoc-string "alt" parameter-alist))
+ (and src
+ (concat "[image:" src "]"))
+ "[image]"))))))
(set-buffer-modified-p nil)))
;; Texinfo 4.7 adds cookies of the form ^@^H[NAME CONTENTS ^@^H].
(defvar Info-mode-line-node-keymap
(let ((map (make-sparse-keymap)))
- (define-key map [mode-line mouse-1] 'Info-scroll-up)
- (define-key map [mode-line mouse-3] 'Info-scroll-down)
+ (define-key map [mode-line mouse-1] 'Info-mouse-scroll-up)
+ (define-key map [mode-line mouse-3] 'Info-mouse-scroll-down)
map)
"Keymap to put on the Info node name in the mode line.")
(t (Info-next-preorder)))
(scroll-up))))
+(defun Info-mouse-scroll-up (e)
+ "Scroll one screenful forward in Info, using the mouse.
+See `Info-scroll-up'."
+ (interactive "e")
+ (save-selected-window
+ (if (eventp e)
+ (select-window (posn-window (event-start e))))
+ (Info-scroll-up)))
+
(defun Info-scroll-down ()
"Scroll one screenful back in Info, considering all nodes as one sequence.
If point is within the menu of a node, and `Info-scroll-prefer-subnodes'
(Info-last-preorder)
(scroll-down))))
+(defun Info-mouse-scroll-down (e)
+ "Scroll one screenful backward in Info, using the mouse.
+See `Info-scroll-down'."
+ (interactive "e")
+ (save-selected-window
+ (if (eventp e)
+ (select-window (posn-window (event-start e))))
+ (Info-scroll-down)))
+
(defun Info-next-reference (&optional recur)
"Move cursor to the next cross-reference or menu item in the node."
(interactive)
(defvar info-tool-bar-map
(if (display-graphic-p)
(let ((map (make-sparse-keymap)))
- (tool-bar-local-item-from-menu 'Info-exit "close" map Info-mode-map)
- (tool-bar-local-item-from-menu 'Info-history-back "left-arrow" map Info-mode-map)
- (tool-bar-local-item-from-menu 'Info-history-forward "right-arrow" map Info-mode-map)
- (tool-bar-local-item-from-menu 'Info-prev "prev-node" map Info-mode-map)
- (tool-bar-local-item-from-menu 'Info-next "next-node" map Info-mode-map)
+ (tool-bar-local-item-from-menu 'Info-history-back "left-arrow" map Info-mode-map
+ :rtl "right-arrow")
+ (tool-bar-local-item-from-menu 'Info-history-forward "right-arrow" map Info-mode-map
+ :rtl "left-arrow")
+ (tool-bar-local-item-from-menu 'Info-prev "prev-node" map Info-mode-map
+ :rtl "next-node")
+ (tool-bar-local-item-from-menu 'Info-next "next-node" map Info-mode-map
+ :rtl "prev-node")
(tool-bar-local-item-from-menu 'Info-up "up-node" 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-goto-node "jump-to" map Info-mode-map)
(tool-bar-local-item-from-menu 'Info-index "index" map Info-mode-map)
(tool-bar-local-item-from-menu 'Info-search "search" map Info-mode-map)
+ (tool-bar-local-item-from-menu 'Info-exit "exit" map Info-mode-map)
map)))
(defvar Info-menu-last-node nil)
(unless Info-current-node
(error "No current Info node"))
(let ((node (if (stringp Info-current-file)
- (concat "(" (file-name-nondirectory Info-current-file) ")"
+ (concat "(" (file-name-nondirectory Info-current-file) ") "
Info-current-node))))
(if (zerop (prefix-numeric-value arg))
(setq node (concat "(info \"" node "\")")))
(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 'clone-buffer-hook 'Info-clone-buffer 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-push-state)
(set (make-local-variable 'search-whitespace-regexp)
Info-search-whitespace-regexp)
+ (set (make-local-variable 'revert-buffer-function)
+ 'Info-revert-buffer-function)
(Info-set-mode-line)
(run-mode-hooks 'Info-mode-hook))
Info-tag-table-buffer
(kill-buffer Info-tag-table-buffer)))
-(defun Info-clone-buffer-hook ()
+;; Placed on `clone-buffer-hook'.
+(defun Info-clone-buffer ()
(when (bufferp Info-tag-table-buffer)
(setq Info-tag-table-buffer
(with-current-buffer Info-tag-table-buffer (clone-buffer))))
(fontify-visited-p ; visited nodes need to be re-fontified
(and Info-fontify-visited-nodes
;; Don't take time to refontify visited nodes in huge nodes
+ Info-fontify-maximum-menu-size
(< (- (point-max) (point-min)) Info-fontify-maximum-menu-size)))
rbeg rend)
(goto-char (point-min))
(when (and (or not-fontified-p fontify-visited-p)
(search-forward "\n* Menu:" nil t)
- (not (Info-index-node))
;; Don't take time to annotate huge menus
+ Info-fontify-maximum-menu-size
(< (- (point-max) (point)) Info-fontify-maximum-menu-size))
(let ((n 0)
cont)
(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)))
+ (when (and not-fontified-p
+ (memq Info-hide-note-references '(t hide))
+ (not (Info-index-node)))
(put-text-property (match-beginning 2) (1- (match-end 6))
'invisible t)
;; Unhide the file name in parens
;; Fontify http and ftp references
(goto-char (point-min))
(when not-fontified-p
- (while (re-search-forward "[hf]t?tp://[^ \t\n\"`({<>})']+" nil t)
+ (while (re-search-forward "\\(https?\\|ftp\\)://[^ \t\n\"`({<>})']+"
+ nil t)
(add-text-properties (match-beginning 0) (match-end 0)
'(font-lock-face info-xref
mouse-face highlight