]> code.delx.au - gnu-emacs/blobdiff - lisp/saveplace.el
* net/tramp.el (tramp-ssh-controlmaster-template): Make it a
[gnu-emacs] / lisp / saveplace.el
index 6ef259b2aaec95c984f2e9fa759c28ff4e0d4634..baa6b794fc4d3643f3b136cfc8a4e499a4275bb7 100644 (file)
@@ -1,7 +1,6 @@
 ;;; saveplace.el --- automatically save place in files
 
-;; Copyright (C) 1993, 1994, 2001, 2002, 2003, 2004,
-;;   2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+;; Copyright (C) 1993-1994, 2001-2013 Free Software Foundation, Inc.
 
 ;; Author: Karl Fogel <kfogel@red-bean.com>
 ;; Maintainer: FSF
@@ -57,13 +56,12 @@ This means when you visit a file, point goes to the last place
 where it was when you previously visited the same file.
 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:
+If you wish your place in any file to always be automatically
+saved, set this to t using the Customize facility, or put the
+following code in your init file:
 
 \(setq-default save-place t)
-\(require 'saveplace)
-
-or else use the Custom facility to set this option."
+\(require 'saveplace)"
   :type 'boolean
   :require 'saveplace
   :group 'save-place)
@@ -90,8 +88,9 @@ value of `version-control'."
 (defvar save-place-loaded nil
   "Non-nil means that the `save-place-file' has been loaded.")
 
-(defcustom save-place-limit nil
+(defcustom save-place-limit 400
   "Maximum number of entries to retain in the list; nil means no limit."
+  :version "24.1"                       ; nil -> 400
   :type '(choice (integer :tag "Entries" :value 1)
                 (const :tag "No Limit" nil))
   :group 'save-place)
@@ -130,6 +129,15 @@ Files for which such a check may be inconvenient include those on
 removable and network volumes."
   :type 'regexp :group 'save-place)
 
+(defcustom save-place-ignore-files-regexp
+  "\\(?:COMMIT_EDITMSG\\|hg-editor-[[:alnum:]]+\\.txt\\|svn-commit\\.tmp\\|bzr_log\\.[[:alnum:]]+\\)$"
+  "Regexp matching files for which no position should be recorded.
+Useful for temporary file such as commit message files that are
+automatically created by the VCS.  If set to nil, this feature is
+disabled, i.e., the position is recorded for all files."
+  :version "24.1"
+  :type 'regexp :group 'save-place)
+
 (defun toggle-save-place (&optional parg)
   "Toggle whether to save your place in this file between sessions.
 If this mode is enabled, point is recorded when you kill the buffer
@@ -139,7 +147,8 @@ even in a later Emacs session.
 If called with a prefix arg, the mode is enabled if and only if
 the argument is positive.
 
-To save places automatically in all files, put this in your `.emacs' file:
+To save places automatically in all files, put this in your init
+file:
 
 \(setq-default save-place t\)"
   (interactive "P")
@@ -160,20 +169,22 @@ To save places automatically in all files, put this in your `.emacs' file:
   ;; file.  If not, do so, then feel free to modify the alist.  It
   ;; will be saved again when Emacs is killed.
   (or save-place-loaded (load-save-place-alist-from-file))
-  (if buffer-file-name
-      (progn
-        (let ((cell (assoc buffer-file-name save-place-alist))
-             (position (if (not (eq major-mode 'hexl-mode))
-                           (point)
-                         (with-no-warnings
-                           (1+ (hexl-current-address))))))
-          (if cell
-              (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)))))))
+  (when (and buffer-file-name
+            (or (not save-place-ignore-files-regexp)
+                (not (string-match save-place-ignore-files-regexp
+                                   buffer-file-name))))
+    (let ((cell (assoc buffer-file-name save-place-alist))
+         (position (if (not (eq major-mode 'hexl-mode))
+                       (point)
+                     (with-no-warnings
+                       (1+ (hexl-current-address))))))
+      (if cell
+         (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-forget-unreadable-files ()
   "Remove unreadable files from `save-place-alist'.
@@ -205,8 +216,7 @@ may have changed\) back to `save-place-alist'."
 (defun save-place-alist-to-file ()
   (let ((file (expand-file-name save-place-file))
         (coding-system-for-write 'utf-8))
-    (save-excursion
-      (set-buffer (get-buffer-create " *Saved Places*"))
+    (with-current-buffer (get-buffer-create " *Saved Places*")
       (delete-region (point-min) (point-max))
       (when save-place-forget-unreadable-files
        (save-place-forget-unreadable-files))
@@ -214,7 +224,9 @@ may have changed\) back to `save-place-alist'."
                       (symbol-name coding-system-for-write)))
       (let ((print-length nil)
             (print-level nil))
-        (print save-place-alist (current-buffer)))
+        (pp (sort save-place-alist
+                  (lambda (a b) (string< (car a) (car b))))
+            (current-buffer)))
       (let ((version-control
              (cond
               ((null save-place-version-control) nil)
@@ -236,10 +248,9 @@ may have changed\) back to `save-place-alist'."
           ;; make sure that the alist does not get overwritten, and then
           ;; load it if it exists:
           (if (file-readable-p file)
-              (save-excursion
-                ;; don't want to use find-file because we have been
-                ;; adding hooks to it.
-                (set-buffer (get-buffer-create " *Saved Places*"))
+              ;; don't want to use find-file because we have been
+              ;; adding hooks to it.
+              (with-current-buffer (get-buffer-create " *Saved Places*")
                 (delete-region (point-min) (point-max))
                 (insert-file-contents file)
                 (goto-char (point-min))
@@ -275,8 +286,7 @@ may have changed\) back to `save-place-alist'."
       ;; put this into a save-excursion in case someone is counting on
       ;; another function in kill-emacs-hook to act on the last buffer
       ;; they were in:
-      (save-excursion
-       (set-buffer (car buf-list))
+      (with-current-buffer (car buf-list)
        ;; save-place checks buffer-file-name too, but we can avoid
        ;; overhead of function call by checking here too.
        (and buffer-file-name (save-place-to-alist))
@@ -287,7 +297,7 @@ may have changed\) back to `save-place-alist'."
   (let ((cell (assoc buffer-file-name save-place-alist)))
     (if cell
        (progn
-         (or after-find-file-from-revert-buffer
+         (or revert-buffer-in-progress-p
              (goto-char (cdr cell)))
           ;; and make sure it will be saved again for later
           (setq save-place t)))))
@@ -302,11 +312,11 @@ may have changed\) back to `save-place-alist'."
 
 (add-hook 'find-file-hook 'save-place-find-file-hook t)
 
-(add-hook 'kill-emacs-hook 'save-place-kill-emacs-hook)
+(unless noninteractive
+  (add-hook 'kill-emacs-hook 'save-place-kill-emacs-hook))
 
 (add-hook 'kill-buffer-hook 'save-place-to-alist)
 
 (provide 'saveplace) ; why not...
 
-;; arch-tag: 3c2ef47b-0a22-4558-b116-118c9ef454a0
 ;;; saveplace.el ends here