;;; bookmark.el --- set bookmarks, maybe annotate them, jump to them later
;; Copyright (C) 1993, 1994, 1995, 1996, 1997, 2001, 2002, 2003,
-;; 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+;; 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
;; Author: Karl Fogel <kfogel@red-bean.com>
;; Maintainer: Karl Fogel <kfogel@red-bean.com>
(defconst bookmark-bmenu-header-height 2
"Number of lines used for the *Bookmark List* header.")
-(defconst bookmark-bmenu-marks-width 1
- "Number of columns (chars) used for the *Bookmark List* marks column.")
+(defconst bookmark-bmenu-marks-width 2
+ "Number of columns (chars) used for the *Bookmark List* marks column,
+including the annotations column.")
(defcustom bookmark-bmenu-file-column 30
"Column at which to display filenames in a buffer listing bookmarks.
(and
;; Possibly the old bookmark file, "~/.emacs-bkmrks", needs
;; to be renamed.
- (file-exists-p (expand-file-name bookmark-old-default-file))
- (not (file-exists-p (expand-file-name bookmark-default-file)))
- (rename-file (expand-file-name bookmark-old-default-file)
- (expand-file-name bookmark-default-file)))
+ (file-exists-p bookmark-old-default-file)
+ (not (file-exists-p bookmark-default-file))
+ (rename-file bookmark-old-default-file
+ bookmark-default-file))
;; return t so the `and' will continue...
t)
- (file-readable-p (expand-file-name bookmark-default-file))
+ (file-readable-p bookmark-default-file)
(bookmark-load bookmark-default-file t t)
(setq bookmarks-already-loaded t)))
(funcall (or (bookmark-get-handler bookmark)
'bookmark-default-handler)
(bookmark-get-bookmark bookmark))
- (file-error
+ (bookmark-error-no-filename ;file-error
;; We were unable to find the marked file, so ask if user wants to
;; relocate the bookmark, else remind them to consider deletion.
(when (stringp bookmark)
BMK-RECORD is a bookmark record, not a bookmark name (i.e., not a string).
Changes current buffer and point and returns nil, or signals a `file-error'."
(let ((file (bookmark-get-filename bmk-record))
+ (buf (bookmark-prop-get bmk-record 'buffer))
(forward-str (bookmark-get-front-context-string bmk-record))
(behind-str (bookmark-get-rear-context-string bmk-record))
(place (bookmark-get-position bmk-record)))
- (if (not file)
- (signal 'bookmark-error-no-filename (list 'stringp file))
- (set-buffer (find-file-noselect file))
- (if place (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)))))
+ (set-buffer
+ (cond
+ ((and file (file-readable-p file) (not (buffer-live-p buf)))
+ (find-file-noselect file))
+ ;; No file found. See if buffer BUF have been created.
+ ((and buf (get-buffer buf)))
+ (t ;; If not, raise error.
+ (signal 'bookmark-error-no-filename (list 'stringp file)))))
+ (if place (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.
+ (when (and forward-str (search-forward forward-str (point-max) t))
+ (goto-char (match-beginning 0)))
+ (when (and behind-str (search-backward behind-str (point-min) t))
+ (goto-char (match-end 0)))
nil))
;;;###autoload
(bookmark-maybe-historicize-string bookmark)
(bookmark-maybe-load-default-file)
(let* ((bmrk-filename (bookmark-get-filename bookmark))
- (newloc (expand-file-name
- (read-file-name
- (format "Relocate %s to: " bookmark)
- (file-name-directory bmrk-filename)))))
+ (newloc (abbreviate-file-name
+ (expand-file-name
+ (read-file-name
+ (format "Relocate %s to: " bookmark)
+ (file-name-directory bmrk-filename))))))
(bookmark-set-filename bookmark newloc)
(setq bookmark-alist-modification-count
(1+ bookmark-alist-modification-count))
;;but there's no better default, and
;;I guess it's better than none at all.
"~/" bookmark-default-file 'confirm)))
- (setq file (expand-file-name file))
+ (setq file (abbreviate-file-name (expand-file-name file)))
(if (not (file-readable-p file))
(error "Cannot read bookmark file %s" file)
(if (null no-msg)
(setq bookmark-alist-modification-count
(1+ bookmark-alist-modification-count)))
(if (string-equal
- (expand-file-name bookmark-default-file)
+ (abbreviate-file-name
+ (expand-file-name bookmark-default-file))
file)
(setq bookmarks-already-loaded t))
(bookmark-bmenu-surreptitiously-rebuild-list))
(interactive)
(bookmark-maybe-load-default-file)
(let ((buf (get-buffer-create "*Bookmark List*")))
- ;; fooo
(if (called-interactively-p 'interactive)
(if (or (window-dedicated-p) (window-minibuffer-p))
(pop-to-buffer buf)
" *" " ")
name)
(setq end (point))
- (put-text-property start
- (+ bookmark-bmenu-marks-width 1 start)
- 'bookmark-name-prop name)
+ (put-text-property
+ (+ bookmark-bmenu-marks-width start) end 'bookmark-name-prop name)
(when (display-mouse-p)
(add-text-properties
- (+ bookmark-bmenu-marks-width 1 start) end
+ (+ bookmark-bmenu-marks-width start) end
'(mouse-face highlight
follow-link t
help-echo "mouse-2: go to this bookmark in other window")))
(nreverse bookmark-bmenu-hidden-bookmarks))
(let ((inhibit-read-only t))
(while bookmark-bmenu-hidden-bookmarks
- (move-to-column (1+ bookmark-bmenu-marks-width) t)
+ (move-to-column bookmark-bmenu-marks-width t)
(bookmark-kill-line)
(let ((name (pop bookmark-bmenu-hidden-bookmarks))
(start (point)))
(insert name)
+ (put-text-property start (point) 'bookmark-name-prop name)
(if (display-mouse-p)
(add-text-properties
start (point)
(interactive "P")
(save-excursion
(save-window-excursion
- (bookmark-save parg)))
- ;; Show the buffer as unmodified after saving, but only if there are
- ;; no marks: marks are not saved with the bookmarks, therefore from
- ;; the user's point of view they are a "modification" in the buffer
- ;;
- ;; FIXME: Ideally, if the buffer were unmodified when there are no
- ;; marks, and then some marks are made and removed without being
- ;; executed, then the buffer would be restored to unmodified state.
- ;; But that would require bookmark-specific logic to track buffer
- ;; modification. It might be worth it, but it's fine not to have it
- ;; too -- the worst outcome is that the user might be tempted to
- ;; save the bookmark list when it technically doesn't need saving.
- (if (not (bookmark-bmenu-any-marks))
- (set-buffer-modified-p nil)))
+ (bookmark-save parg)
+ (set-buffer-modified-p nil))))
(defun bookmark-bmenu-load ()
(defun bookmark-bmenu-execute-deletions ()
- "Delete bookmarks marked with \\<Buffer-menu-mode-map>\\[Buffer-menu-delete] commands."
+ "Delete bookmarks flagged `D'."
(interactive)
(message "Deleting bookmarks...")
(let ((o-point (point))