changeset 52509:5308684cd360

David Ponce <david@dponce.com> (recentf-exclude): Accept predicates too. (recentf-file-readable-p): New function. (recentf-include-p): Handle predicates in recentf-exclude. (recentf-add-file): Doc fix. Use recentf-file-readable-p. (recentf-cleanup): Likewise. (recentf-save-list): Use write-file to handle backup of recentf-save-file.
author Glenn Morris <rgm@gnu.org>
date Mon, 15 Sep 2003 16:24:35 +0000
parents 1c9066a14355
children a891bc3b4158
files lisp/recentf.el
diffstat 1 files changed, 35 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/recentf.el	Mon Sep 15 16:23:29 2003 +0000
+++ b/lisp/recentf.el	Mon Sep 15 16:24:35 2003 +0000
@@ -8,7 +8,7 @@
 ;; Maintainer: FSF
 ;; Keywords: files
 
-(defconst recentf-version "$Revision: 1.25 $")
+(defconst recentf-version "$Revision: 1.26 $")
 
 ;; This file is part of GNU Emacs.
 
@@ -78,9 +78,13 @@
   :type 'file)
 
 (defcustom recentf-exclude nil
-  "*List of regexps for filenames excluded from the recent list."
+"*List of regexps and predicates for filenames excluded from the recent list.
+When a filename matches any of the regexps or satisfies any of the
+predicates it is excluded from the recent list.
+A predicate is a function that is passed a filename to check and that
+must return non-nil to exclude it."
   :group 'recentf
-  :type '(repeat regexp))
+  :type '(repeat (choice regexp function)))
 
 (defun recentf-menu-customization-changed (variable value)
   "Function called when the recentf menu customization has changed.
@@ -343,17 +347,34 @@
              (funcall recentf-filename-handler filename))
         filename)))
 
+(defsubst recentf-file-readable-p (filename)
+  "Return t if file FILENAME exists and you can read it.
+Like the function `file-readable-p' but return nil on error."
+  (condition-case nil
+      (file-readable-p filename)
+    (error nil)))
+
 (defun recentf-include-p (filename)
-  "Return t if FILENAME match none of the `recentf-exclude' regexps."
+  "Return non-nil if FILENAME should be included in the recent list.
+That is, if it doesn't match any of the `recentf-exclude' checks."
   (let ((case-fold-search recentf-case-fold-search)
-        (rl recentf-exclude))
-    (while (and rl (not (string-match (car rl) filename)))
-      (setq rl (cdr rl)))
-    (null rl)))
+        (checks recentf-exclude)
+        (keepit t)
+        check)
+    (while (and checks keepit)
+      (setq check  (car checks)
+            checks (cdr checks)
+            keepit (not (if (stringp check)
+                            ;; A regexp
+                            (string-match check filename)
+                          ;; A predicate
+                          (funcall check filename)))))
+    keepit))
 
 (defsubst recentf-add-file (filename)
   "Add or move FILENAME at the beginning of the recent list.
-Does nothing it if it matches any of the `recentf-exclude' regexps."
+Does nothing if the name satisfies any of the `recentf-exclude' regexps or
+predicates."
   (setq filename (recentf-expand-file-name filename))
   (when (recentf-include-p filename)
     (recentf-push filename)))
@@ -361,7 +382,7 @@
 (defsubst recentf-remove-if-non-readable (filename)
   "Remove FILENAME from the recent list, if file is not readable.
 Return non-nil if FILENAME has been removed."
-  (unless (file-readable-p filename)
+  (unless (recentf-file-readable-p filename)
     (let ((m (recentf-string-member
               (recentf-expand-file-name filename) recentf-list)))
       (and m (setq recentf-list (delq (car m) recentf-list))))))
@@ -1112,11 +1133,12 @@
   "Save the recent list.
 Write data into the file specified by `recentf-save-file'."
   (interactive)
-  (with-temp-file (expand-file-name recentf-save-file)
+  (with-temp-buffer
     (erase-buffer)
     (insert (format recentf-save-file-header (current-time-string)))
     (recentf-dump-variable 'recentf-list recentf-max-saved-items)
     (recentf-dump-variable 'recentf-filter-changer-state)
+    (write-file (expand-file-name recentf-save-file))
     nil))
 
 (defun recentf-load-list ()
@@ -1128,12 +1150,12 @@
       (load-file file))))
 
 (defun recentf-cleanup ()
-  "Remove all non-readable and excluded files from the recent list."
+  "Remove all excluded or non-readable files from the recent list."
   (interactive)
   (message "Cleaning up the recentf list...")
   (let (newlist)
     (dolist (f recentf-list)
-      (if (and (recentf-include-p f) (file-readable-p f))
+      (if (and (recentf-include-p f) (recentf-file-readable-p f))
           (push f newlist)
         (message "File %s removed from the recentf list" f)))
     (setq recentf-list (nreverse newlist))