annotate lisp/auto-save.el @ 4885:6772ce4d982b

Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums lisp/ChangeLog addition: 2010-01-24 Aidan Kehoe <kehoea@parhasard.net> Correct the semantics of #'member*, #'eql, #'assoc* in the presence of bignums; change the integerp byte code to fixnump semantics. * bytecomp.el (fixnump, integerp, byte-compile-integerp): Change the integerp byte code to fixnump; add a byte-compile method to integerp using fixnump and numberp and avoiding a funcall most of the time, since in the non-core contexts where integerp is used, it's mostly distinguishing between fixnums and things that are not numbers at all. * byte-optimize.el (side-effect-free-fns, byte-after-unbind-ops) (byte-compile-side-effect-and-error-free-ops): Replace the integerp bytecode with fixnump; add fixnump to the side-effect-free-fns. Add the other extended number type predicates to the list in passing. * obsolete.el (floatp-safe): Mark this as obsolete. * cl.el (eql): Go into more detail in the docstring here. Don't bother checking whether both arguments are numbers; one is enough, #'equal will fail correctly if they have distinct types. (subst): Replace a call to #'integerp (deciding whether to use #'memq or not) with one to #'fixnump. Delete most-positive-fixnum, most-negative-fixnum from this file; they're now always in C, so they can't be modified from Lisp. * cl-seq.el (member*, assoc*, rassoc*): Correct these functions in the presence of bignums. * cl-macs.el (cl-make-type-test): The type test for a fixnum is now fixnump. Ditch floatp-safe, use floatp instead. (eql): Correct this compiler macro in the presence of bignums. (assoc*): Correct this compiler macro in the presence of bignums. * simple.el (undo): Change #'integerp to #'fixnump here, since we use #'delq with the same value as ELT a few lines down. src/ChangeLog addition: 2010-01-24 Aidan Kehoe <kehoea@parhasard.net> Fix problems with #'eql, extended number types, and the hash table implementation; change the Bintegerp bytecode to fixnump semantics even on bignum builds, since #'integerp can have a fast implementation in terms of #'fixnump for most of its extant uses, but not vice-versa. * lisp.h: Always #include number.h; we want the macros provided in it, even if the various number types are not available. * number.h (NON_FIXNUM_NUMBER_P): New macro, giving 1 when its argument is of non-immediate number type. Equivalent to FLOATP if WITH_NUMBER_TYPES is not defined. * elhash.c (lisp_object_eql_equal, lisp_object_eql_hash): Use NON_FIXNUM_NUMBER_P in these functions, instead of FLOATP, giving more correct behaviour in the presence of the extended number types. * bytecode.c (Bfixnump, execute_optimized_program): Rename Bintegerp to Bfixnump; change its semantics to reflect the new name on builds with bignum support. * data.c (Ffixnump, Fintegerp, syms_of_data, vars_of_data): Always make #'fixnump available, even on non-BIGNUM builds; always implement #'integerp in this file, even on BIGNUM builds. Move most-positive-fixnum, most-negative-fixnum here from number.c, so they are Lisp constants even on builds without number types, and attempts to change or bind them error. Use the NUMBERP and INTEGERP macros even on builds without extended number types. * data.c (fixnum_char_or_marker_to_int): Rename this function from integer_char_or_marker_to_int, to better reflect the arguments it accepts. * number.c (Fevenp, Foddp, syms_of_number): Never provide #'integerp in this file. Remove #'oddp, #'evenp; their implementations are overridden by those in cl.el. * number.c (vars_of_number): most-positive-fixnum, most-negative-fixnum are no longer here. man/ChangeLog addition: 2010-01-23 Aidan Kehoe <kehoea@parhasard.net> Generally: be careful to say fixnum, not integer, when talking about fixed-precision integral types. I'm sure I've missed instances, both here and in the docstrings, but this is a decent start. * lispref/text.texi (Columns): Document where only fixnums, not integers generally, are accepted. (Registers): Remove some ancient char-int confoundance here. * lispref/strings.texi (Creating Strings, Creating Strings): Be more exact in describing where fixnums but not integers in general are accepted. (Creating Strings): Use a more contemporary example to illustrate how concat deals with lists including integers about #xFF. Delete some obsolete documentation on same. (Char Table Types): Document that only fixnums are accepted as values in syntax tables. * lispref/searching.texi (String Search, Search and Replace): Be exact in describing where fixnums but not integers in general are accepted. * lispref/range-tables.texi (Range Tables): Be exact in describing them; only fixnums are accepted to describe ranges. * lispref/os.texi (Killing XEmacs, User Identification) (Time of Day, Time Conversion): Be more exact about using fixnum where only fixed-precision integers are accepted. * lispref/objects.texi (Integer Type): Be more exact (and up-to-date) about the possible values for integers. Cross-reference to documentation of the bignum extension. (Equality Predicates): (Range Table Type): (Array Type): Use fixnum, not integer, to describe a fixed-precision integer. (Syntax Table Type): Correct some English syntax here. * lispref/numbers.texi (Numbers): Change the phrasing here to use fixnum to mean the fixed-precision integers normal in emacs. Document that our terminology deviates from that of Common Lisp, and that we're working on it. (Compatibility Issues): Reiterate the Common Lisp versus Emacs Lisp compatibility issues. (Comparison of Numbers, Arithmetic Operations): * lispref/commands.texi (Command Loop Info, Working With Events): * lispref/buffers.texi (Modification Time): Be more exact in describing where fixnums but not integers in general are accepted.
author Aidan Kehoe <kehoea@parhasard.net>
date Sun, 24 Jan 2010 15:21:27 +0000
parents e38acbeb1cae
children cd167465bf69 91b3aa59f49b
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>
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
5 ;; Copyright (C) 2001, 2002 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
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
14 ;; the Free Software Foundation; either version 2, or (at your option)
428
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))))
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
257 (with-trapping-errors
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
258 :operation 'make-auto-save-file-name
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
259 :error-form
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
260 (let ((fname
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
261 (if file-name
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
262 (concat (file-name-directory file-name)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
263 "#"
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
264 (file-name-nondirectory file-name)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
265 "#")
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
266 (expand-file-name
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
267 (concat "#%" (auto-save-escape-name (buffer-name))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
268 "#")))))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
269 (if (or (file-writable-p fname)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
270 (file-exists-p fname))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
271 fname
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
272 (expand-file-name (concat "~/"
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
273 (file-name-nondirectory fname)))))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
274 (let (
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
275 ;; So autosavename looks like #%...#, roughly as with the
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
276 ;; old make-auto-save-file-name function. The
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
277 ;; make-temp-name inserts the pid of this Emacs: this
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
278 ;; avoids autosaving from two Emacses into the same file.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
279 ;; It cannot be recovered automatically then because in
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
280 ;; the next Emacs session (the one after the crash) the
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
281 ;; pid will be different, but file-less buffers like
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
282 ;; *mail* must be recovered manually anyway.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
284 ;; jwz: putting the emacs PID in the auto-save file name is bad
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
285 ;; news, because that defeats auto-save-recovery of *mail*
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
286 ;; buffers -- the (sensible) code in sendmail.el calls
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
287 ;; (make-auto-save-file-name) to determine whether there is
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
288 ;; unsent, auto-saved mail to recover. If that mail came from a
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
289 ;; previous emacs process (far and away the most likely case)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
290 ;; then this can never succeed as the pid differs.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
291 ;;(name-prefix (if file-name nil (make-temp-name "#%")))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
292 (name-prefix (if file-name nil "#%"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
294 (save-name (or file-name
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
295 ;; Prevent autosave errors. Buffername
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
296 ;; (to become non-dir part of filename) will
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
297 ;; be escaped twice. Don't care.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
298 (auto-save-escape-name (buffer-name))))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
299 (remote-p (and-fboundp 'efs-ftp-path
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
300 (stringp file-name)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
301 (efs-ftp-path file-name))))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
302 ;; Return the appropriate auto save file name:
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
303 (expand-file-name;; a buffername needs this, a filename not
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
304 (cond (remote-p
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
305 (if efs-auto-save-remotely
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
306 (auto-save-name-in-same-directory save-name)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
307 ;; We have to use the `fixed-directory' now since the
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
308 ;; `same-directory' would be remote.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
309 ;; It will use the fallback if needed.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
310 (auto-save-name-in-fixed-directory save-name)))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
311 ;; Else it is a local file (or a buffer without a file,
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
312 ;; hence the name-prefix).
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
313 ((or auto-save-directory auto-save-hash-p)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
314 ;; Hashed files always go into the special hash dir,
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
315 ;; never in the same directory, to make recognizing
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
316 ;; reliable.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
317 (auto-save-name-in-fixed-directory save-name name-prefix))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
318 (t
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
319 (auto-save-name-in-same-directory save-name name-prefix)))))))
464
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 (defun auto-save-file-name-p (filename)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
322 "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
323 FILENAME should lack slashes.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
324 You can redefine this for customization."
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
325 (string-match "\\`#.*#\\'" filename))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 (defun auto-save-original-name (savename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 "Reverse of `make-auto-save-file-name'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 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
330 from an autosaved `*mail*' buffer) or does not appear to be an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 autosave file at all.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 Hashed files are not understood, see `auto-save-hash-p'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 (let ((basename (file-name-nondirectory savename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 (savedir (file-name-directory savename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 (cond ((or (not (auto-save-file-name-p basename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 (string-match "^#%" basename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 ;; now we know it looks like #...# thus substring is safe to use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 ((or (equal savedir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 (and auto-save-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 (expand-file-name auto-save-directory)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 ; 2nd arg may be nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 (equal savedir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 (expand-file-name auto-save-directory-fallback)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 ;; it is of the `-fixed-directory' type
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
346 (auto-save-unescape-name (substring basename 1 -1)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 ;; else it is of `-same-directory' type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 (concat savedir (substring basename 1 -1))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 (defun auto-save-name-in-fixed-directory (filename &optional prefix)
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
352 ;; Escape and enclose the whole FILENAME in `#' to make an auto
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 ;; 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
354 ;; auto-save-directory-fallback (which must be the name of an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 ;; existing directory). If the results would be too long for 14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 ;; character filenames, and `auto-save-hash-p' is set, hash FILENAME
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 ;; into a shorter name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 ;; Optional PREFIX is string to use instead of "#" to prefix name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 (let ((base-name (concat (or prefix "#")
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
360 (auto-save-escape-name filename)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 "#")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 (if (and auto-save-hash-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 auto-save-hash-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 (> (length base-name) 14))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 (expand-file-name (auto-save-cyclic-hash-14 filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 (auto-save-checked-directory auto-save-hash-directory))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 (expand-file-name base-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 (auto-save-checked-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 (or auto-save-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 auto-save-directory-fallback))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 (defun auto-save-name-in-same-directory (filename &optional prefix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 ;; Enclose the non-directory part of FILENAME in `#' to make an auto
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 ;; save file in the same directory as FILENAME. But if this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 ;; directory is not writable, use auto-save-directory-fallback.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 ;; 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
377 ;; 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
378 ;; comes from a buffer name then), the fallback is used then.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 ;; Optional PREFIX is string to use instead of "#" to prefix name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 (let ((directory (file-name-directory filename)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 (or (null directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 (file-writable-p directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 (setq directory (auto-save-checked-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 auto-save-directory-fallback)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 (concat directory ; (concat nil) is ""
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 (or prefix "#")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 (file-name-nondirectory filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 "#")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
390 (defconst auto-save-reserved-chars
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
391 '(
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
392 ?\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
393 ?\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
394 ?\34 ?\35 ?\36 ?\37 ?\40 ?? ?* ?: ?< ?> ?| ?/ ?\\ ?& ?^ ?% ?= ?\")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
395 "List of characters disallowed (or potentially disallowed) in filenames.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
396 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
397
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
398 ;; This code based on code in Bill Perry's url.el.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
399
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
400 (defun auto-save-escape-name (str)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
401 "Escape any evil nasty characters in a potential filename.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
402 Uses quoted-printable-style escaping -- e.g. the dreaded =3D.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
403 Does not use URL escaping (with %) because filenames beginning with #% are
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
404 a special signal for non-file buffers."
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
405 (mapconcat
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
406 (function
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
407 (lambda (char)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
408 (if (memq char auto-save-reserved-chars)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
409 (if (< char 16)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
410 (upcase (format "=0%x" char))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
411 (upcase (format "=%x" char)))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
412 (char-to-string char))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
413 str ""))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
414
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
415 (defun auto-save-unhex (x)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
416 (if (> x ?9)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
417 (if (>= x ?a)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
418 (+ 10 (- x ?a))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
419 (+ 10 (- x ?A)))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
420 (- x ?0)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
422 (defun auto-save-unescape-name (str)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
423 "Undo any escaping of evil nasty characters in a file name.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
424 See `auto-save-escape-name'."
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
425 (setq str (or str ""))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
426 (let ((tmp "")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
427 (case-fold-search t))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
428 (while (string-match "=[0-9a-f][0-9a-f]" str)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
429 (let* ((start (match-beginning 0))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
430 (ch1 (auto-save-unhex (elt str (+ start 1))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
431 (code (+ (* 16 ch1)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
432 (auto-save-unhex (elt str (+ start 2))))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
433 (setq tmp (concat tmp (substring str 0 start)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
434 (char-to-string code))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
435 str (substring str (match-end 0)))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
436 (setq tmp (concat tmp str))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
437 tmp))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
438
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
439 ;; The old versions are below.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
441 ;(defun auto-save-escape-name (s)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
442 ; ;; "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
443 ; ;;characters `\\!'.
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
444 ; ;;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
445 ; (let ((limit 0))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
446 ; (while (string-match "[/\\]" s limit)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
447 ; (setq s (concat (substring s 0 (match-beginning 0))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
448 ; (if (string= (substring s
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
449 ; (match-beginning 0)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
450 ; (match-end 0))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
451 ; "/")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
452 ; "\\!"
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
453 ; "\\\\")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
454 ; (substring s (match-end 0))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
455 ; (setq limit (1+ (match-end 0)))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
456 ; s)
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 ;(defun auto-save-unescape-name (s)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
459 ; ;;"Reverse of `auto-save-escape-name'."
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
460 ; (let (pos)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
461 ; (while (setq pos (string-match "\\\\[\\!]" s pos))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
462 ; (setq s (concat (substring s 0 pos)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
463 ; (if (eq ?! (aref s (1+ pos))) "/" "\\")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
464 ; (substring s (+ pos 2)))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
465 ; pos (1+ pos))))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
466 ; s)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 ;;; Hashing for autosave names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 ;;; Hashing function contributed by Andy Norman <ange@hplb.hpl.hp.com>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 ;;; based upon C code from pot@fly.cnuce.cnr.IT (Francesco Potorti`).
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 (defun auto-save-cyclic-hash-14 (s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 ;; "Hash string S into a string of length 14.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 ;; A 7-bytes cyclic code for burst correction is calculated on a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 ;; 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
478 ;; The resulting string consists of hexadecimal digits [0-9a-f].
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 ;; 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
480 (let ((crc (make-vector 7 ?\0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 (mapc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 (lambda (new)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 (setq new (+ new (aref crc 6)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 (aset crc 6 (+ (aref crc 5) new))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 (aset crc 5 (aref crc 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 (aset crc 4 (aref crc 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 (aset crc 3 (+ (aref crc 2) new))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 (aset crc 2 (aref crc 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 (aset crc 1 (aref crc 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 (aset crc 0 new))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 (format "%02x%02x%02x%02x%02x%02x%02x"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 (logand 255 (aref crc 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 (logand 255 (aref crc 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 (logand 255 (aref crc 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 (logand 255 (aref crc 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 (logand 255 (aref crc 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 (logand 255 (aref crc 5))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 (logand 255 (aref crc 6)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 ;; #### It is unclear to me how the following function is useful. It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 ;; should be used in `auto-save-name-in-same-directory', if anywhere.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 ;; -hniksic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 ;; 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
506 ;; 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
507 ;; file containing the name of the autosaved file, to make hashing
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 ;; reversible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 ;(defun auto-save-cyclic-hash-12 (s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 ; "Outputs the 12-characters ascii hex representation of a 6-bytes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 ;cyclic code for burst correction calculated on STRING on a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 ;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
513 ; (let ((crc (make-string 6 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 ; (mapc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 ; (lambda (new)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 ; (setq new (+ new (aref crc 5)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 ; (aset crc 5 (+ (aref crc 4) new))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 ; (aset crc 4 (+ (aref crc 3) new))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 ; (aset crc 3 (+ (aref crc 2) new))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 ; (aset crc 2 (aref crc 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 ; (aset crc 1 (aref crc 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 ; (aset crc 0 new))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 ; s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 ; (format "%02x%02x%02x%02x%02x%02x"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 ; (aref crc 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 ; (aref crc 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 ; (aref crc 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 ; (aref crc 3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 ; (aref crc 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 ; (aref crc 5))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 ;;; Recovering files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 (defun recover-all-files (&optional silent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 "Do recover-file for all autosave files which are current.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 Only works if you have a non-nil `auto-save-directory'.
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 Optional prefix argument SILENT means to be silent about non-current
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 autosave files. This is useful if invoked automatically at Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 startup.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 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
545 old or rejected autosave files.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 Hashed files (see `auto-save-hash-p') are not understood, use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 `recover-file' to recover them individually."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 (interactive "P")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 (let ((savefiles (directory-files auto-save-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 t "\\`#" nil t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 afile ; the auto save file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 file ; its original file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 (total 0) ; # of files offered to recover
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 (count 0)) ; # of files actually recovered
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 (or (equal (expand-file-name auto-save-directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 (expand-file-name auto-save-directory-fallback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 (setq savefiles
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 (nconc savefiles
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 (directory-files auto-save-directory-fallback
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 t "\\`#" nil t))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 (while savefiles
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 (setq afile (car savefiles)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 file (auto-save-original-name afile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 savefiles (cdr savefiles))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 (cond ((and file (not (file-newer-than-file-p afile file)))
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 776
diff changeset
567 (warn "Autosave file \"%s\" is not current" afile))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 (incf total)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 (with-output-to-temp-buffer "*Directory*"
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
571 (buffer-disable-undo standard-output)
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
572 (save-excursion
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
573 (set-buffer "*Directory*")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
574 (setq default-directory (file-name-directory afile))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
575 (insert-directory afile "-l")
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
576 (when file
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
577 (setq default-directory (file-name-directory file))
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 440
diff changeset
578 (insert-directory file "-l"))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 (if (yes-or-no-p (format "Recover %s from auto save file? "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 (or file "non-file buffer")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 (let* ((obuf (current-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 (set-buffer (if file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 (find-file-noselect file t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 (generate-new-buffer "*recovered*")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 (setq buffer-read-only nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 (erase-buffer)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 464
diff changeset
587 ;; 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
588 ;; 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
589 (let ((coding-system-for-read 'escape-quoted))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 464
diff changeset
590 (insert-file-contents afile nil))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 (ignore-errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 (after-find-file nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 (setq buffer-auto-save-file-name nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 (incf count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 (message "\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 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
597 (buffer-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 (set-buffer obuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 (sit-for 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 ;; If not used for recovering, offer to delete
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 ;; autosave file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 (and auto-save-offer-delete
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 (or (eq 'always auto-save-offer-delete)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 (yes-or-no-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 (format "Delete autosave file for `%s'? " file)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 (delete-file afile))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 (if (zerop total)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 (or silent (message "Nothing to recover."))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 (message "%d/%d file%s recovered." count total (if (= count 1) "" "s"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 (and (get-buffer "*Directory*")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 (kill-buffer "*Directory*")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 ;;; auto-save.el ends here