*** empty log message ***
[bpt/emacs.git] / lisp / saveplace.el
index 6689f9b..d8706de 100644 (file)
@@ -1,11 +1,10 @@
-;;; saveplace.el --- automatically save place in files.
+;;; saveplace.el --- automatically save place in files
 
-;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
+;; Copyright (C) 1993, 1994, 2001 Free Software Foundation, Inc.
 
-;; Author: Karl Fogel <kfogel@cs.oberlin.edu>
+;; Author: Karl Fogel <kfogel@red-bean.com>
 ;; Maintainer: FSF
 ;; Created: July, 1993
-;; Version: See variable `save-place-version'.
 ;; Keywords: bookmarks, placeholders
 
 ;; This file is part of GNU Emacs.
@@ -25,6 +24,8 @@
 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 ;; Boston, MA 02111-1307, USA.
 
+;;; Commentary:
+
 ;; Automatically save place in files, so that visiting them later
 ;; (even during a different Emacs session) automatically moves point
 ;; to the saved position, when the file is first found.  Uses the
 ;; Thanks to Stefan Schoef, who sent a patch with the
 ;; `save-place-version-control' stuff in it.
 
+;;; Code:
+
 ;; this is what I was using during testing:
 ;; (define-key ctl-x-map "p" 'toggle-save-place)
 
-(defconst save-place-version "1.4"
-  "The version number of this release of saveplace.  This is unrelated
-to the version of Emacs itself, except that they change colinearly.")
+(defgroup save-place nil
+  "Automatically save place in files."
+  :group 'data)
+
 
 (defvar save-place-alist nil
   "Alist of saved places to go back to when revisiting files.
@@ -48,7 +52,7 @@ visiting file FILENAME goes automatically to position POSITION
 rather than the beginning of the buffer.
 This alist is saved between Emacs sessions.")
 
-(defvar save-place nil
+(defcustom save-place nil
   "*Non-nil means automatically save place in each file.
 This means when you visit a file, point goes to the last place
 where it was when you previously visited the same file.
@@ -57,25 +61,38 @@ This variable is automatically buffer-local.
 If you wish your place in any file to always be automatically saved,
 simply put this in your `~/.emacs' file:
 
-\(setq-default save-place t\)")
+\(setq-default save-place t\)"
+  :type 'boolean
+  :require 'saveplace
+  :group 'save-place)
 
 (make-variable-buffer-local 'save-place)
 
-(defvar save-place-file (convert-standard-filename "~/.emacs-places")
-  "*Name of the file that records `save-place-alist' value.")
+(defcustom save-place-file (convert-standard-filename "~/.emacs-places")
+  "*Name of the file that records `save-place-alist' value."
+  :type 'file
+  :group 'save-place)
 
-(defvar save-place-version-control 'nospecial
+(defcustom save-place-version-control nil
   "*Controls whether to make numbered backups of master save-place 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'.")
+value of `version-control'."
+  :type '(radio (const :tag "Unconditionally" t)
+               (const :tag "For VC Files" nil)
+               (const never)
+               (const :tag "Use value of `version-control'" nospecial))
+  :group 'save-place)
 
 (defvar save-place-loaded nil
   "Non-nil means that the `save-place-file' has been loaded.")
 
-(defvar save-place-limit nil
-  "Maximum number of entries to retain in the list; nil means no limit.")
+(defcustom save-place-limit nil
+  "Maximum number of entries to retain in the list; nil means no limit."
+  :type '(choice (integer :tag "Entries" :value 1)
+                (const :tag "No Limit" nil))
+  :group 'save-place)
 
 (defun toggle-save-place (&optional parg)
   "Toggle whether to save your place in this file between sessions.
@@ -109,16 +126,17 @@ To save places automatically in all files, put this in your `.emacs' file:
   (or save-place-loaded (load-save-place-alist-from-file))
   (if buffer-file-name
       (progn
-        (let ((cell (assoc buffer-file-name save-place-alist)))
+        (let ((cell (assoc buffer-file-name save-place-alist))
+             (position (if (not (eq major-mode 'hexl-mode))
+                           (point)
+                         (1+ (hexl-current-address)))))
           (if cell
-              (setq save-place-alist (delq cell save-place-alist))))
-        (if save-place
-            (setq save-place-alist
-                  (cons (cons buffer-file-name 
-                              (if (not (eq major-mode 'hexl-mode))
-                                 (point)
-                               (1+ (hexl-current-address))))
-                        save-place-alist))))))
+              (setq save-place-alist (delq cell save-place-alist)))
+         (if (and save-place
+                  (not (= position 1)))  ;; Optimize out the degenerate case.
+             (setq save-place-alist
+                   (cons (cons buffer-file-name position)
+                         save-place-alist)))))))
 
 (defun save-place-alist-to-file ()
   (let ((file (expand-file-name save-place-file)))
@@ -126,10 +144,6 @@ To save places automatically in all files, put this in your `.emacs' file:
       (message "Saving places to %s..." file)
       (set-buffer (get-buffer-create " *Saved Places*"))
       (delete-region (point-min) (point-max))
-      (if (file-readable-p file)
-          (insert-file-contents file))
-      (delete-region (point-min) (point-max))
-      (goto-char (point-min))
       (print save-place-alist (current-buffer))
       (let ((version-control
              (cond
@@ -158,7 +172,7 @@ To save places automatically in all files, put this in your `.emacs' file:
                 (delete-region (point-min) (point-max))
                 (insert-file-contents file)
                 (goto-char (point-min))
-                (setq save-place-alist 
+                (setq save-place-alist
                       (car (read-from-string
                             (buffer-substring (point-min) (point-max)))))
 
@@ -178,11 +192,9 @@ To save places automatically in all files, put this in your `.emacs' file:
                               (setcdr s nil)
                             (setq count (1+ count)))
                           (setq s (cdr s))))))
-                  
+
                 (kill-buffer (current-buffer))
-                (message "Loading places from %s...done" file)
-                t)
-            t)
+                (message "Loading places from %s...done" file)))
           nil))))
 
 (defun save-places-to-alist ()
@@ -204,9 +216,9 @@ To save places automatically in all files, put this in your `.emacs' file:
   (or save-place-loaded (load-save-place-alist-from-file))
   (let ((cell (assoc buffer-file-name save-place-alist)))
     (if cell
-        (progn
-          (or after-find-file-from-revert-buffer
-              (goto-char (cdr cell)))
+       (progn
+         (or after-find-file-from-revert-buffer
+             (goto-char (cdr cell)))
           ;; and make sure it will be saved again for later
           (setq save-place t)))))
 
@@ -218,7 +230,7 @@ To save places automatically in all files, put this in your `.emacs' file:
   (if save-place-loaded
       (save-place-alist-to-file)))
 
-(add-hook 'find-file-hooks 'save-place-find-file-hook t)
+(add-hook 'find-file-hook 'save-place-find-file-hook t)
 
 (add-hook 'kill-emacs-hook 'save-place-kill-emacs-hook)
 
@@ -226,5 +238,5 @@ To save places automatically in all files, put this in your `.emacs' file:
 
 (provide 'saveplace) ; why not...
 
+;;; arch-tag: 3c2ef47b-0a22-4558-b116-118c9ef454a0
 ;;; saveplace.el ends here
-