emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master ac7f76528f 2/3: New user option auto-save-visited-mode-predicate


From: Stefan Kangas
Subject: master ac7f76528f 2/3: New user option auto-save-visited-mode-predicate
Date: Tue, 5 Jul 2022 08:57:14 -0400 (EDT)

branch: master
commit ac7f76528f2f2e2f6e77bc25e7040eb3b07e45c0
Author: Stefan Kangas <stefan@marxist.se>
Commit: Stefan Kangas <stefan@marxist.se>

    New user option auto-save-visited-mode-predicate
    
    * lisp/files.el (auto-save-visited-mode-predicate): New defcustom.
    (auto-save-visited-mode): Use above new variable as a predicate to
    decide whether or not to save a buffer.
---
 etc/NEWS      |  7 +++++++
 lisp/files.el | 32 +++++++++++++++++++++++++++++++-
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/etc/NEWS b/etc/NEWS
index 7967190c6e..5926148648 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2001,6 +2001,13 @@ Set it to nil to exclude line numbering from kills and 
copies.
 This option provides a mechanism to selectively disable font-lock
 keyword-driven fontifications.
 
+---
+*** New user option 'auto-save-visited-predicate'.
+This user option is a predicate function which is called by
+'auto-save-visited-mode' to decide whether or not to save a buffer.
+You can use it to automatically save only specific buffers, for
+example buffers using a particular mode or in some directory.
+
 +++
 *** New package vtable.el for formatting tabular data.
 This package allows formatting data using variable-pitch fonts.
diff --git a/lisp/files.el b/lisp/files.el
index 8812175014..55c50c33b4 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -443,6 +443,31 @@ idle for `auto-save-visited-interval' seconds."
          (when auto-save--timer
            (timer-set-idle-time auto-save--timer value :repeat))))
 
+(defcustom auto-save-visited-predicate nil
+  "Predicate function for `auto-save-visited-mode'.
+
+This function is called (with no argument) once in each
+file-visiting buffer.  Only those buffers are saved, where
+the predicate function returns a non-nil value.
+
+For example, you could add this to your Init file to only save
+files that are both in Org mode and in a particular directory:
+
+    (setq auto-save-visited-predicate
+          (lambda () (and (eq major-mode \\='org-mode)
+                          (string-match \"^/home/skangas/org/\"
+                                        buffer-file-name))))
+
+If the value of this variable is not a function, it is ignored.
+This is the same as having a predicate that always returns
+true."
+  :group 'auto-save
+  :type '(choice :tag "Function:"
+                 (const :tag "No extra predicate" :value nil)
+                 (function :tag "Predicate function" :value always))
+  :risky t
+  :version "29.1")
+
 (define-minor-mode auto-save-visited-mode
   "Toggle automatic saving to file-visiting buffers on or off.
 
@@ -453,6 +478,9 @@ Unlike `auto-save-mode', this mode will auto-save buffer 
contents
 to the visited files directly and will also run all save-related
 hooks.  See Info node `Saving' for details of the save process.
 
+You can use `auto-save-visited-predicate' to control which
+buffers are saved.
+
 You can also set the buffer-local value of the variable
 `auto-save-visited-mode' to nil.  A buffer where the buffer-local
 value of this variable is nil is ignored for the purpose of
@@ -472,7 +500,9 @@ For more details, see Info node `(emacs) Auto Save Files'."
              (and buffer-file-name
                   auto-save-visited-mode
                   (not (and buffer-auto-save-file-name
-                            auto-save-visited-file-name))))))))
+                            auto-save-visited-file-name))
+                  (or (not (functionp auto-save-visited-predicate))
+                      (funcall auto-save-visited-predicate))))))))
 
 ;; The 'set' part is so we don't get a warning for using this variable
 ;; above, while still catching code that _sets_ the variable to get



reply via email to

[Prev in Thread] Current Thread [Next in Thread]