X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/d4aa48db8ed36b1fc7e7b0e6bd35049353f7f96e..e1af69b485b355586e3758e269d6fd0db3aadb15:/lisp/info.el diff --git a/lisp/info.el b/lisp/info.el index 2d396a105d..c546979327 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 Free Software Foundation, Inc. +;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +;; Free Software Foundation, Inc. ;; Maintainer: FSF ;; Keywords: help @@ -3374,6 +3375,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 @@ -3472,7 +3474,7 @@ Advanced commands: (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) @@ -3486,6 +3488,8 @@ Advanced commands: (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 @@ -3495,7 +3499,8 @@ Advanced commands: 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)))) @@ -4314,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