;;; ... -*- lexical-binding: t -*- ;;; actually-autosave-mode: periodically invokes save-buffer ;; Authors: Dan Ports (drkp@mit.edu) ;; Created: 10-Aug-2009 ;; Version: 0.1 (require 'timer) (require 'easy-mmode) (defgroup actually-autosave nil "Save files periodically with save-buffer, i.e. saving them in-place, not making backup files" :group 'files :group 'convenience) (defvar actually-autosave-timer nil "Timer used by Actually-Autosave Mode.") (defvar actually-autosave-buffer-list () "List of buffers in Actually-Autosave Mode.") (defcustom actually-autosave-interval 5 "Time, in seconds, between Actually-Autosave Mode file checks. The value may be an integer or floating point number." :group 'actually-autosave :type 'number :set (lambda (variable value) (set-default variable value) (and (boundp 'actually-autosave-timer) actually-autosave-timer (actually-autosave-set-timer)))) (defcustom actually-autosave-only-when-idle 't "If true, check for files to save only when emacs has been idle for actually-autosave-interval seconds. If false, check every actually-autosave-interval seconds regardless of idleness." :group 'actually-autosave :type 'boolean :set (lambda (variable value) (set-default variable value) (and (boundp 'actually-autosave-timer) actually-autosave-timer (actually-autosave-set-timer)))) (defcustom actually-autosave-mode-text " ASav" "String to display in the mode line when actually-autosave-mode is active. \(When the string is not empty, make sure that it has a leading space.)" :tag "actually-autosave-mode Text" :group 'actually-autosave :type 'string) (define-minor-mode actually-autosave-mode "Minor mode that periodically invokes save-buffer to actually save the file in place (vs. generating a backup file like autosave-mode)." nil actually-autosave-mode-text nil (if actually-autosave-mode (progn (if (not (memq (current-buffer) actually-autosave-buffer-list)) (push (current-buffer) actually-autosave-buffer-list)) (actually-autosave-set-timer) (actually-autosave-buffers)) (setq actually-autosave-buffers (delq (current-buffer) actually-autosave-buffer-list)) (unless actually-autosave-buffers (actually-autosave-cancel-timer)))) (defun turn-on-actually-autosave-mode () "Turn on actually-autosave-mode" (actually-autosave-mode 1)) (defun actually-autosave-set-timer () (actually-autosave-cancel-timer) (setq actually-autosave-timer (if actually-autosave-only-when-idle (run-with-idle-timer actually-autosave-interval actually-autosave-interval 'actually-autosave-buffers) (run-with-timer actually-autosave-interval actually-autosave-interval 'actually-autosave-buffers)))) (defun actually-autosave-cancel-timer () (when (timerp actually-autosave-timer) (cancel-timer actually-autosave-timer) (setq actually-autosave-timer nil))) (defun actually-autosave-buffers () (dolist (buf actually-autosave-buffer-list) (if (buffer-live-p buf) (with-current-buffer buf (if (and (not actually-autosave-mode) (memq buf actually-autosave-buffer-list)) (progn (setq actually-autosave-buffer-list (delq buf actually-autosave-buffer-list)) (if (null actually-autosave-buffer-list) (actually-autosave-cancel-timer))) (actually-autosave-current-buffer)))))) (defun actually-autosave-current-buffer () (when (and (buffer-file-name) (buffer-modified-p)) (save-buffer))) (provide 'actually-autosave)