X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/52b9a93170c1540d45c60ceeaff468fcfc5a1744..4be9beaf4e4120f67dbf525a84789525bfef2ef8:/lisp/saveplace.el diff --git a/lisp/saveplace.el b/lisp/saveplace.el index a33ccbcd7f..5ac3f344c6 100644 --- a/lisp/saveplace.el +++ b/lisp/saveplace.el @@ -5,7 +5,6 @@ ;; Author: Karl Fogel ;; Maintainer: FSF ;; Created: July, 1993 -;; Version: 1.2 ;; Keywords: bookmarks, placeholders ;; This file is part of GNU Emacs. @@ -41,6 +40,11 @@ ;; this is what I was using during testing: ;; (define-key ctl-x-map "p" 'toggle-save-place) +(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. Each element looks like (FILENAME . POSITION); @@ -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,37 @@ 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 + :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 +125,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))) @@ -180,9 +197,7 @@ To save places automatically in all files, put this in your `.emacs' file: (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,17 +219,19 @@ 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 + (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))))) (defun save-place-kill-emacs-hook () + ;; First update the alist. This loads the old save-place-file if nec. + (save-places-to-alist) + ;; Now save the alist in the file, if we have ever loaded the file + ;; (including just now). (if save-place-loaded - (progn - (save-places-to-alist) - (save-place-alist-to-file)))) + (save-place-alist-to-file))) (add-hook 'find-file-hooks 'save-place-find-file-hook t)