;;; bookmark.el --- set bookmarks, maybe annotate them, jump to them later.
-;; Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation
+;; Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation
;; Author: Karl Fogel <kfogel@red-bean.com>
;; Maintainer: Karl Fogel <kfogel@red-bean.com>
(require 'pp)
-(defconst bookmark-version "2.6.3"
+(defconst bookmark-version "2.6.4"
"Version number of bookmark.el. This is not related to the version
of Emacs bookmark comes with; it is used solely by bookmark's
maintainers to avoid version confusion.")
;;; User Variables
-(defvar bookmark-use-annotations nil
- "*If non-nil, saving a bookmark will query for an annotation in a
-buffer.")
+(defgroup bookmark nil
+ "Setting, annotation and jumping to bookmarks."
+ :group 'matching)
-(defvar bookmark-save-flag t
+(defcustom bookmark-use-annotations nil
+ "*If non-nil, saving a bookmark queries for an annotation in a buffer."
+ :type 'boolean
+ :group 'bookmark)
+
+
+(defcustom bookmark-save-flag t
"*Controls when Emacs saves bookmarks to a file.
---> Nil means never save bookmarks, except when `bookmark-save' is
+--> nil means never save bookmarks, except when `bookmark-save' is
explicitly called \(\\[bookmark-save]\).
--> t means save bookmarks when Emacs is killed.
--> Otherwise, it should be a number that is the frequency with which
behavior.\)
To specify the file in which to save them, modify the variable
-bookmark-default-file, which is `~/.emacs.bmk' by default.")
+`bookmark-default-file', which is `~/.emacs.bmk' by default."
+ :type '(choice (const nil) (const t) integer)
+ :group 'bookmark)
(defconst bookmark-old-default-file "~/.emacs-bkmrks"
- "*The .emacs.bmk file used to be called this.")
+ "*The `.emacs.bmk' file used to be called this name.")
;; defvarred to avoid a compilation warning:
(defvar bookmark-file nil
"Old name for `bookmark-default-file'.")
-(defvar bookmark-default-file
+(defcustom bookmark-default-file
(if bookmark-file
;; In case user set `bookmark-file' in her .emacs:
bookmark-file
- (if (eq system-type 'ms-dos)
- "~/emacs.bmk" ; Cannot have initial dot [Yuck!]
- "~/.emacs.bmk"))
- "*File in which to save bookmarks by default.")
+ (convert-standard-filename "~/.emacs.bmk"))
+ "*File in which to save bookmarks by default."
+ :type 'file
+ :group 'bookmark)
-(defvar bookmark-version-control 'nospecial
+(defcustom bookmark-version-control 'nospecial
"*Whether or not to make numbered backups of the bookmark file.
It can have four values: t, nil, `never', and `nospecial'.
The first three have the same meaning that they do for the
variable `version-control', and the final value `nospecial' means just
-use the value of `version-control'.")
+use the value of `version-control'."
+ :type '(choice (const t) (const nil) (const never) (const nospecial))
+ :group 'bookmark)
-(defvar bookmark-completion-ignore-case t
- "*Non-nil means bookmark functions ignore case in completion.")
+(defcustom bookmark-completion-ignore-case t
+ "*Non-nil means bookmark functions ignore case in completion."
+ :type 'boolean
+ :group 'bookmark)
-(defvar bookmark-sort-flag t
- "*Non-nil means that bookmarks will be displayed sorted by bookmark
-name. Otherwise they will be displayed in LIFO order (that is, most
-recently set ones come first, oldest ones come last).")
+(defcustom bookmark-sort-flag t
+ "*Non-nil means that bookmarks will be displayed sorted by bookmark name.
+Otherwise they will be displayed in LIFO order (that is, most
+recently set ones come first, oldest ones come last)."
+ :type 'boolean
+ :group 'bookmark)
-(defvar bookmark-automatically-show-annotations t
- "*Nil means don't show annotations when jumping to a bookmark.")
+(defcustom bookmark-automatically-show-annotations t
+ "*Nil means don't show annotations when jumping to a bookmark."
+ :type 'boolean
+ :group 'bookmark)
-(defvar bookmark-bmenu-file-column 30
+(defcustom bookmark-bmenu-file-column 30
"*Column at which to display filenames in a buffer listing bookmarks.
-You can toggle whether files are shown with \\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-toggle-filenames].")
+You can toggle whether files are shown with \\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-toggle-filenames]."
+ :type 'integer
+ :group 'bookmark)
-(defvar bookmark-bmenu-toggle-filenames t
+(defcustom bookmark-bmenu-toggle-filenames t
"*Non-nil means show filenames when listing bookmarks.
This may result in truncated bookmark names. To disable this, put the
-following in your .emacs:
+following in your `.emacs' file:
-\(setq bookmark-bmenu-toggle-filenames nil\)")
+\(setq bookmark-bmenu-toggle-filenames nil\)"
+ :type 'boolean
+ :group 'bookmark)
-(defvar bookmark-menu-length 70
- "*Maximum length of a bookmark name displayed on a popup menu.")
+(defcustom bookmark-menu-length 70
+ "*Maximum length of a bookmark name displayed on a popup menu."
+ :type 'integer
+ :group 'boolean)
;;; No user-serviceable parts beyond this point.
(defun bookmark-insert-file-format-version-stamp ()
- "Insert text indicating current version of bookmark file-format."
+ "Insert text indicating current version of bookmark file format."
(insert
(format ";;;; Emacs Bookmark Format Version %d ;;;;\n"
bookmark-file-format-version))
(defun bookmark-send-annotation ()
- "After remove lines beginning with '#', use the contents of this buffer
-as the annotation for a bookmark, and store it in the bookmark list with
+ "Use buffer contents as the annotation for a bookmark.
+Exclude lines that begin with `#'.
+Store the annotation text in the bookmark list with
the bookmark (and file, and point) specified in buffer local variables."
(interactive)
(if (not (eq major-mode 'bookmark-read-annotation-mode))
(defvar bookmark-read-annotation-text-func 'bookmark-default-annotation-text
- "A variable containing a function which returns the text to insert
-into an annotation composition buffer. It takes the name of the bookmark,
-as a string, as an arg.")
-
+ "Function to return default text to use for a bookmark annotation.
+It takes the name of the bookmark, as a string, as an arg.")
(defun bookmark-read-annotation-mode (buf point parg bookmark)
"Mode for composing annotations for a bookmark.
(defun bookmark-read-annotation (parg bookmark)
- "Pop up a buffer for entering a bookmark annotation. Text surrounding
-the bookmark is PARG; the bookmark name is BOOKMARK."
+ "Pop up a buffer for entering a bookmark annotation.
+Text surrounding the bookmark is PARG; the bookmark name is BOOKMARK."
(let ((buf (current-buffer))
(point (point)))
(pop-to-buffer (generate-new-buffer-name "*Bookmark Annotation Compose*"))
(defun bookmark-send-edited-annotation ()
- "After remove lines beginning with '#', use the contents of this buffer
-as the new annotation for a bookmark."
+ "Use buffer contents (minus beginning with `#' as annotation for a bookmark."
(interactive)
(if (not (eq major-mode 'bookmark-edit-annotation-mode))
(error "Not in bookmark-edit-annotation-mode"))
(defun bookmark-insert-current-bookmark ()
- "Insert this buffer's value of bookmark-current-bookmark, default
-to file name if it's nil."
+ "Insert this buffer's value of bookmark-current-bookmark.
+Default to file name if it's nil."
(interactive)
(let ((str
(save-excursion
(defun bookmark-insert-buffer-name ()
- "Insert the name (sans path) of the current file into the bookmark
-name that is being set."
+ "Insert the current file name into the bookmark name being set.
+The directory part of the file name is not used."
(interactive)
(let ((str
(save-excursion
(defun bookmark-maybe-load-default-file ()
(and (not bookmarks-already-loaded)
(null bookmark-alist)
-
(prog2
(and
;; Possibly the old bookmark file, "~/.emacs-bkmrks", needs
;; rather than after and remain perhaps unaware of the changes.
(if forward-str
(if (search-forward forward-str (point-max) t)
- (backward-char (length forward-str))))
+ (goto-char (match-beginning 0))))
(if behind-str
(if (search-backward behind-str (point-min) t)
- (forward-char (length behind-str))))
+ (goto-char (match-end 0))))
;; added by db
(setq bookmark-current-bookmark str)
(cons (current-buffer) (point)))
;;;###autoload
(defun bookmark-relocate (bookmark)
- "Relocate BOOKMARK -- prompts for a filename, and makes an already
-existing bookmark point to that file, instead of the one it used to
-point at. Useful when a file has been renamed after a bookmark was
-set in it."
+ "Relocate BOOKMARK to another file (reading file name with minibuffer).
+This makes an already existing bookmark point to that file, instead of
+the one it used to point at. Useful when a file has been renamed
+after a bookmark was set in it."
(interactive (bookmark-completing-read "Bookmark to relocate"))
(bookmark-maybe-historicize-string bookmark)
(bookmark-maybe-load-default-file)
minibuffer history list `bookmark-history'."
(interactive (bookmark-completing-read "Insert bookmark location"))
(or no-history (bookmark-maybe-historicize-string bookmark))
- (insert (bookmark-location bookmark)))
+ (let ((start (point)))
+ (prog1
+ (insert (bookmark-location bookmark)) ; *Return this line*
+ (if window-system
+ (put-text-property start
+ (save-excursion (re-search-backward
+ "[^ \t]")
+ (1+ (point)))
+ 'mouse-face 'highlight)))))
-;;; old name for above:
+;;;###autoload
(defalias 'bookmark-locate 'bookmark-insert-location)
(defun bookmark-location (bookmark)
;;;###autoload
(defun bookmark-rename (old &optional new)
- "Change the name of OLD bookmark to NEW name. If called from
-keyboard, prompts for OLD and NEW. If called from menubar, OLD is
-selected from a menu, and prompts for NEW.
+ "Change the name of OLD bookmark to NEW name.
+If called from keyboard, prompt for OLD and NEW. If called from
+menubar, select OLD from a menu and prompt for NEW.
-If called from Lisp, prompts for NEW if only OLD was passed as an
+If called from Lisp, prompt for NEW if only OLD was passed as an
argument. If called with two strings, then no prompting is done. You
must pass at least OLD when calling from Lisp.
;;;###autoload
(defun bookmark-write ()
- "Write bookmarks to a file \(for which the user will be prompted
-interactively\). Don't use this in Lisp programs; use bookmark-save
-instead."
+ "Write bookmarks to a file (reading the file name with the minibuffer).
+Don't use this in Lisp programs; use `bookmark-save' instead."
(interactive)
(bookmark-maybe-load-default-file)
(bookmark-save t))
(define-key bookmark-bmenu-mode-map "2" 'bookmark-bmenu-2-window)
(define-key bookmark-bmenu-mode-map "1" 'bookmark-bmenu-1-window)
(define-key bookmark-bmenu-mode-map "j" 'bookmark-bmenu-this-window)
+ (define-key bookmark-bmenu-mode-map "\C-c\C-c" 'bookmark-bmenu-this-window)
(define-key bookmark-bmenu-mode-map "f" 'bookmark-bmenu-this-window)
(define-key bookmark-bmenu-mode-map "o" 'bookmark-bmenu-other-window)
- (define-key bookmark-bmenu-mode-map "\C-o" 'bookmark-bmenu-switch-other-window)
+ (define-key bookmark-bmenu-mode-map "\C-o"
+ 'bookmark-bmenu-switch-other-window)
(define-key bookmark-bmenu-mode-map "s" 'bookmark-bmenu-save)
(define-key bookmark-bmenu-mode-map "k" 'bookmark-bmenu-delete)
(define-key bookmark-bmenu-mode-map "\C-d" 'bookmark-bmenu-delete-backwards)
(define-key bookmark-bmenu-mode-map "t" 'bookmark-bmenu-toggle-filenames)
(define-key bookmark-bmenu-mode-map "a" 'bookmark-bmenu-show-annotation)
(define-key bookmark-bmenu-mode-map "A" 'bookmark-bmenu-show-all-annotations)
- (define-key bookmark-bmenu-mode-map "e" 'bookmark-bmenu-edit-annotation))
+ (define-key bookmark-bmenu-mode-map "e" 'bookmark-bmenu-edit-annotation)
+ (define-key bookmark-bmenu-mode-map [mouse-2]
+ 'bookmark-bmenu-other-window-with-mouse))
(not (string-equal annotation "")))
(insert " *")
(insert " "))
- (insert (concat (bookmark-name-from-full-record full-record) "\n"))))
+ (let ((start (point)))
+ (insert (bookmark-name-from-full-record full-record))
+ (if window-system
+ (put-text-property start
+ (save-excursion (re-search-backward
+ "[^ \t]")
+ (1+ (point)))
+ 'mouse-face 'highlight))
+ (insert "\n")
+ )))
bookmark-alist))
(goto-char (point-min))
(forward-line 2)
(let ((bmrk (bookmark-bmenu-bookmark)))
(setq bookmark-bmenu-hidden-bookmarks
(cons bmrk bookmark-bmenu-hidden-bookmarks))
- (move-to-column bookmark-bmenu-file-column t)
- (delete-region (point) (progn (end-of-line) (point)))
+ (let ((start (save-excursion (end-of-line) (point))))
+ (move-to-column bookmark-bmenu-file-column t)
+ ;; Strip off `mouse-face' from the white spaces region.
+ (if window-system
+ (remove-text-properties start (point)
+ '(mouse-face))))
+ (delete-region (point) (progn (end-of-line) (point)))
(insert " ")
;; Pass the NO-HISTORY arg:
(bookmark-insert-location bmrk t)
(while bookmark-bmenu-hidden-bookmarks
(move-to-column bookmark-bmenu-bookmark-column t)
(bookmark-kill-line)
- (insert (car bookmark-bmenu-hidden-bookmarks))
+ (let ((start (point)))
+ (insert (car bookmark-bmenu-hidden-bookmarks))
+ (if window-system
+ (put-text-property start
+ (save-excursion (re-search-backward
+ "[^ \t]")
+ (1+ (point)))
+ 'mouse-face 'highlight)))
(setq bookmark-bmenu-hidden-bookmarks
(cdr bookmark-bmenu-hidden-bookmarks))
(forward-line 1))))))))
(beginning-of-line)
(forward-char bookmark-bmenu-bookmark-column)
(prog1
- (buffer-substring (point)
+ (buffer-substring-no-properties (point)
(progn
(end-of-line)
(point)))
(defun bookmark-bmenu-mark ()
- "Mark bookmark on this line to be displayed by \\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-select] command."
+ "Mark bookmark on this line to be displayed by \\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-select]."
(interactive)
(beginning-of-line)
(if (bookmark-bmenu-check-position)
(set-buffer o-buffer))
(bookmark-show-annotation bookmark)))))
+(defun bookmark-bmenu-other-window-with-mouse (event)
+ "Select bookmark at the mouse pointer in other window, leaving bookmark menu visible."
+ (interactive "e")
+ (save-excursion
+ (set-buffer (window-buffer (posn-window (event-end event))))
+ (save-excursion
+ (goto-char (posn-point (event-end event)))
+ (bookmark-bmenu-other-window))))
+
(defun bookmark-bmenu-show-annotation ()
"Show the annotation for the current bookmark in another window."
(defun bookmark-bmenu-delete ()
- "Mark bookmark on this line to be deleted by \\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-execute-deletions] command."
+ "Mark bookmark on this line to be deleted.
+To carry out the deletions that you've marked, use \\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-execute-deletions]."
(interactive)
(beginning-of-line)
(if (bookmark-bmenu-check-position)
(defun bookmark-bmenu-delete-backwards ()
- "Mark bookmark on this line to be deleted by \\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-execute-deletions] command
-and then move up one line"
+ "Mark bookmark on this line to be deleted, then move up one line.
+To carry out the deletions that you've marked, use \\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-execute-deletions]."
(interactive)
(bookmark-bmenu-delete)
(forward-line -2)
;; We MUST autoload EACH form used to set up this variable's value, so
;; that the whole job is done in loaddefs.el.
-;; FSF Emacs menubar stuff
-;; The odd conditional structure is due to the limitations of autoload
-;; cookies.
+;; Emacs menubar stuff.
;;;###autoload
(defvar menu-bar-bookmark-map (make-sparse-keymap "Bookmark functions"))