diff options
Diffstat (limited to 'lisp/info.el')
-rw-r--r-- | lisp/info.el | 127 |
1 files changed, 115 insertions, 12 deletions
diff --git a/lisp/info.el b/lisp/info.el index 66ca4b61000..5bbbd60019e 100644 --- a/lisp/info.el +++ b/lisp/info.el @@ -1,7 +1,8 @@ ;;; 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, 2007, 2008 Free Software Foundation, Inc. +;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +;; Free Software Foundation, Inc. ;; Maintainer: FSF ;; Keywords: help @@ -706,8 +707,8 @@ otherwise, that defaults to `Top'." (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. @@ -739,6 +740,11 @@ is preserved, if possible." (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. @@ -1544,13 +1550,12 @@ PATH-AND-SUFFIXES is a pair of lists, (DIRECTORIES . SUFFIXES)." 1 0))) -(defun Info-read-node-name (prompt &optional default) +(defun Info-read-node-name (prompt) (let* ((completion-ignore-case t) (Info-read-node-completion-table (Info-build-node-completions)) (nodename (completing-read prompt 'Info-read-node-name-1 nil t))) (if (equal nodename "") - (or default - (Info-read-node-name prompt)) + (Info-read-node-name prompt) nodename))) (defun Info-build-node-completions () @@ -2667,7 +2672,7 @@ See `Info-scroll-down'." (defun Info-next-reference (&optional recur) "Move cursor to the next cross-reference or menu item in the node." (interactive) - (let ((pat "\\*note[ \n\t]+\\([^:]+\\):\\|^\\* .*:\\|[hf]t?tp://") + (let ((pat "\\*note[ \n\t]+\\([^:]+\\):\\|^\\* .*:\\|[hf]t?tps?://") (old-pt (point)) (case-fold-search t)) (or (eobp) (forward-char 1)) @@ -2689,7 +2694,7 @@ See `Info-scroll-down'." (defun Info-prev-reference (&optional recur) "Move cursor to the previous cross-reference or menu item in the node." (interactive) - (let ((pat "\\*note[ \n\t]+\\([^:]+\\):\\|^\\* .*:\\|[hf]t?tp://") + (let ((pat "\\*note[ \n\t]+\\([^:]+\\):\\|^\\* .*:\\|[hf]t?tps?://") (old-pt (point)) (case-fold-search t)) (or (re-search-backward pat nil t) @@ -3117,7 +3122,7 @@ If FORK is a string, it is the name to use for the new buffer." If FORK is non-nil, it i spassed to `Info-goto-node'." (let (node) (cond - ((Info-get-token (point) "[hf]t?tp://" "[hf]t?tp://\\([^ \t\n\"`({<>})']+\\)") + ((Info-get-token (point) "[hf]t?tps?://" "[hf]t?tps?://\\([^ \t\n\"`({<>})']+\\)") (setq node t) (browse-url (browse-url-url-at-point))) ((setq node (Info-get-token (point) "\\*note[ \n\t]+" @@ -3353,7 +3358,7 @@ With a zero prefix arg, put the name inside a function call to `info'." (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 "\")"))) @@ -3369,6 +3374,7 @@ With a zero prefix arg, put the name inside a function call to `info'." (put 'Info-mode 'no-clone-indirect t) (defvar tool-bar-map) +(defvar bookmark-make-cell-function) ;; Autoload cookie needed by desktop.el ;;;###autoload @@ -3478,7 +3484,11 @@ Advanced commands: '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) + (set (make-local-variable 'bookmark-make-cell-function) + 'Info-bookmark-make-cell) (run-mode-hooks 'Info-mode-hook)) ;; When an Info buffer is killed, make sure the associated tags buffer @@ -3733,7 +3743,8 @@ the variable `Info-file-list-for-emacs'." (case-fold-search t) paragraph-markers (not-fontified-p ; the node hasn't already been fontified - (not (let ((where (next-property-change (point-min)))) + (not (let ((where (next-single-property-change (point-min) + 'font-lock-face))) (and where (not (= where (point-max))))))) (fontify-visited-p ; visited nodes need to be re-fontified (and Info-fontify-visited-nodes @@ -4079,7 +4090,8 @@ the variable `Info-file-list-for-emacs'." ;; Fontify http and ftp references (goto-char (point-min)) (when not-fontified-p - (while (re-search-forward "\\(https?\\|ftp\\)://[^ \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 @@ -4307,6 +4319,97 @@ BUFFER is the buffer speedbar is requesting buttons for." (add-to-list 'desktop-buffer-mode-handlers '(Info-mode . Info-restore-desktop-buffer)) +;;;; Bookmark support + +(defvar bookmark-search-size) + +;; This is only called from bookmark.el. +(declare-function bookmark-buffer-file-name "bookmark" ()) + +(defun Info-bookmark-make-cell (annotation &optional info-node) + (let ((the-record + `((filename . ,(bookmark-buffer-file-name)) + (front-context-string + . ,(if (>= (- (point-max) (point)) bookmark-search-size) + (buffer-substring-no-properties + (point) + (+ (point) bookmark-search-size)) + nil)) + (rear-context-string + . ,(if (>= (- (point) (point-min)) bookmark-search-size) + (buffer-substring-no-properties + (point) + (- (point) bookmark-search-size)) + nil)) + (position . ,(point)) + (info-node . ,info-node) + (handler . Info-bookmark-jump)))) + + ;; Now fill in the optional parts: + + ;; Take no chances with text properties + (set-text-properties 0 (length annotation) nil annotation) + + (if annotation + (nconc the-record (list (cons 'annotation annotation)))) + + ;; Finally, return the completed record. + the-record)) + +(defvar bookmark-current-bookmark) +(declare-function bookmark-get-filename "bookmark" (bookmark)) +(declare-function bookmark-get-front-context-string "bookmark" (bookmark)) +(declare-function bookmark-get-rear-context-string "bookmark" (bookmark)) +(declare-function bookmark-get-position "bookmark" (bookmark)) +(declare-function bookmark-get-info-node "bookmark" (bookmark)) +(declare-function bookmark-file-or-variation-thereof "bookmark" (file)) +(declare-function bookmark-jump-noselect "bookmark" (str)) + +;;;###autoload +(defun Info-bookmark-jump (bmk) + ;; This implements the `handler' function interface for record type returned + ;; by `Info-make-cell-function', which see. + (let* ((file (expand-file-name (bookmark-get-filename bmk))) + (forward-str (bookmark-get-front-context-string bmk)) + (behind-str (bookmark-get-rear-context-string bmk)) + (place (bookmark-get-position bmk)) + (info-node (bookmark-get-info-node bmk)) + (orig-file file)) + (if (setq file (bookmark-file-or-variation-thereof file)) + (save-excursion + (save-window-excursion + (with-no-warnings + (Info-find-node file info-node)) + ;; Go searching forward first. Then, if forward-str exists and was + ;; found in the file, we can search backward for behind-str. + ;; Rationale is that if text was inserted between the two in the + ;; file, it's better to be put before it so you can read it, rather + ;; than after and remain perhaps unaware of the changes. + (if forward-str + (if (search-forward forward-str (point-max) t) + (goto-char (match-beginning 0)))) + (if behind-str + (if (search-backward behind-str (point-min) t) + (goto-char (match-end 0)))) + ;; added by db + (setq bookmark-current-bookmark bmk) + `((buffer ,(current-buffer)) (position ,(point))))) + + ;; Else unable to find the marked file, so ask if user wants to + ;; relocate the bookmark, else remind them to consider deletion. + (ding) + (if (y-or-n-p (concat (file-name-nondirectory orig-file) + " nonexistent. Relocate \"" + bmk + "\"? ")) + (progn + (bookmark-relocate bmk) + ;; gasp! It's a recursive function call in Emacs Lisp! + (bookmark-jump-noselect bmk)) + (message + "Bookmark not relocated; consider removing it \(%s\)." bmk) + nil)))) + (provide 'info) ;; arch-tag: f2480fe2-2139-40c1-a49b-6314991164ac |