;;; bookmark.el --- set bookmarks, maybe annotate them, jump to them later.
-;; Copyright (C) 1993, 1994, 1995 Free Software Foundation
+;; Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation
-;; Author: Karl Fogel <kfogel@cyclic.com>
-;; Maintainer: Karl Fogel <kfogel@cyclic.com>
+;; Author: Karl Fogel <kfogel@red-bean.com>
+;; Maintainer: Karl Fogel <kfogel@red-bean.com>
;; Created: July, 1993
-;; Author's Update Number: 2.6.13
+;; Author's Update Number: see variable `bookmark-version'.
;; Keywords: bookmarks, placeholders, annotations
-;;; Summary:
-;; This package is for setting "bookmarks" in files. A bookmark
-;; associates a string with a location in a certain file. Thus, you
-;; can navigate your way to that location by providing the string.
-;; See the "User Variables" section for customizations.
-
-;;; Copyright info:
;; This file is part of GNU Emacs.
;; GNU Emacs is free software; you can redistribute it and/or modify
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to
-;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; This package is for setting "bookmarks" in files. A bookmark
+;; associates a string with a location in a certain file. Thus, you
+;; can navigate your way to that location by providing the string.
+;; See the "User Variables" section for customizations.
;; Thanks to David Bremner <bremner@cs.sfu.ca> for thinking of and
;; then implementing the bookmark-current-bookmark idea. He even
;; bookmark-bmenu-check-position, and some of the Lucid compatibility
;; stuff).
-;; Kudos (whatever they are) go to Jim Blandy <jimb@cyclic.com>
+;; Kudos (whatever they are) go to Jim Blandy <jimb@red-bean.com>
;; for his eminently sensible suggestion to separate bookmark-jump
;; into bookmark-jump and bookmark-jump-noselect, which made many
;; other things cleaner as well.
;; Thanks to Mikio Nakajima <PBC01764@niftyserve.or.jp> for many bugs
;; reported and fixed.
+;; Thank you, Michael Kifer, for contributing the XEmacs support.
+
;; Enough with the credits already, get on to the good stuff:
;; FAVORITE CHINESE RESTAURANT:
;; Boy, that's a tough one. Probably Hong Min, or maybe Emperor's
;; Choice (both in Chicago's Chinatown). Well, both. How about you?
-
\f
+;;;; Code:
+
(require 'pp)
-\f
-;;;; Code:
+(defconst bookmark-version "2.6.20"
+ "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.")
;;; Misc comments:
;;
--> Nil means never save bookmarks, except when `bookmark-save' is
explicitly called \(\\[bookmark-save]\).
--> t means save bookmarks when Emacs is killed.
---> Otherise, it should be a number that is the frequency with which
+--> Otherwise, it should be a number that is the frequency with which
the bookmark list is saved \(i.e.: the number of times which
Emacs' bookmark list may be modified before it is automatically
saved.\). If it is a number, Emacs will also automatically save
;;; No user-serviceable parts beyond this point.
+;; Is it XEmacs?
+(defconst bookmark-xemacsp
+ (string-match "\\(Lucid\\|Xemacs\\)" emacs-version))
+
+
;; Added for lucid emacs compatibility, db
(or (fboundp 'defalias) (fset 'defalias 'fset))
;; suggested for lucid compatibility by david hughes:
(or (fboundp 'frame-height) (defalias 'frame-height 'screen-height))
+;; This variable is probably obsolete now...
+(or (boundp 'baud-rate)
+ ;; some random value higher than 9600
+ (setq baud-rate 19200))
+
+;; XEmacs apparently call this `buffer-substring-without-properties',
+;; sigh.
+(or (fboundp 'buffer-substring-no-properties)
+ (if (fboundp 'buffer-substring-without-properties)
+ (fset 'buffer-substring-no-properties
+ 'buffer-substring-without-properties)
+ (fset 'buffer-substring-no-properties 'buffer-substring)))
\f
;;; Keymap stuff:
this name."
(bookmark-maybe-load-default-file)
(let ((stripped-name (copy-sequence name)))
- (set-text-properties 0 (length stripped-name) nil stripped-name)
+ (or bookmark-xemacsp
+ ;; XEmacs's `set-text-properties' doesn't work on
+ ;; free-standing strings, apparently.
+ (set-text-properties 0 (length stripped-name) nil stripped-name))
(if (and (bookmark-get-bookmark stripped-name) (not overwrite))
- ;; already existing boookmark under that name and
+ ;; already existing bookmark under that name and
;; no prefix arg means just overwrite old bookmark
(setcdr (bookmark-get-bookmark stripped-name)
(list (bookmark-make-cell annotation)))
(forward-char -1)
(read (current-buffer)))
;; Else no hope of getting information here.
- (error "Not bookmark format.")))))
+ (error "Not bookmark format")))))
(defun bookmark-upgrade-version-0-alist (old-list)
(pp new-list (current-buffer))
(save-buffer))
(goto-char (point-min))
- (message "Upgrading bookmark format from 0 to %d... done."
+ (message "Upgrading bookmark format from 0 to %d...done"
bookmark-file-format-version)
)
((= version 0)
(bookmark-upgrade-file-format-from-0))
(t
- (error "Bookmark file format version strangeness.")))))
+ (error "Bookmark file format version strangeness")))))
(defun bookmark-insert-file-format-version-stamp ()
(interactive (list nil current-prefix-arg))
(or
(bookmark-buffer-file-name)
- (error "Buffer not visiting a file or directory."))
+ (error "Buffer not visiting a file or directory"))
(bookmark-maybe-load-default-file)
the bookmark (and file, and point) specified in buffer local variables."
(interactive)
(if (not (eq major-mode 'bookmark-read-annotation-mode))
- (error "Not in bookmark-read-annotation-mode."))
+ (error "Not in bookmark-read-annotation-mode"))
(goto-char (point-min))
(while (< (point) (point-max))
(if (looking-at "^#")
(defvar bookmark-read-annotation-text-func 'bookmark-default-annotation-text
"A variable containing a function which returns the text to insert
-into an annotation compisition buffer. It takes the name of the bookmark,
+into an annotation composition buffer. It takes the name of the bookmark,
as a string, as an arg.")
as the new annotation for a bookmark."
(interactive)
(if (not (eq major-mode 'bookmark-edit-annotation-mode))
- (error "Not in bookmark-edit-annotation-mode."))
+ (error "Not in bookmark-edit-annotation-mode"))
(goto-char (point-min))
(while (< (point) (point-max))
(if (looking-at "^#")
must pass at least OLD when calling from Lisp.
While you are entering the new name, consecutive C-w's insert
-consectutive words from the text of the buffer into the new bookmark
+consecutive words from the text of the buffer into the new bookmark
name."
(interactive (bookmark-completing-read "Old bookmark name"))
(bookmark-maybe-historicize-string old)
(let ((will-go (bookmark-get-bookmark bookmark)))
(setq bookmark-alist (delq will-go bookmark-alist))
;; Added by db, nil bookmark-current-bookmark if the last
- ;; occurence has been deleted
+ ;; occurrence has been deleted
(or (bookmark-get-bookmark bookmark-current-bookmark)
(setq bookmark-current-bookmark nil)))
;; Don't rebuild the list
(save-excursion
(save-window-excursion
(if (>= baud-rate 9600)
- (message (format "Saving bookmarks to file %s..." file)))
+ (message "Saving bookmarks to file %s..." file))
(set-buffer (let ((enable-local-variables nil))
(find-file-noselect file)))
(goto-char (point-min))
(write-file file)
(kill-buffer (current-buffer))
(if (>= baud-rate 9600)
- (message (format "Saving bookmarks to file %s... done." file)))
+ (message "Saving bookmarks to file %s...done" file))
))))
(save-excursion
(save-window-excursion
(if (and (null no-msg) (>= baud-rate 9600))
- (message (format "Loading bookmarks from %s..." file)))
+ (message "Loading bookmarks from %s..." file))
(set-buffer (let ((enable-local-variables nil))
(find-file-noselect file)))
(goto-char (point-min))
(setq bookmark-alist
(append blist (if (not revert) bookmark-alist)))
(bookmark-bmenu-surreptitiously-rebuild-list))
- (error (format "Invalid bookmark list in %s." file))))
+ (error "Invalid bookmark list in %s" file)))
(kill-buffer (current-buffer)))
(if (and (null no-msg) (>= baud-rate 9600))
- (message (format "Loading bookmarks from %s... done" file))))
- (error (format "Cannot read bookmark file %s." file))))
+ (message "Loading bookmarks from %s...done" file)))
+ (error "Cannot read bookmark file %s" file)))
\f
(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 "x" 'bookmark-bmenu-execute-deletions)
- (define-key bookmark-bmenu-mode-map "\C-k" 'bookmark-bmenu-delete)
(define-key bookmark-bmenu-mode-map "d" 'bookmark-bmenu-delete)
(define-key bookmark-bmenu-mode-map " " 'next-line)
(define-key bookmark-bmenu-mode-map "n" 'next-line)
(bookmark-maybe-sort-alist)
(mapcar
(lambda (full-record)
- ;; if a bookmark has an annotation, preceed it with a "*"
+ ;; if a bookmark has an annotation, prepend a "*"
;; in the list of bookmarks.
(let ((annotation (bookmark-get-annotation
(bookmark-name-from-full-record full-record))))
"Major mode for editing a list of bookmarks.
Each line describes one of the bookmarks in Emacs.
Letters do not insert themselves; instead, they are commands.
-Bookmark names preceeded by a \"*\" have annotations.
+Bookmark names preceded by a \"*\" have annotations.
\\<bookmark-bmenu-mode-map>
\\[bookmark-bmenu-mark] -- mark bookmark to be displayed.
\\[bookmark-bmenu-select] -- select bookmark of line point is on.
\\[bookmark-bmenu-rename] -- rename this bookmark \(prompts for new name\).
\\[bookmark-bmenu-delete] -- mark this bookmark to be deleted, and move down.
\\[bookmark-bmenu-delete-backwards] -- mark this bookmark to be deleted, and move up.
-\\[bookmark-bmenu-execute-deletions] -- delete marked bookmarks.
+\\[bookmark-bmenu-execute-deletions] -- delete bookmarks marked with `\\[bookmark-bmenu-delete]'.
\\[bookmark-bmenu-save] -- save the current bookmark list in the default file.
With a prefix arg, prompts for a file to save in.
\\[bookmark-bmenu-load] -- load in a file of bookmarks (prompts for file.)
(defun bookmark-bmenu-execute-deletions ()
"Delete bookmarks marked with \\<Buffer-menu-mode-map>\\[Buffer-menu-delete] commands."
(interactive)
+ (message "Deleting bookmarks...")
(let ((hide-em bookmark-bmenu-toggle-filenames)
(o-point (point))
(o-str (save-excursion
(setq bookmark-alist-modification-count
(1+ bookmark-alist-modification-count))
(if (bookmark-time-to-save-p)
- (bookmark-save))))
+ (bookmark-save))
+ (message "Deleting bookmarks...done")
+ ))
(defun bookmark-bmenu-rename ()
(cons (concat "-*- " name " -*-") pane-list)))
+(defun bookmark-build-xemacs-menu (name entries function)
+ "Build a menu named NAME from the strings in ENTRIES.
+That is, ENTRIES is a list of strings that appear as the choices
+in the menu.
+The visible entries are truncated to `bookmark-menu-length', but the
+strings returned are not."
+ (let* (lst
+ (pane-list
+ (progn
+ (while entries
+ (let ((str (car entries)))
+ (setq lst (cons
+ (vector
+ (if (> (length str) bookmark-menu-length)
+ (substring str 0 bookmark-menu-length)
+ str)
+ (list function str)
+ t)
+ lst))
+ (setq entries (cdr entries))))
+ (nreverse lst))))
+
+ ;; Return the menu:
+ (append (if popup-menu-titles (list (concat "-*- " name " -*-")))
+ pane-list)))
+
+
(defun bookmark-menu-popup-paned-menu (event name entries)
"Pop up multi-paned menu at EVENT, return string chosen from ENTRIES.
That is, ENTRIES is a list of strings which appear as the choices
is done. You must pass at least OLD-BOOKMARK when calling from Lisp.
While you are entering the new name, consecutive C-w's insert
-consectutive words from the text of the buffer into the new bookmark
+consecutive words from the text of the buffer into the new bookmark
name.
Warning: this function only takes an EVENT as argument. Use the
;; 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.
+
;;;###autoload
(defvar menu-bar-bookmark-map (make-sparse-keymap "Bookmark functions"))
-
+
;;;###autoload
(defalias 'menu-bar-bookmark-map (symbol-value 'menu-bar-bookmark-map))
+;; make bookmarks appear toward the right side of the menu.
+(if (boundp 'menu-bar-final-items)
+ (if menu-bar-final-items
+ (setq menu-bar-final-items
+ (cons 'bookmark menu-bar-final-items)))
+ (setq menu-bar-final-items '(bookmark)))
+
;;;###autoload
(define-key menu-bar-bookmark-map [load]
- '("Load a Bookmark File" . bookmark-load))
+ '("Load a Bookmark File..." . bookmark-load))
;;;###autoload
(define-key menu-bar-bookmark-map [write]
- '("Write \(to another file\)" . bookmark-write))
+ '("Save Bookmarks As..." . bookmark-write))
;;;###autoload
(define-key menu-bar-bookmark-map [save]
- '("Save \(in default file\)" . bookmark-save))
+ '("Save Bookmarks" . bookmark-save))
;;;###autoload
(define-key menu-bar-bookmark-map [edit]