* bookmark.el (bookmark-map, bookmark-read-annotation-mode-map):
Move initialization into declaration. (bookmark-get-info-node, bookmark-set-info-node): Remove. (bookmark-make, bookmark-make-cell-for-text-file): Remove `info-node' arg. (bookmark-info-current-node): Remove. (bookmark-jump-noselect): Rename from bookmark-jump-internal. Add relocation fallback. Set bookmark-current-bookmark. (bookmark-default-handler): Rename from bookmark-jump-noselect. Remove relocation fallback. Don't set bookmark-current-bookmark. (bookmark-set): Let it be used even if there's no buffer-file-name as long as there is a bookmark-make-cell-function. * info.el (Info-bookmark-jump): Remove relocation fallback. Don't set bookmark-current-bookmark.
This commit is contained in:
parent
f7ae31df1d
commit
79363d9360
3 changed files with 107 additions and 142 deletions
|
@ -1,3 +1,19 @@
|
|||
2008-03-07 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* bookmark.el (bookmark-map, bookmark-read-annotation-mode-map):
|
||||
Move initialization into declaration.
|
||||
(bookmark-get-info-node, bookmark-set-info-node): Remove.
|
||||
(bookmark-make, bookmark-make-cell-for-text-file): Remove info-node arg.
|
||||
(bookmark-info-current-node): Remove.
|
||||
(bookmark-jump-noselect): Rename from bookmark-jump-internal.
|
||||
Add relocation fallback. Set bookmark-current-bookmark.
|
||||
(bookmark-default-handler): Rename from bookmark-jump-noselect.
|
||||
Remove relocation fallback. Don't set bookmark-current-bookmark.
|
||||
(bookmark-set): Let it be used even if there's no buffer-file-name
|
||||
as long as there is a bookmark-make-cell-function.
|
||||
* info.el (Info-bookmark-jump): Remove relocation fallback.
|
||||
Don't set bookmark-current-bookmark.
|
||||
|
||||
2008-03-07 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* mail/supercite.el: Remove leading `*' from defcustom doc-strings.
|
||||
|
|
211
lisp/bookmark.el
211
lisp/bookmark.el
|
@ -224,39 +224,39 @@ following in your `.emacs' file:
|
|||
;;;###autoload (define-key ctl-x-map "rl" 'bookmark-bmenu-list)
|
||||
|
||||
;;;###autoload
|
||||
(defvar bookmark-map nil
|
||||
(defvar bookmark-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
;; Read the help on all of these functions for details...
|
||||
(define-key map "x" 'bookmark-set)
|
||||
(define-key map "m" 'bookmark-set) ;"m"ark
|
||||
(define-key map "j" 'bookmark-jump)
|
||||
(define-key map "g" 'bookmark-jump) ;"g"o
|
||||
(define-key map "o" 'bookmark-jump-other-window)
|
||||
(define-key map "i" 'bookmark-insert)
|
||||
(define-key map "e" 'edit-bookmarks)
|
||||
(define-key map "f" 'bookmark-insert-location) ;"f"ind
|
||||
(define-key map "r" 'bookmark-rename)
|
||||
(define-key map "d" 'bookmark-delete)
|
||||
(define-key map "l" 'bookmark-load)
|
||||
(define-key map "w" 'bookmark-write)
|
||||
(define-key map "s" 'bookmark-save)
|
||||
map)
|
||||
"Keymap containing bindings to bookmark functions.
|
||||
It is not bound to any key by default: to bind it
|
||||
so that you have a bookmark prefix, just use `global-set-key' and bind a
|
||||
key of your choice to `bookmark-map'. All interactive bookmark
|
||||
functions have a binding in this keymap.")
|
||||
|
||||
;;;###autoload (define-prefix-command 'bookmark-map)
|
||||
|
||||
;; Read the help on all of these functions for details...
|
||||
;;;###autoload (define-key bookmark-map "x" 'bookmark-set)
|
||||
;;;###autoload (define-key bookmark-map "m" 'bookmark-set) ;"m"ark
|
||||
;;;###autoload (define-key bookmark-map "j" 'bookmark-jump)
|
||||
;;;###autoload (define-key bookmark-map "g" 'bookmark-jump) ;"g"o
|
||||
;;;###autoload (define-key bookmark-map "o" 'bookmark-jump-other-window)
|
||||
;;;###autoload (define-key bookmark-map "i" 'bookmark-insert)
|
||||
;;;###autoload (define-key bookmark-map "e" 'edit-bookmarks)
|
||||
;;;###autoload (define-key bookmark-map "f" 'bookmark-insert-location) ;"f"ind
|
||||
;;;###autoload (define-key bookmark-map "r" 'bookmark-rename)
|
||||
;;;###autoload (define-key bookmark-map "d" 'bookmark-delete)
|
||||
;;;###autoload (define-key bookmark-map "l" 'bookmark-load)
|
||||
;;;###autoload (define-key bookmark-map "w" 'bookmark-write)
|
||||
;;;###autoload (define-key bookmark-map "s" 'bookmark-save)
|
||||
|
||||
;;;###autoload (fset 'bookmark-map bookmark-map)
|
||||
|
||||
;;; The annotation maps.
|
||||
(defvar bookmark-read-annotation-mode-map (copy-keymap text-mode-map)
|
||||
(defvar bookmark-read-annotation-mode-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
(set-keymap-parent map text-mode-map)
|
||||
(define-key map "\C-c\C-c" 'bookmark-send-annotation)
|
||||
map)
|
||||
"Keymap for composing an annotation for a bookmark.")
|
||||
|
||||
(define-key bookmark-read-annotation-mode-map "\C-c\C-c"
|
||||
'bookmark-send-annotation)
|
||||
|
||||
|
||||
|
||||
;;; Core variables and data structures:
|
||||
(defvar bookmark-alist ()
|
||||
|
@ -268,18 +268,16 @@ The format of the alist is
|
|||
|
||||
\(BOOKMARK1 BOOKMARK2 ...\)
|
||||
|
||||
where each BOOKMARK is of the form
|
||||
where each BOOKMARK is typically of the form
|
||||
|
||||
\(NAME
|
||||
\(filename . FILE\)
|
||||
\(front-context-string . FRONT-STR\)
|
||||
\(rear-context-string . REAR-STR\)
|
||||
\(position . POS\)
|
||||
\(info-node . POS\)
|
||||
\(annotation . ANNOTATION\)\)
|
||||
|
||||
So the cdr of each bookmark is an alist too.
|
||||
`info-node' is optional, by the way.")
|
||||
So the cdr of each bookmark is an alist too.")
|
||||
|
||||
|
||||
(defvar bookmarks-already-loaded nil)
|
||||
|
@ -426,23 +424,6 @@ That is, all information but the name."
|
|||
(list (cons 'rear-context-string string))))))
|
||||
|
||||
|
||||
(defun bookmark-get-info-node (bookmark)
|
||||
"Get the info node associated with BOOKMARK."
|
||||
(cdr (assq 'info-node (bookmark-get-bookmark-record bookmark))))
|
||||
|
||||
|
||||
(defun bookmark-set-info-node (bookmark node)
|
||||
"Set the Info node of BOOKMARK to NODE."
|
||||
(let ((cell (assq 'info-node
|
||||
(bookmark-get-bookmark-record bookmark))))
|
||||
(if cell
|
||||
(setcdr cell node)
|
||||
(nconc (bookmark-get-bookmark-record bookmark)
|
||||
(list (cons 'info-node node)))))
|
||||
|
||||
(message "%S" (assq 'info-node (bookmark-get-bookmark-record bookmark)))
|
||||
(sit-for 4))
|
||||
|
||||
(defun bookmark-get-handler (bookmark)
|
||||
(cdr (assq 'handler (bookmark-get-bookmark-record bookmark))))
|
||||
|
||||
|
@ -487,23 +468,20 @@ menus, so `completing-read' never gets a chance to set `bookmark-history'."
|
|||
record. Modes may set this variable buffer-locally to enable
|
||||
bookmarking of non-text files like images or pdf documents.
|
||||
|
||||
The function will be called with two arguments: ANNOTATION and
|
||||
INFO-NODE. See `bookmark-make-cell-for-text-file' for a
|
||||
description.
|
||||
The function will be called with one argument: ANNOTATION.
|
||||
See `bookmark-make-cell-for-text-file' for a description.
|
||||
|
||||
The returned record may contain a special cons (handler . SOME-FUNCTION)
|
||||
which sets the handler function that should be used to open this
|
||||
bookmark instead of `bookmark-jump-noselect'. The handler should
|
||||
bookmark instead of `bookmark-default-handler'. The handler should
|
||||
return an alist like the one that function returns, and (of course)
|
||||
should likewise not select the buffer.")
|
||||
|
||||
(defun bookmark-make (name &optional annotation overwrite info-node)
|
||||
(defun bookmark-make (name &optional annotation overwrite)
|
||||
"Make a bookmark named NAME.
|
||||
Optional second arg ANNOTATION gives it an annotation.
|
||||
Optional third arg OVERWRITE means replace any existing bookmarks with
|
||||
this name.
|
||||
Optional fourth arg INFO-NODE means this bookmark is at info node
|
||||
INFO-NODE, so record this fact in the bookmark's entry."
|
||||
this name."
|
||||
(bookmark-maybe-load-default-file)
|
||||
(let ((stripped-name (copy-sequence name)))
|
||||
(or (featurep 'xemacs)
|
||||
|
@ -514,7 +492,7 @@ INFO-NODE, so record this fact in the bookmark's entry."
|
|||
;; already existing bookmark under that name and
|
||||
;; no prefix arg means just overwrite old bookmark
|
||||
(setcdr (bookmark-get-bookmark stripped-name)
|
||||
(list (funcall bookmark-make-cell-function annotation info-node)))
|
||||
(list (funcall bookmark-make-cell-function annotation)))
|
||||
|
||||
;; otherwise just cons it onto the front (either the bookmark
|
||||
;; doesn't exist already, or there is no prefix arg. In either
|
||||
|
@ -523,7 +501,7 @@ INFO-NODE, so record this fact in the bookmark's entry."
|
|||
(setq bookmark-alist
|
||||
(cons
|
||||
(list stripped-name
|
||||
(funcall bookmark-make-cell-function annotation info-node))
|
||||
(funcall bookmark-make-cell-function annotation))
|
||||
bookmark-alist)))
|
||||
|
||||
;; Added by db
|
||||
|
@ -534,7 +512,7 @@ INFO-NODE, so record this fact in the bookmark's entry."
|
|||
(bookmark-save))))
|
||||
|
||||
|
||||
(defun bookmark-make-cell-for-text-file (annotation &optional info-node)
|
||||
(defun bookmark-make-cell-for-text-file (annotation)
|
||||
"Return the record part of a new bookmark, given ANNOTATION.
|
||||
Must be at the correct position in the buffer in which the bookmark is
|
||||
being set. This might change someday.
|
||||
|
@ -560,12 +538,9 @@ INFO-NODE, so record this fact in the bookmark's entry."
|
|||
|
||||
;; Take no chances with text properties
|
||||
(set-text-properties 0 (length annotation) nil annotation)
|
||||
(set-text-properties 0 (length info-node) nil info-node)
|
||||
|
||||
(if annotation
|
||||
(nconc the-record (list (cons 'annotation annotation))))
|
||||
(if info-node
|
||||
(nconc the-record (list (cons 'info-node info-node))))
|
||||
|
||||
;; Finally, return the completed record.
|
||||
the-record))
|
||||
|
@ -764,6 +739,7 @@ and it removes only the first instance of a bookmark with that name from
|
|||
the list of bookmarks.\)"
|
||||
(interactive (list nil current-prefix-arg))
|
||||
(or
|
||||
(local-variable-p 'bookmark-make-cell-function)
|
||||
(bookmark-buffer-file-name)
|
||||
(error "Buffer not visiting a file or directory"))
|
||||
|
||||
|
@ -789,18 +765,12 @@ the list of bookmarks.\)"
|
|||
;; Ask for an annotation buffer for this bookmark
|
||||
(if bookmark-use-annotations
|
||||
(bookmark-read-annotation parg str)
|
||||
(bookmark-make str annotation parg (bookmark-info-current-node))
|
||||
(bookmark-make str annotation parg)
|
||||
(setq bookmark-current-bookmark str)
|
||||
(bookmark-bmenu-surreptitiously-rebuild-list)
|
||||
(goto-char bookmark-current-point))))
|
||||
|
||||
|
||||
(defun bookmark-info-current-node ()
|
||||
"If in `Info-mode', return current node name (a string), else nil."
|
||||
(if (eq major-mode 'Info-mode)
|
||||
Info-current-node))
|
||||
|
||||
|
||||
(defun bookmark-kill-line (&optional newline-too)
|
||||
"Kill from point to end of line.
|
||||
If optional arg NEWLINE-TOO is non-nil, delete the newline too.
|
||||
|
@ -845,7 +815,7 @@ the bookmark (and file, and point) specified in buffer local variables."
|
|||
(save-excursion
|
||||
(pop-to-buffer buf)
|
||||
(goto-char pt)
|
||||
(bookmark-make bookmark annotation parg (bookmark-info-current-node))
|
||||
(bookmark-make bookmark annotation parg)
|
||||
(setq bookmark-current-bookmark bookmark))
|
||||
(bookmark-bmenu-surreptitiously-rebuild-list)
|
||||
(goto-char bookmark-current-point))
|
||||
|
@ -1082,7 +1052,7 @@ of the old one in the permanent bookmark record."
|
|||
(unless bookmark
|
||||
(error "No bookmark specified"))
|
||||
(bookmark-maybe-historicize-string bookmark)
|
||||
(let ((alist (bookmark-jump-internal bookmark)))
|
||||
(let ((alist (bookmark-jump-noselect bookmark)))
|
||||
(and alist
|
||||
(switch-to-buffer (cadr (assq 'buffer alist)))
|
||||
(goto-char (cadr (assq 'position alist)))
|
||||
|
@ -1104,7 +1074,7 @@ See `bookmark-jump'."
|
|||
(list bkm) bkm)))
|
||||
(when bookmark
|
||||
(bookmark-maybe-historicize-string bookmark)
|
||||
(let ((alist (bookmark-jump-internal bookmark)))
|
||||
(let ((alist (bookmark-jump-noselect bookmark)))
|
||||
(and alist
|
||||
(switch-to-buffer-other-window (cadr (assq 'buffer alist)))
|
||||
(goto-char (cadr (assq 'position alist)))
|
||||
|
@ -1134,13 +1104,36 @@ be retrieved from a VC backend, else return nil."
|
|||
;; Last possibility: try VC
|
||||
(if (vc-backend file) file))))
|
||||
|
||||
(defun bookmark-jump-internal (bookmark)
|
||||
"Call BOOKMARK's handler or `bookmark-jump-noselect' if it has none."
|
||||
(funcall (or (bookmark-get-handler bookmark)
|
||||
'bookmark-jump-noselect)
|
||||
bookmark))
|
||||
(defun bookmark-jump-noselect (bookmark)
|
||||
"Call BOOKMARK's handler or `bookmark-default-handler' if it has none."
|
||||
(let ((found (funcall (or (bookmark-get-handler bookmark)
|
||||
'bookmark-default-handler)
|
||||
bookmark)))
|
||||
(unless found
|
||||
;; Else unable to find the marked file, so ask if user wants to
|
||||
;; relocate the bookmark, else remind them to consider deletion.
|
||||
(let ((file (bookmark-get-filename bookmark)))
|
||||
(when file ;Don't know how to relocate if there's no `file'.
|
||||
(setq file (expand-file-name file))
|
||||
(ding)
|
||||
(if (y-or-n-p (concat (file-name-nondirectory file)
|
||||
" nonexistent. Relocate \""
|
||||
bookmark
|
||||
"\"? "))
|
||||
(progn
|
||||
(bookmark-relocate bookmark)
|
||||
;; Try again.
|
||||
(setq found (funcall (or (bookmark-get-handler bookmark)
|
||||
'bookmark-default-handler)
|
||||
bookmark)))
|
||||
(message
|
||||
"Bookmark not relocated; consider removing it \(%s\)." bookmark)))))
|
||||
(when found
|
||||
;; Added by db.
|
||||
(setq bookmark-current-bookmark bookmark)
|
||||
found)))
|
||||
|
||||
(defun bookmark-jump-noselect (str)
|
||||
(defun bookmark-default-handler (str)
|
||||
;; Helper for bookmark-jump. STR is a bookmark name, of the sort
|
||||
;; accepted by `bookmark-get-bookmark'.
|
||||
;;
|
||||
|
@ -1151,52 +1144,26 @@ be retrieved from a VC backend, else return nil."
|
|||
(let* ((file (expand-file-name (bookmark-get-filename str)))
|
||||
(forward-str (bookmark-get-front-context-string str))
|
||||
(behind-str (bookmark-get-rear-context-string str))
|
||||
(place (bookmark-get-position str))
|
||||
(info-node (bookmark-get-info-node str))
|
||||
(orig-file file)
|
||||
)
|
||||
(place (bookmark-get-position str)))
|
||||
;; FIXME: bookmark-file-or-variation-thereof was needed for Info files,
|
||||
;; but now that Info bookmarks are handled elsewhere it seems that we
|
||||
;; should be able to get rid of it. --Stef
|
||||
(if (setq file (bookmark-file-or-variation-thereof file))
|
||||
(save-excursion
|
||||
(save-window-excursion
|
||||
(if info-node
|
||||
;; Info nodes must be visited with care.
|
||||
(progn
|
||||
(require 'info)
|
||||
(with-no-warnings
|
||||
(Info-find-node file info-node)))
|
||||
;; Else no Info. Can do an ordinary find-file:
|
||||
(set-buffer (find-file-noselect file))
|
||||
(goto-char place))
|
||||
(with-current-buffer (find-file-noselect file)
|
||||
(goto-char place)
|
||||
|
||||
;; 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 str)
|
||||
`((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 \""
|
||||
str
|
||||
"\"? "))
|
||||
(progn
|
||||
(bookmark-relocate str)
|
||||
;; gasp! It's a recursive function call in Emacs Lisp!
|
||||
(bookmark-jump-noselect str))
|
||||
(message
|
||||
"Bookmark not relocated; consider removing it \(%s\)." str)
|
||||
nil))))
|
||||
;; 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))))
|
||||
`((buffer ,(current-buffer)) (position ,(point)))))))
|
||||
|
||||
|
||||
;;;###autoload
|
||||
|
@ -1298,7 +1265,7 @@ this."
|
|||
(let ((orig-point (point))
|
||||
(str-to-insert
|
||||
(save-excursion
|
||||
(set-buffer (cadr (assq 'buffer (bookmark-jump-internal bookmark))))
|
||||
(set-buffer (cadr (assq 'buffer (bookmark-jump-noselect bookmark))))
|
||||
(buffer-string))))
|
||||
(insert str-to-insert)
|
||||
(push-mark)
|
||||
|
@ -1927,7 +1894,7 @@ With a prefix arg, prompts for a file to save them in."
|
|||
(pop-up-windows t))
|
||||
(delete-other-windows)
|
||||
(switch-to-buffer (other-buffer))
|
||||
(let* ((alist (bookmark-jump-internal bmrk))
|
||||
(let* ((alist (bookmark-jump-noselect bmrk))
|
||||
(buff (cadr (assq 'buffer alist)))
|
||||
(pos (cadr (assq 'position alist))))
|
||||
(pop-to-buffer buff)
|
||||
|
@ -1947,7 +1914,7 @@ With a prefix arg, prompts for a file to save them in."
|
|||
(interactive)
|
||||
(let ((bookmark (bookmark-bmenu-bookmark)))
|
||||
(if (bookmark-bmenu-check-position)
|
||||
(let* ((alist (bookmark-jump-internal bookmark))
|
||||
(let* ((alist (bookmark-jump-noselect bookmark))
|
||||
(buff (cadr (assq 'buffer alist)))
|
||||
(pos (cadr (assq 'position alist))))
|
||||
(switch-to-buffer-other-window buff)
|
||||
|
@ -1965,7 +1932,7 @@ The current window remains selected."
|
|||
same-window-buffer-names
|
||||
same-window-regexps)
|
||||
(if (bookmark-bmenu-check-position)
|
||||
(let* ((alist (bookmark-jump-internal bookmark))
|
||||
(let* ((alist (bookmark-jump-noselect bookmark))
|
||||
(buff (cadr (assq 'buffer alist)))
|
||||
(pos (cadr (assq 'position alist))))
|
||||
(display-buffer buff)
|
||||
|
|
22
lisp/info.el
22
lisp/info.el
|
@ -4373,8 +4373,7 @@ BUFFER is the buffer speedbar is requesting buttons for."
|
|||
(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))
|
||||
(info-node (bookmark-get-info-node bmk)))
|
||||
(if (setq file (bookmark-file-or-variation-thereof file))
|
||||
(save-excursion
|
||||
(save-window-excursion
|
||||
|
@ -4391,24 +4390,7 @@ BUFFER is the buffer speedbar is requesting buttons for."
|
|||
(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))))
|
||||
`((buffer ,(current-buffer)) (position ,(point))))))))
|
||||
|
||||
(provide 'info)
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue