diff options
| author | Juri Linkov | 2013-04-27 23:55:00 +0300 |
|---|---|---|
| committer | Juri Linkov | 2013-04-27 23:55:00 +0300 |
| commit | 5db9dace2dad8407dd9267513cf73e8688ee2ad7 (patch) | |
| tree | 1fe1e5aecaea52154e8c563ad63252efa91bfe7a /lisp | |
| parent | d7ed9b364adba7fc3c627ccd02f0ab453a23c661 (diff) | |
| download | emacs-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/ChangeLog | 14 | ||||
| -rw-r--r-- | lisp/desktop.el | 69 |
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 @@ | |||
| 1 | 2013-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 | |||
| 1 | 2013-04-27 Leo Liu <sdl.web@gmail.com> | 13 | 2013-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 | ||
| 163 | 2013-04-24 Reuben Thomas <rrt@sc3d.org> | 175 | 2013-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. | ||
| 194 | Zero 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. |
| 194 | Possible values are: | 207 | Possible 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. | ||
| 557 | Used 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. |
| 847 | Parameter DIRNAME specifies where to save the desktop file. | 864 | Parameter DIRNAME specifies where to save the desktop file. |
| 848 | Optional parameter RELEASE says whether we're done with this desktop. | 865 | Optional parameter RELEASE says whether we're done with this desktop. |
| 849 | See also `desktop-base-file-name'." | 866 | If AUTO-SAVE is non-nil, compare the saved contents to the one last saved, |
| 867 | and 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. | ||
| 1096 | Called 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. | ||
| 1110 | Cancel any previous timer. When `desktop-auto-save-timeout' is a positive | ||
| 1111 | integer, 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) |