aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorJuri Linkov2013-04-27 23:55:00 +0300
committerJuri Linkov2013-04-27 23:55:00 +0300
commit5db9dace2dad8407dd9267513cf73e8688ee2ad7 (patch)
tree1fe1e5aecaea52154e8c563ad63252efa91bfe7a /lisp
parentd7ed9b364adba7fc3c627ccd02f0ab453a23c661 (diff)
downloademacs-5db9dace2dad8407dd9267513cf73e8688ee2ad7.tar.gz
emacs-5db9dace2dad8407dd9267513cf73e8688ee2ad7.zip
* lisp/desktop.el (desktop-auto-save-timeout): New option.
(desktop-file-checksum): New variable. (desktop-save): Add optional arg `auto-save' and don't auto-save if nothing changed. (desktop-auto-save-timer): New variable. (desktop-auto-save, desktop-auto-save-set-timer): New functions. (after-init-hook): Call `desktop-auto-save-set-timer'. Suggested by Reuben Thomas <rrt@sc3d.org> in <http://lists.gnu.org/archive/html/emacs-devel/2013-04/msg00327.html>.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog14
-rw-r--r--lisp/desktop.el69
2 files changed, 76 insertions, 7 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index f1dade06c99..8a6ea86983d 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,15 @@
12013-04-27 Juri Linkov <juri@jurta.org>
2
3 * desktop.el (desktop-auto-save-timeout): New option.
4 (desktop-file-checksum): New variable.
5 (desktop-save): Add optional arg `auto-save' and don't auto-save
6 if nothing changed.
7 (desktop-auto-save-timer): New variable.
8 (desktop-auto-save, desktop-auto-save-set-timer): New functions.
9 (after-init-hook): Call `desktop-auto-save-set-timer'.
10 Suggested by Reuben Thomas <rrt@sc3d.org> in
11 <http://lists.gnu.org/archive/html/emacs-devel/2013-04/msg00327.html>.
12
12013-04-27 Leo Liu <sdl.web@gmail.com> 132013-04-27 Leo Liu <sdl.web@gmail.com>
2 14
3 * progmodes/octave.el (octave-function-file-p) 15 * progmodes/octave.el (octave-function-file-p)
@@ -160,7 +172,7 @@
160 (opascal-parse-next-literal, opascal-debug-unparse-buffer): 172 (opascal-parse-next-literal, opascal-debug-unparse-buffer):
161 Adjust callers. 173 Adjust callers.
162 174
1632013-04-24 Reuben Thomas <rrt@sc3d.org> 1752013-04-24 Reuben Thomas <rrt@sc3d.org>
164 176
165 * textmodes/remember.el (remember-handler-functions): Add an 177 * textmodes/remember.el (remember-handler-functions): Add an
166 option for a new handler `remember-store-in-files'. 178 option for a new handler `remember-store-in-files'.
diff --git a/lisp/desktop.el b/lisp/desktop.el
index 9c95f597fff..e9a839c4cf7 100644
--- a/lisp/desktop.el
+++ b/lisp/desktop.el
@@ -189,6 +189,19 @@ determine where the desktop is saved."
189 :group 'desktop 189 :group 'desktop
190 :version "22.1") 190 :version "22.1")
191 191
192(defcustom desktop-auto-save-timeout nil
193 "Number of seconds between auto-saves of the desktop.
194Zero or nil means disable timer-based auto-saving."
195 :type '(choice (const :tag "Off" nil)
196 (integer :tag "Seconds"))
197 :set (lambda (symbol value)
198 (set-default symbol value)
199 (condition-case nil
200 (desktop-auto-save-set-timer)
201 (error nil)))
202 :group 'desktop
203 :version "24.4")
204
192(defcustom desktop-load-locked-desktop 'ask 205(defcustom desktop-load-locked-desktop 'ask
193 "Specifies whether the desktop should be loaded if locked. 206 "Specifies whether the desktop should be loaded if locked.
194Possible values are: 207Possible values are:
@@ -539,6 +552,10 @@ DIRNAME omitted or nil means use `desktop-dirname'."
539(defvar desktop-delay-hook nil 552(defvar desktop-delay-hook nil
540 "Hooks run after all buffers are loaded; intended for internal use.") 553 "Hooks run after all buffers are loaded; intended for internal use.")
541 554
555(defvar desktop-file-checksum nil
556 "Checksum of the last auto-saved contents of the desktop file.
557Used to avoid writing contents unchanged between auto-saves.")
558
542;; ---------------------------------------------------------------------------- 559;; ----------------------------------------------------------------------------
543;; Desktop file conflict detection 560;; Desktop file conflict detection
544(defvar desktop-file-modtime nil 561(defvar desktop-file-modtime nil
@@ -842,11 +859,12 @@ DIRNAME must be the directory in which the desktop file will be saved."
842 859
843;; ---------------------------------------------------------------------------- 860;; ----------------------------------------------------------------------------
844;;;###autoload 861;;;###autoload
845(defun desktop-save (dirname &optional release) 862(defun desktop-save (dirname &optional release auto-save)
846 "Save the desktop in a desktop file. 863 "Save the desktop in a desktop file.
847Parameter DIRNAME specifies where to save the desktop file. 864Parameter DIRNAME specifies where to save the desktop file.
848Optional parameter RELEASE says whether we're done with this desktop. 865Optional parameter RELEASE says whether we're done with this desktop.
849See also `desktop-base-file-name'." 866If AUTO-SAVE is non-nil, compare the saved contents to the one last saved,
867and don't save the buffer if they are the same."
850 (interactive "DDirectory to save desktop file in: ") 868 (interactive "DDirectory to save desktop file in: ")
851 (setq desktop-dirname (file-name-as-directory (expand-file-name dirname))) 869 (setq desktop-dirname (file-name-as-directory (expand-file-name dirname)))
852 (save-excursion 870 (save-excursion
@@ -906,10 +924,17 @@ See also `desktop-base-file-name'."
906 (insert ")\n\n")))) 924 (insert ")\n\n"))))
907 925
908 (setq default-directory desktop-dirname) 926 (setq default-directory desktop-dirname)
909 (let ((coding-system-for-write 'emacs-mule)) 927 ;; If auto-saving, avoid writing if nothing has changed since the last write.
910 (write-region (point-min) (point-max) (desktop-full-file-name) nil 'nomessage)) 928 ;; Don't check 300 characters of the header that contains the timestamp.
911 ;; We remember when it was modified (which is presumably just now). 929 (let ((checksum (and auto-save (md5 (current-buffer)
912 (setq desktop-file-modtime (nth 5 (file-attributes (desktop-full-file-name))))))))) 930 (+ (point-min) 300) (point-max)
931 'emacs-mule))))
932 (unless (and auto-save (equal checksum desktop-file-checksum))
933 (let ((coding-system-for-write 'emacs-mule))
934 (write-region (point-min) (point-max) (desktop-full-file-name) nil 'nomessage))
935 (setq desktop-file-checksum checksum)
936 ;; We remember when it was modified (which is presumably just now).
937 (setq desktop-file-modtime (nth 5 (file-attributes (desktop-full-file-name)))))))))))
913 938
914;; ---------------------------------------------------------------------------- 939;; ----------------------------------------------------------------------------
915;;;###autoload 940;;;###autoload
@@ -1063,6 +1088,37 @@ directory DIRNAME."
1063 (message "Desktop saved in %s" (abbreviate-file-name desktop-dirname))) 1088 (message "Desktop saved in %s" (abbreviate-file-name desktop-dirname)))
1064 1089
1065;; ---------------------------------------------------------------------------- 1090;; ----------------------------------------------------------------------------
1091;; Auto-Saving.
1092(defvar desktop-auto-save-timer nil)
1093
1094(defun desktop-auto-save ()
1095 "Save the desktop periodically.
1096Called by the timer created in `desktop-auto-save-set-timer'."
1097 (when (and desktop-save-mode
1098 (integerp desktop-auto-save-timeout)
1099 (> desktop-auto-save-timeout 0)
1100 ;; Avoid desktop saving during lazy loading.
1101 (not desktop-lazy-timer)
1102 ;; Save only to own desktop file.
1103 (eq (emacs-pid) (desktop-owner))
1104 desktop-dirname)
1105 (desktop-save desktop-dirname nil t))
1106 (desktop-auto-save-set-timer))
1107
1108(defun desktop-auto-save-set-timer ()
1109 "Reset the auto-save timer.
1110Cancel any previous timer. When `desktop-auto-save-timeout' is a positive
1111integer, start a new timer to call `desktop-auto-save' in that many seconds."
1112 (when desktop-auto-save-timer
1113 (cancel-timer desktop-auto-save-timer)
1114 (setq desktop-auto-save-timer nil))
1115 (when (and (integerp desktop-auto-save-timeout)
1116 (> desktop-auto-save-timeout 0))
1117 (setq desktop-auto-save-timer
1118 (run-with-timer desktop-auto-save-timeout nil
1119 'desktop-auto-save))))
1120
1121;; ----------------------------------------------------------------------------
1066;;;###autoload 1122;;;###autoload
1067(defun desktop-revert () 1123(defun desktop-revert ()
1068 "Revert to the last loaded desktop." 1124 "Revert to the last loaded desktop."
@@ -1315,6 +1371,7 @@ If there are no buffers left to create, kill the timer."
1315 (setq desktop-save-mode nil))) 1371 (setq desktop-save-mode nil)))
1316 (when desktop-save-mode 1372 (when desktop-save-mode
1317 (desktop-read) 1373 (desktop-read)
1374 (desktop-auto-save-set-timer)
1318 (setq inhibit-startup-screen t)))) 1375 (setq inhibit-startup-screen t))))
1319 1376
1320(provide 'desktop) 1377(provide 'desktop)