annotate lisp/auto-save.el @ 771:943eaba38521

[xemacs-hg @ 2002-03-13 08:51:24 by ben] The big ben-mule-21-5 check-in! Various files were added and deleted. See CHANGES-ben-mule. There are still some test suite failures. No crashes, though. Many of the failures have to do with problems in the test suite itself rather than in the actual code. I'll be addressing these in the next day or so -- none of the test suite failures are at all critical. Meanwhile I'll be trying to address the biggest issues -- i.e. build or run failures, which will almost certainly happen on various platforms. All comments should be sent to ben@xemacs.org -- use a Cc: if necessary when sending to mailing lists. There will be pre- and post- tags, something like pre-ben-mule-21-5-merge-in, and post-ben-mule-21-5-merge-in.
author ben
date Wed, 13 Mar 2002 08:54:06 +0000
parents 5aa1854ad537
children 79940b592197
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 ;;; auto-save.el -- Safer autosaving for EFS and tmp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 ;; Copyright (C) 1997 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 ;; Copyright (C) 1992 by Sebastian Kremer <sk@thp.uni-koeln.de>
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
5 ;; Copyright (C) 2001 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 ;; Author: Sebastian Kremer <sk@thp.uni-koeln.de>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ;; Maintainer: XEmacs Development Team
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 ;; Keywords: extensions, dumped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 ;; Version: 1.26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ;; XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ;; under the terms of the GNU General Public License as published by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ;; the Free Software Foundation; either version 1, or (at your option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 ;; any later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 ;; XEmacs is distributed in the hope that it will be useful, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 ;; General Public License for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 ;; along with XEmacs; see the file COPYING. If not, write to the Free
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 ;; 02111-1307, USA.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 ;;; Synched up with: Not in FSF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 ;; This file is dumped with XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 ;; Combines autosaving for efs (to a local or remote directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 ;; with the ability to do autosaves to a fixed directory on a local
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 ;; disk, in case NFS is slow. The auto-save file used for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 ;; /usr/foo/bar/baz.txt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 ;; will be
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
38 ;; AUTOSAVE/#=2Fusr=2Ffoo=2Fbar=2Fbaz.txt#"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 ;; assuming AUTOSAVE is the non-nil value of the variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 ;; `auto-save-directory'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 ;; Autosaves even if the current directory is not writable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 ;; Can limit autosave names to 14 characters using a hash function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 ;; see `auto-save-hash-p'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 ;; See `auto-save-directory' and `make-auto-save-file-name' and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 ;; references therein for complete documentation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 ;; `M-x recover-all-files' will effectively do recover-file on all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 ;; files whose autosave file is newer (one of the benefits of having
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 ;; all autosave files in the same place).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 ;; This file is dumped with XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 ;; If you want to autosave in the fixed directory /tmp/USER-autosave/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 ;; (setq auto-save-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 ;; (concat "/tmp/" (user-login-name) "-autosave/"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 ;; If you don't want to save in /tmp (e.g., because it is swap
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
61 ;; mounted) but rather in ~/.autosave/
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 ;; (setq auto-save-directory (expand-file-name "~/.autosave/"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 ;; If you want to save each file in its own directory (the default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 ;; (setq auto-save-directory nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 ;; You still can take advantage of autosaving efs remote files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 ;; in a fixed local directory, `auto-save-directory-fallback' will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 ;; be used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 ;; If you want to use 14 character hashed autosave filenames
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 ;; (setq auto-save-hash-p t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 ;; Finally, put this line after the others in your ~/.emacs:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 ;; (require 'auto-save)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 ;;; Acknowledgement:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 ;; This code is loosely derived from autosave-in-tmp.el by Jamie
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 ;; Zawinski <jwz@jwz.org> (the version I had was last modified 22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 ;; dec 90 jwz) and code submitted to ange-ftp-lovers on Sun, 5 Apr
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 ;; 92 23:20:47 EDT by drw@BOURBAKI.MIT.EDU (Dale R. Worley).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 ;; auto-save.el tries to cover the functionality of those two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 ;; packages.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 ;; Valuable comments and help from Dale Worley, Andy Norman, Jamie
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 ;; Zawinski and Sandy Rutherford are gratefully acknowledged.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 (defconst auto-save-version "1.26"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 "Version number of auto-save.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 (provide 'auto-save)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 ;;; Customization:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 (defgroup auto-save nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 "Autosaving with support for efs and /tmp."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 :group 'data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 (put 'auto-save-interval 'custom-type 'integer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 (put 'auto-save-interval 'factory-value '(300))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 (custom-add-to-group 'auto-save 'auto-save-interval 'custom-variable)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 (defcustom auto-save-directory nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 ;; Don't make this user-variable-p, it should be set in .emacs and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 ;; left at that. In particular, it should remain constant across
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 ;; several Emacs session to make recover-all-files work.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 ;; However, it's OK for it to be customizable, as most of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 ;; customizable variables are set at the time `.emacs' is read.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 ;; -hniksic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 "If non-nil, fixed directory for autosaving: all autosave files go
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 there. If this directory does not yet exist at load time, it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 created and its mode is set to 0700 so that nobody else can read your
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 autosave files.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 If nil, each autosave files goes into the same directory as its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 corresponding visited file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 A non-nil `auto-save-directory' could be on a local disk such as in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 /tmp, then auto-saves will always be fast, even if NFS or the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 automounter is slow. In the usual case of /tmp being locally mounted,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 note that if you run emacs on two different machines, they will not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 see each other's auto-save files.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 The value \(expand-file-name \"~/.autosave/\"\) might be better if /tmp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 is mounted from swap (possible in SunOS, type `df /tmp' to find out)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 and thus vanishes after a reboot, or if your system is particularly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 thorough when cleaning up /tmp, clearing even non-empty subdirectories.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 It should never be an efs remote filename because that would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 defeat `efs-auto-save-remotely'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 Unless you set `auto-save-hash-p', you shouldn't set this to a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 directory in a filesystem that does not support long filenames, since
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 a file named
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 /home/sk/lib/emacs/lisp/auto-save.el
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 will have a longish filename like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
145 AUTO-SAVE-DIRECTORY/#=2Fhome=2Fsk=2Flib=2Femacs=2Flisp=2Fauto-save.el#
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 as auto save file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 See also variables `auto-save-directory-fallback',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 `efs-auto-save' and `efs-auto-save-remotely'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 :type '(choice (const :tag "Same as file" nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 :group 'auto-save)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 (defcustom auto-save-hash-p nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 "If non-nil, hashed autosave names of length 14 are used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 This is to avoid autosave filenames longer than 14 characters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 The directory used is `auto-save-hash-directory' regardless of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 `auto-save-directory'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 Hashing defeats `recover-all-files', you have to recover files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 individually by doing `recover-file'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 :group 'auto-save)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 ;;; This defvar is in efs.el now, but doesn't hurt to give it here as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 ;;; well so that loading first auto-save.el does not abort.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 ;; #### Now that `auto-save' is dumped, this is looks obnoxious.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 (or (boundp 'efs-auto-save) (defvar efs-auto-save 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 (or (boundp 'efs-auto-save-remotely) (defvar efs-auto-save-remotely nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 (defcustom auto-save-offer-delete nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 "*If non-nil, `recover-all-files' offers to delete autosave files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 that are out of date or were dismissed for recovering.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 Special value 'always deletes those files silently."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 :type '(choice (const :tag "on" t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 (const :tag "off" nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 (const :tag "Delete silently" always))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 :group 'auto-save)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 ;;;; end of customization
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 ;;; Preparations to be done at load time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 ;; Do not call expand-file-name! This is evaluated at dump time now!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 (defvar auto-save-directory-fallback "~/.autosave/"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 ;; not user-variable-p, see above
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 "Directory used for local autosaving of remote files if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 both `auto-save-directory' and `efs-auto-save-remotely' are nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 Also used if a working directory to be used for autosaving is not writable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 This *must* always be the name of directory that exists or can be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 created by you, never nil.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 (defvar auto-save-hash-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 (expand-file-name "hash/" (or auto-save-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 auto-save-directory-fallback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 "If non-nil, directory used for hashed autosave filenames.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 (defun auto-save-checked-directory (dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 "Make sure the directory DIR exists and return it expanded if non-nil."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 (when dir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 (setq dir (expand-file-name dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 ;; Make sure directory exists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 (unless (file-directory-p dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 ;; Else we create and chmod 0700 the directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 (setq dir (directory-file-name dir)) ; some systems need this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 (make-directory dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 (set-file-modes dir #o700))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 ;; This make no sense at dump time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 ;; (mapc #'auto-save-check-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 ; '(auto-save-directory auto-save-directory-fallback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 ;(and auto-save-hash-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 ; (auto-save-check-directory 'auto-save-hash-directory))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 ;;; Computing an autosave name for a file and vice versa
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
223 (defun make-auto-save-file-name (&optional file-name)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 "Return file name to use for auto-saves of current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 Does not consider `auto-save-visited-file-name'; that is checked
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 before calling this function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 Offers to autosave all files in the same `auto-save-directory'. All
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 autosave files can then be recovered at once with function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 `recover-all-files'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 Takes care to make autosave files for files accessed through efs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 be local files if variable `efs-auto-save-remotely' is nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 Takes care of slashes in buffer names to prevent autosave errors.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 Takes care that autosave files for buffers not visiting any file (such
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 as `*mail*') from two simultaneous Emacses don't collide by prepending
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 the Emacs pid.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 Uses 14 character autosave names if `auto-save-hash-p' is true.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 Autosaves even if the current directory is not writable, using
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 directory `auto-save-directory-fallback'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 You can redefine this for customization (he he :-).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 See also function `auto-save-file-name-p'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 ;; We have to be very careful about not signalling an error in this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 ;; function since files.el does not provide for this (e.g. find-file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 ;; would fail for each new file).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 (setq file-name (or file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 buffer-file-truename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 (and buffer-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 (expand-file-name buffer-file-name))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 (condition-case error-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 (let (
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 ;; So autosavename looks like #%...#, roughly as with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 ;; old make-auto-save-file-name function. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 ;; make-temp-name inserts the pid of this Emacs: this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 ;; avoids autosaving from two Emacses into the same file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 ;; It cannot be recovered automatically then because in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 ;; the next Emacs session (the one after the crash) the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 ;; pid will be different, but file-less buffers like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 ;; *mail* must be recovered manually anyway.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 ;; jwz: putting the emacs PID in the auto-save file name is bad
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 ;; news, because that defeats auto-save-recovery of *mail*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 ;; buffers -- the (sensible) code in sendmail.el calls
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 ;; (make-auto-save-file-name) to determine whether there is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 ;; unsent, auto-saved mail to recover. If that mail came from a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 ;; previous emacs process (far and away the most likely case)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 ;; then this can never succeed as the pid differs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 ;;(name-prefix (if file-name nil (make-temp-name "#%")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 (name-prefix (if file-name nil "#%"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 (save-name (or file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 ;; Prevent autosave errors. Buffername
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 ;; (to become non-dir part of filename) will
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
281 ;; be escaped twice. Don't care.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
282 (auto-save-escape-name (buffer-name))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 (remote-p (and (stringp file-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 (fboundp 'efs-ftp-path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 (efs-ftp-path file-name))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 ;; Return the appropriate auto save file name:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 (expand-file-name;; a buffername needs this, a filename not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 (cond (remote-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 (if efs-auto-save-remotely
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 (auto-save-name-in-same-directory save-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 ;; We have to use the `fixed-directory' now since the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 ;; `same-directory' would be remote.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 ;; It will use the fallback if needed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 (auto-save-name-in-fixed-directory save-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 ;; Else it is a local file (or a buffer without a file,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 ;; hence the name-prefix).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 ((or auto-save-directory auto-save-hash-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 ;; Hashed files always go into the special hash dir,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 ;; never in the same directory, to make recognizing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 ;; reliable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 (auto-save-name-in-fixed-directory save-name name-prefix))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 (auto-save-name-in-same-directory save-name name-prefix)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 ;; If any error occurs in the above code, return what the old
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 ;; version of this function would have done. It is not ok to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 ;; return nil, e.g., when after-find-file tests
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 ;; file-newer-than-file-p, nil would bomb.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 (error (warn "Error caught in `make-auto-save-file-name':\n%s"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 (error-message-string error-data))
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
312 (let ((fname
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
313 (if file-name
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
314 (concat (file-name-directory file-name)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
315 "#"
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
316 (file-name-nondirectory file-name)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
317 "#")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
318 (expand-file-name
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
319 (concat "#%" (auto-save-escape-name (buffer-name))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
320 "#")))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
321 (if (or (file-writable-p fname)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
322 (file-exists-p fname))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
323 fname
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
324 (expand-file-name (concat "~/"
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
325 (file-name-nondirectory fname))))))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
326
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
327 (defun auto-save-file-name-p (filename)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
328 "Return non-nil if FILENAME can be yielded by `make-auto-save-file-name'.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
329 FILENAME should lack slashes.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
330 You can redefine this for customization."
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
331 (string-match "\\`#.*#\\'" filename))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 (defun auto-save-original-name (savename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 "Reverse of `make-auto-save-file-name'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 Returns nil if SAVENAME was not associated with a file (e.g., it came
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 from an autosaved `*mail*' buffer) or does not appear to be an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 autosave file at all.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 Hashed files are not understood, see `auto-save-hash-p'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 (let ((basename (file-name-nondirectory savename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 (savedir (file-name-directory savename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 (cond ((or (not (auto-save-file-name-p basename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 (string-match "^#%" basename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 ;; now we know it looks like #...# thus substring is safe to use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 ((or (equal savedir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 (and auto-save-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 (expand-file-name auto-save-directory)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 ; 2nd arg may be nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 (equal savedir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 (expand-file-name auto-save-directory-fallback)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 ;; it is of the `-fixed-directory' type
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
352 (auto-save-unescape-name (substring basename 1 -1)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 ;; else it is of `-same-directory' type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 (concat savedir (substring basename 1 -1))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 (defun auto-save-name-in-fixed-directory (filename &optional prefix)
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
358 ;; Escape and enclose the whole FILENAME in `#' to make an auto
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 ;; save file in the auto-save-directory, or if that is nil, in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 ;; auto-save-directory-fallback (which must be the name of an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 ;; existing directory). If the results would be too long for 14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 ;; character filenames, and `auto-save-hash-p' is set, hash FILENAME
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 ;; into a shorter name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 ;; Optional PREFIX is string to use instead of "#" to prefix name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 (let ((base-name (concat (or prefix "#")
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
366 (auto-save-escape-name filename)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 "#")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 (if (and auto-save-hash-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 auto-save-hash-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 (> (length base-name) 14))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 (expand-file-name (auto-save-cyclic-hash-14 filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 (auto-save-checked-directory auto-save-hash-directory))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 (expand-file-name base-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 (auto-save-checked-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 (or auto-save-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 auto-save-directory-fallback))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 (defun auto-save-name-in-same-directory (filename &optional prefix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 ;; Enclose the non-directory part of FILENAME in `#' to make an auto
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 ;; save file in the same directory as FILENAME. But if this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 ;; directory is not writable, use auto-save-directory-fallback.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 ;; FILENAME is assumed to be in non-directory form (no trailing slash).
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
383 ;; It may be a name without a directory part (presumably it really
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 ;; comes from a buffer name then), the fallback is used then.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 ;; Optional PREFIX is string to use instead of "#" to prefix name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 (let ((directory (file-name-directory filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 (or (null directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 (file-writable-p directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 (setq directory (auto-save-checked-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 auto-save-directory-fallback)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 (concat directory ; (concat nil) is ""
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 (or prefix "#")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 (file-name-nondirectory filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 "#")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
396 (defconst auto-save-reserved-chars
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
397 '(
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
398 ?\0 ?\1 ?\2 ?\3 ?\4 ?\5 ?\6 ?\7 ?\10 ?\11 ?\12 ?\13 ?\14 ?\15 ?\16
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
399 ?\17 ?\20 ?\21 ?\22 ?\23 ?\24 ?\25 ?\26 ?\27 ?\30 ?\31 ?\32 ?\33
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
400 ?\34 ?\35 ?\36 ?\37 ?\40 ?? ?* ?: ?< ?> ?| ?/ ?\\ ?& ?^ ?% ?= ?\")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
401 "List of characters disallowed (or potentially disallowed) in filenames.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
402 Includes everything that can get us into trouble under MS Windows or Unix.")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
403
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
404 ;; This code based on code in Bill Perry's url.el.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
405
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
406 (defun auto-save-escape-name (str)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
407 "Escape any evil nasty characters in a potential filename.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
408 Uses quoted-printable-style escaping -- e.g. the dreaded =3D.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
409 Does not use URL escaping (with %) because filenames beginning with #% are
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
410 a special signal for non-file buffers."
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
411 (mapconcat
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
412 (function
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
413 (lambda (char)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
414 (if (memq char auto-save-reserved-chars)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
415 (if (< char 16)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
416 (upcase (format "=0%x" char))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
417 (upcase (format "=%x" char)))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
418 (char-to-string char))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
419 str ""))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
420
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
421 (defun auto-save-unhex (x)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
422 (if (> x ?9)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
423 (if (>= x ?a)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
424 (+ 10 (- x ?a))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
425 (+ 10 (- x ?A)))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
426 (- x ?0)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
428 (defun auto-save-unescape-name (str)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
429 "Undo any escaping of evil nasty characters in a file name.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
430 See `auto-save-escape-name'."
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
431 (setq str (or str ""))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
432 (let ((tmp "")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
433 (case-fold-search t))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
434 (while (string-match "=[0-9a-f][0-9a-f]" str)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
435 (let* ((start (match-beginning 0))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
436 (ch1 (auto-save-unhex (elt str (+ start 1))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
437 (code (+ (* 16 ch1)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
438 (auto-save-unhex (elt str (+ start 2))))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
439 (setq tmp (concat tmp (substring str 0 start)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
440 (char-to-string code))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
441 str (substring str (match-end 0)))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
442 (setq tmp (concat tmp str))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
443 tmp))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
444
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
445 ;; The old versions are below.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
447 ;(defun auto-save-escape-name (s)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
448 ; ;; "Quote any slashes in string S by replacing them with the two
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
449 ; ;;characters `\\!'.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
450 ; ;;Also, replace any backslash by double backslash, to make it one-to-one."
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
451 ; (let ((limit 0))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
452 ; (while (string-match "[/\\]" s limit)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
453 ; (setq s (concat (substring s 0 (match-beginning 0))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
454 ; (if (string= (substring s
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
455 ; (match-beginning 0)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
456 ; (match-end 0))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
457 ; "/")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
458 ; "\\!"
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
459 ; "\\\\")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
460 ; (substring s (match-end 0))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
461 ; (setq limit (1+ (match-end 0)))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
462 ; s)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
463
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
464 ;(defun auto-save-unescape-name (s)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
465 ; ;;"Reverse of `auto-save-escape-name'."
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
466 ; (let (pos)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
467 ; (while (setq pos (string-match "\\\\[\\!]" s pos))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
468 ; (setq s (concat (substring s 0 pos)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
469 ; (if (eq ?! (aref s (1+ pos))) "/" "\\")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
470 ; (substring s (+ pos 2)))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
471 ; pos (1+ pos))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
472 ; s)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 ;;; Hashing for autosave names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 ;;; Hashing function contributed by Andy Norman <ange@hplb.hpl.hp.com>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 ;;; based upon C code from pot@fly.cnuce.cnr.IT (Francesco Potorti`).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 (defun auto-save-cyclic-hash-14 (s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 ;; "Hash string S into a string of length 14.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 ;; A 7-bytes cyclic code for burst correction is calculated on a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 ;; byte-by-byte basis. The polynomial used is D^7 + D^6 + D^3 +1.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 ;; The resulting string consists of hexadecimal digits [0-9a-f].
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 ;; In particular, it contains no slash, so it can be used as autosave name."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 (let ((crc (make-vector 7 ?\0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 (mapc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 (lambda (new)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 (setq new (+ new (aref crc 6)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 (aset crc 6 (+ (aref crc 5) new))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 (aset crc 5 (aref crc 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 (aset crc 4 (aref crc 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 (aset crc 3 (+ (aref crc 2) new))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 (aset crc 2 (aref crc 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 (aset crc 1 (aref crc 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 (aset crc 0 new))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 (format "%02x%02x%02x%02x%02x%02x%02x"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 (logand 255 (aref crc 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 (logand 255 (aref crc 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 (logand 255 (aref crc 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 (logand 255 (aref crc 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 (logand 255 (aref crc 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 (logand 255 (aref crc 5))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 (logand 255 (aref crc 6)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 ;; #### It is unclear to me how the following function is useful. It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 ;; should be used in `auto-save-name-in-same-directory', if anywhere.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 ;; -hniksic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 ;; This leaves two characters that could be used to wrap it in `#' or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 ;; make two filenames from it: one for autosaving, and another for a
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
513 ;; file containing the name of the autosaved file, to make hashing
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 ;; reversible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 ;(defun auto-save-cyclic-hash-12 (s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 ; "Outputs the 12-characters ascii hex representation of a 6-bytes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 ;cyclic code for burst correction calculated on STRING on a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 ;byte-by-byte basis. The used polynomial is D^6 + D^5 + D^4 + D^3 +1."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 ; (let ((crc (make-string 6 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 ; (mapc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 ; (lambda (new)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 ; (setq new (+ new (aref crc 5)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 ; (aset crc 5 (+ (aref crc 4) new))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 ; (aset crc 4 (+ (aref crc 3) new))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 ; (aset crc 3 (+ (aref crc 2) new))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 ; (aset crc 2 (aref crc 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 ; (aset crc 1 (aref crc 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 ; (aset crc 0 new))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 ; s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 ; (format "%02x%02x%02x%02x%02x%02x"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 ; (aref crc 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 ; (aref crc 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 ; (aref crc 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 ; (aref crc 3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 ; (aref crc 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 ; (aref crc 5))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 ;;; Recovering files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 (defun recover-all-files (&optional silent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 "Do recover-file for all autosave files which are current.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 Only works if you have a non-nil `auto-save-directory'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 Optional prefix argument SILENT means to be silent about non-current
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 autosave files. This is useful if invoked automatically at Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 startup.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 If `auto-save-offer-delete' is t, this function will offer to delete
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 old or rejected autosave files.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 Hashed files (see `auto-save-hash-p') are not understood, use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 `recover-file' to recover them individually."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 (interactive "P")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 (let ((savefiles (directory-files auto-save-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 t "\\`#" nil t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 afile ; the auto save file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 file ; its original file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 (total 0) ; # of files offered to recover
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 (count 0)) ; # of files actually recovered
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 (or (equal (expand-file-name auto-save-directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 (expand-file-name auto-save-directory-fallback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 (setq savefiles
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 (nconc savefiles
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 (directory-files auto-save-directory-fallback
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 t "\\`#" nil t))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 (while savefiles
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 (setq afile (car savefiles)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 file (auto-save-original-name afile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 savefiles (cdr savefiles))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 (cond ((and file (not (file-newer-than-file-p afile file)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 (warn "Autosave file \"%s\" is not current." afile))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 (incf total)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 (with-output-to-temp-buffer "*Directory*"
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
577 (buffer-disable-undo standard-output)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
578 (save-excursion
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
579 (set-buffer "*Directory*")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
580 (setq default-directory (file-name-directory afile))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
581 (insert-directory afile "-l")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
582 (when file
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
583 (setq default-directory (file-name-directory file))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
584 (insert-directory file "-l"))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 (if (yes-or-no-p (format "Recover %s from auto save file? "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 (or file "non-file buffer")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 (let* ((obuf (current-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 (set-buffer (if file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 (find-file-noselect file t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 (generate-new-buffer "*recovered*")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 (setq buffer-read-only nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 (erase-buffer)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 464
diff changeset
593 ;; see comment in `revert-buffer' in files.el about
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 464
diff changeset
594 ;; why it's safe to always use `escape-quoted'.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 464
diff changeset
595 (let ((coding-system-for-read 'escape-quoted))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 464
diff changeset
596 (insert-file-contents afile nil))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 (ignore-errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 (after-find-file nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 (setq buffer-auto-save-file-name nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 (incf count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 (message "\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 Auto-save off in buffer \"%s\" till you do M-x auto-save-mode."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 (buffer-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 (set-buffer obuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 (sit-for 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 ;; If not used for recovering, offer to delete
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 ;; autosave file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 (and auto-save-offer-delete
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 (or (eq 'always auto-save-offer-delete)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 (yes-or-no-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 (format "Delete autosave file for `%s'? " file)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 (delete-file afile))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 (if (zerop total)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 (or silent (message "Nothing to recover."))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 (message "%d/%d file%s recovered." count total (if (= count 1) "" "s"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 (and (get-buffer "*Directory*")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 (kill-buffer "*Directory*")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 ;;; auto-save.el ends here