Mercurial > hg > xemacs-beta
comparison lisp/auto-save.el @ 371:cc15677e0335 r21-2b1
Import from CVS: tag r21-2b1
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:03:08 +0200 |
parents | 19dcec799385 |
children | a300bb07d72d |
comparison
equal
deleted
inserted
replaced
370:bd866891f083 | 371:cc15677e0335 |
---|---|
184 ;;;; end of customization | 184 ;;;; end of customization |
185 | 185 |
186 | 186 |
187 ;;; Preparations to be done at load time | 187 ;;; Preparations to be done at load time |
188 | 188 |
189 ;; Do not call expand-file-name! This is evaluated at dump time now! | 189 (defvar auto-save-directory-fallback (expand-file-name "~/.autosave/") |
190 (defvar auto-save-directory-fallback "~/.autosave/" | |
191 ;; not user-variable-p, see above | 190 ;; not user-variable-p, see above |
192 "Directory used for local autosaving of remote files if | 191 "Directory used for local autosaving of remote files if |
193 both `auto-save-directory' and `efs-auto-save-remotely' are nil. | 192 both `auto-save-directory' and `efs-auto-save-remotely' are nil. |
194 Also used if a working directory to be used for autosaving is not writable. | 193 Also used if a working directory to be used for autosaving is not writable. |
195 This *must* always be the name of directory that exists or can be | 194 This *must* always be the name of directory that exists or can be |
198 (defvar auto-save-hash-directory | 197 (defvar auto-save-hash-directory |
199 (expand-file-name "hash/" (or auto-save-directory | 198 (expand-file-name "hash/" (or auto-save-directory |
200 auto-save-directory-fallback)) | 199 auto-save-directory-fallback)) |
201 "If non-nil, directory used for hashed autosave filenames.") | 200 "If non-nil, directory used for hashed autosave filenames.") |
202 | 201 |
203 (defun auto-save-checked-directory (dir) | 202 (defun auto-save-check-directory (var) |
204 "Make sure the directory DIR exists and return it expanded if non-nil." | 203 (let ((dir (symbol-value var))) |
205 (when dir | 204 (if (null dir) |
206 (setq dir (expand-file-name dir)) | 205 nil |
206 ;; Expand and store back into the variable | |
207 (set var (setq dir (expand-file-name dir))) | |
207 ;; Make sure directory exists | 208 ;; Make sure directory exists |
208 (unless (file-directory-p dir) | 209 (if (file-directory-p dir) |
210 nil | |
209 ;; Else we create and chmod 0700 the directory | 211 ;; Else we create and chmod 0700 the directory |
210 (setq dir (directory-file-name dir)) ; some systems need this | 212 (setq dir (directory-file-name dir)) ; some systems need this |
211 (make-directory dir) | 213 (make-directory dir) |
212 (set-file-modes dir #o700)) | 214 (set-file-modes dir #o700))))) |
213 dir)) | 215 |
214 | 216 (mapc #'auto-save-check-directory |
215 ;; This make no sense at dump time | 217 '(auto-save-directory auto-save-directory-fallback)) |
216 ;; (mapc #'auto-save-check-directory | 218 |
217 ; '(auto-save-directory auto-save-directory-fallback)) | 219 (and auto-save-hash-p |
218 | 220 (auto-save-check-directory 'auto-save-hash-directory)) |
219 ;(and auto-save-hash-p | |
220 ; (auto-save-check-directory 'auto-save-hash-directory)) | |
221 | 221 |
222 | 222 |
223 ;;; Computing an autosave name for a file and vice versa | 223 ;;; Computing an autosave name for a file and vice versa |
224 | 224 |
225 ;; #### Now that this file is dumped, we should turn off the routine | 225 ;; #### Now that this file is dumped, we should turn off the routine |
333 (savedir (file-name-directory savename))) | 333 (savedir (file-name-directory savename))) |
334 (cond ((or (not (auto-save-file-name-p basename)) | 334 (cond ((or (not (auto-save-file-name-p basename)) |
335 (string-match "^#%" basename)) | 335 (string-match "^#%" basename)) |
336 nil) | 336 nil) |
337 ;; now we know it looks like #...# thus substring is safe to use | 337 ;; now we know it looks like #...# thus substring is safe to use |
338 ((or (equal savedir | 338 ((or (equal savedir auto-save-directory) ; 2nd arg may be nil |
339 (and auto-save-directory | 339 (equal savedir auto-save-directory-fallback)) |
340 (expand-file-name auto-save-directory))) | |
341 ; 2nd arg may be nil | |
342 (equal savedir | |
343 (expand-file-name auto-save-directory-fallback))) | |
344 ;; it is of the `-fixed-directory' type | 340 ;; it is of the `-fixed-directory' type |
345 (auto-save-slashify-name (substring basename 1 -1))) | 341 (auto-save-slashify-name (substring basename 1 -1))) |
346 (t | 342 (t |
347 ;; else it is of `-same-directory' type | 343 ;; else it is of `-same-directory' type |
348 (concat savedir (substring basename 1 -1)))))) | 344 (concat savedir (substring basename 1 -1)))))) |
360 "#"))) | 356 "#"))) |
361 (if (and auto-save-hash-p | 357 (if (and auto-save-hash-p |
362 auto-save-hash-directory | 358 auto-save-hash-directory |
363 (> (length base-name) 14)) | 359 (> (length base-name) 14)) |
364 (expand-file-name (auto-save-cyclic-hash-14 filename) | 360 (expand-file-name (auto-save-cyclic-hash-14 filename) |
365 (auto-save-checked-directory auto-save-hash-directory)) | 361 auto-save-hash-directory) |
366 (expand-file-name base-name | 362 (expand-file-name base-name |
367 (auto-save-checked-directory | 363 (or auto-save-directory |
368 (or auto-save-directory | 364 auto-save-directory-fallback))))) |
369 auto-save-directory-fallback)))))) | |
370 | 365 |
371 (defun auto-save-name-in-same-directory (filename &optional prefix) | 366 (defun auto-save-name-in-same-directory (filename &optional prefix) |
372 ;; Enclose the non-directory part of FILENAME in `#' to make an auto | 367 ;; Enclose the non-directory part of FILENAME in `#' to make an auto |
373 ;; save file in the same directory as FILENAME. But if this | 368 ;; save file in the same directory as FILENAME. But if this |
374 ;; directory is not writable, use auto-save-directory-fallback. | 369 ;; directory is not writable, use auto-save-directory-fallback. |
377 ;; comes from a buffer name then), the fallback is used then. | 372 ;; comes from a buffer name then), the fallback is used then. |
378 ;; Optional PREFIX is string to use instead of "#" to prefix name. | 373 ;; Optional PREFIX is string to use instead of "#" to prefix name. |
379 (let ((directory (file-name-directory filename))) | 374 (let ((directory (file-name-directory filename))) |
380 (or (null directory) | 375 (or (null directory) |
381 (file-writable-p directory) | 376 (file-writable-p directory) |
382 (setq directory (auto-save-checked-directory | 377 (setq directory auto-save-directory-fallback)) |
383 auto-save-directory-fallback))) | |
384 (concat directory ; (concat nil) is "" | 378 (concat directory ; (concat nil) is "" |
385 (or prefix "#") | 379 (or prefix "#") |
386 (file-name-nondirectory filename) | 380 (file-name-nondirectory filename) |
387 "#"))) | 381 "#"))) |
388 | 382 |
501 t "\\`#" nil t)) | 495 t "\\`#" nil t)) |
502 afile ; the auto save file | 496 afile ; the auto save file |
503 file ; its original file | 497 file ; its original file |
504 (total 0) ; # of files offered to recover | 498 (total 0) ; # of files offered to recover |
505 (count 0)) ; # of files actually recovered | 499 (count 0)) ; # of files actually recovered |
506 (or (equal (expand-file-name auto-save-directory) | 500 (or (equal auto-save-directory auto-save-directory-fallback) |
507 (expand-file-name auto-save-directory-fallback)) | |
508 (setq savefiles | 501 (setq savefiles |
509 (nconc savefiles | 502 (nconc savefiles |
510 (directory-files auto-save-directory-fallback | 503 (directory-files auto-save-directory-fallback |
511 t "\\`#" nil t)))) | 504 t "\\`#" nil t)))) |
512 (while savefiles | 505 (while savefiles |