From 1d0d1d612234ed3f8ab5f1feecfe290840ccb190 Mon Sep 17 00:00:00 2001 From: shipmints Date: Sat, 25 Jan 2025 14:04:51 -0500 Subject: [PATCH] Add auto save timer to save-place (bug#75837) * lisp/saveplace.el (save-place-autosave-interval): New user option 'save-place-autosave-interval' which defaults to nil, and has a custom :set to manage the timer. Add 'save-place--manage-timer' to enable or cancel the timer if the mode is enabled and 'save-place-autosave-interval' is non-nil. Amend 'save-place-mode' to invoke save-place--manage-timer. Add 'save-place--cancel-timer'. Add 'save-place--autosave'. (cherry picked from commit 1292b64216f636bacea7fedf578b373f03affdd8) --- lisp/saveplace.el | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/lisp/saveplace.el b/lisp/saveplace.el index 393708534d2..d6b3696f6c7 100644 --- a/lisp/saveplace.el +++ b/lisp/saveplace.el @@ -208,6 +208,45 @@ disabled, i.e., no files are excluded." (declare-function dired-current-directory "dired" (&optional localp)) +(defvar save-place--autosave-timer nil) + +(defun save-place--cancel-timer () + "Cancel `save-place-autosave' timer, if set." + (when (timerp save-place--autosave-timer) + (cancel-timer save-place--autosave-timer)) + (setq save-place--autosave-timer nil)) + +(defvar save-place-autosave-interval) + +(defun save-place--manage-timer () + "Set or cancel an invocation of `save-place--autosave' on a timer. +If `save-place-mode' is enabled, set the timer, otherwise cancel the timer." + (if (and save-place-mode + save-place-autosave-interval + (null save-place--autosave-timer)) + (setq save-place--autosave-timer + (run-with-timer + save-place-autosave-interval + save-place-autosave-interval #'save-place--autosave)) + (save-place--cancel-timer))) + +(defcustom save-place-autosave-interval nil + "The interval between auto saves of buffer places. +If set to nil, disables timer-based auto saving. +Use `setopt' or Customize commands to set this option." + :type '(choice (const :tag "Disabled" nil) + (integer :tag "Seconds")) + :version "31.1" + :set (lambda (sym val) + (set-default sym val) + (save-place--cancel-timer) + (save-place--manage-timer))) + +(defun save-place--autosave () + "Called by `save-place--autosave-timer'." + (save-places-to-alist) + (save-place-alist-to-file)) + (defun save-place--setup-hooks (add) (cond (add @@ -235,7 +274,8 @@ This means when you visit a file, point goes to the last place where it was when you previously visited the same file." :global t :group 'save-place - (save-place--setup-hooks save-place-mode)) + (save-place--setup-hooks save-place-mode) + (save-place--manage-timer)) (make-variable-buffer-local 'save-place-mode) @@ -258,7 +298,8 @@ file: dired-subdir-alist (dired-current-directory)))) (message "Buffer `%s' not visiting a file or directory" (buffer-name)) - (save-place--setup-hooks save-place-mode))) + (save-place--setup-hooks save-place-mode) + (save-place--manage-timer))) (declare-function dired-get-filename "dired" (&optional localp no-error-if-not-filep)) -- 2.39.5