|
@@ -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 |
|
|