| @@ -1787,62 +1787,66 @@ if arg given, use that eshell buffer, otherwise make new eshell buffer." | |||||
| (define-key my-prefix-map (kbd "C-x C-c") 'save-buffers-kill-emacs) | (define-key my-prefix-map (kbd "C-x C-c") 'save-buffers-kill-emacs) | ||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
| ;; auto saving | |||||
| (defun my-save-current-buffer (silent-p) | |||||
| "save current buffer if can without asking" | |||||
| (let ((cm (if (current-message) | |||||
| (format "%s\n" (current-message)) | |||||
| "")) | |||||
| (fun (symbol-function (if silent-p | |||||
| 'ignore | |||||
| 'message)))) | |||||
| (cond ((active-minibuffer-window) nil) | |||||
| ((not buffer-file-name) | |||||
| (funcall fun | |||||
| "%ssaving... this buffer doesn't visit any file." cm) | |||||
| nil) | |||||
| ((not (file-exists-p buffer-file-name)) | |||||
| (funcall fun | |||||
| "%ssaving... file not exist. save manually first." cm) | |||||
| nil) | |||||
| (buffer-read-only | |||||
| (funcall fun | |||||
| "%ssaving... this buffer is read-only." cm) | |||||
| nil) | |||||
| ((not (buffer-modified-p)) | |||||
| (funcal fun | |||||
| "%ssaving... not modified yet." cm) | |||||
| nil) | |||||
| ((not (file-writable-p buffer-file-name)) | |||||
| (funcall fun | |||||
| "%ssaving... you cannot change this file." cm) | |||||
| nil) | |||||
| (t (funcall fun "%ssaving..." cm) | |||||
| (save-buffer) | |||||
| (funcall fun "%ssaving... done." cm))))) | |||||
| ;; (if (and buffer-file-name | |||||
| ;; (not buffer-read-only) | |||||
| ;; (buffer-modified-p) | |||||
| ;; (file-writable-p buffer-file-name)) | |||||
| ;; (save-buffer))) ; silent one | |||||
| (defvar my-auto-save-current-buffer nil "auto save timer object") | |||||
| (defun my-auto-save-current-buffer (sec &optional silent-p) | |||||
| "auto save current buffer if idle for SEC. | |||||
| when SEC is nil, stop auto save if enabled." | |||||
| ;; autosave | |||||
| (defun autosave-buffer-save-current-buffer () | |||||
| "Save current buffer. The variable `autosave-buffer-functions' decides if | |||||
| current buffer should be saved or not." | |||||
| (when (run-hook-with-args-until-failure 'autosave-buffer-functions) | |||||
| (save-buffer))) | |||||
| (defvar autosave-buffer-functions nil | |||||
| "A list of functions be called before autosave current buffer. | |||||
| Each function is called with no argument. Target buffer can be accessible by | |||||
| using `current-buffer'. If any of these functions return nil, autosaving will | |||||
| not happen.") | |||||
| (defvar autosave-buffer nil "Autosave timer object.") | |||||
| (defun autosave-buffer (secs) | |||||
| "Register timer so that the buffer will be saved automatically each time | |||||
| when emacs is idle for SECS. When SECS is nil, stop the timer and disable | |||||
| auto-saving." | |||||
| (if sec | (if sec | ||||
| (progn (when my-auto-save-current-buffer | |||||
| (cancel-timer my-auto-save-current-buffer) | |||||
| (setq my-auto-save-current-buffer nil)) | |||||
| (setq my-auto-save-current-buffer | |||||
| (run-with-idle-timer sec t 'my-save-current-buffer silent-p))) | |||||
| (when my-auto-save-current-buffer | |||||
| (cancel-timer my-auto-save-current-buffer) | |||||
| (setq my-auto-save-current-buffer nil)))) | |||||
| (my-auto-save-current-buffer 2 t) | |||||
| (progn (when autosave-buffer | |||||
| (cancel-timer autosave-buffer) | |||||
| (setq autosave-buffer nil)) | |||||
| (setq autosave-buffer | |||||
| (run-with-idle-timer secs | |||||
| t | |||||
| 'autosave-buffer-save-current-buffer))) | |||||
| (when autosave-buffer | |||||
| (cancel-timer autosave-buffer) | |||||
| (setq autosave-buffer nil)))) | |||||
| (defun autosave-buffer-buffer-file-name () | |||||
| "Return nil if current buffer is not visiting any file." | |||||
| buffer-file-name) | |||||
| (defun autosave-buffer-file-exists-p () | |||||
| "Return nil if the file current buffer is visiting is not exist." | |||||
| (file-exists-p buffer-file-name)) | |||||
| (defun autosave-buffer-buffer-writable-p () | |||||
| "Return nil if current buffer is read only." | |||||
| (not buffer-read-only)) | |||||
| (defun autosave-buffer-buffer-modified-p () | |||||
| "Return nil if current buffer is not modified yet since last save." | |||||
| (buffer-modified-p)) | |||||
| (defun autosave-buffer-buffer-file-writable-p () | |||||
| "Return nil if the file current buffer is visiting is not writable." | |||||
| (file-writable-p buffer-file-name)) | |||||
| (mapcar (lambda (f) | |||||
| (add-hook 'autosave-buffer-functions | |||||
| f)) | |||||
| '(autosave-buffer-buffer-file-name | |||||
| autosave-buffer-file-exists-p | |||||
| autosave-buffer-buffer-writable-p | |||||
| autosave-buffer-buffer-modified-p | |||||
| autosave-buffer-buffer-file-writable-p)) | |||||
| (autosave-buffer 2) | |||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
| ;; x open | ;; x open | ||||