# HG changeset patch # User David Ponce # Date 1111562448 0 # Node ID 5bb0c1e05b1b825379913ab5b0469aecfed22c13 # Parent 4e549a9044e1667886086945c17f40f9444fbb4d (recentf-keep): New option. (recentf-menu-action): Default to `find-file'. (recentf-keep-non-readable-files-flag) (recentf-keep-non-readable-files-p) (recentf-file-readable-p, recentf-find-file) (recentf-cleanup-remote): Remove. (recentf-include-p): More robust. (recentf-keep-p): New function. (recentf-remove-if-non-kept): Rename from `recentf-remove-if-non-readable'. Use `recentf-keep-p'. All callers updated. (recentf-menu-items-for-commands): Fix help string. (recentf-track-closed-file): Update. Doc fix. (recentf-cleanup): Update. Count removed files. Doc fix. diff -r 4e549a9044e1 -r 5bb0c1e05b1b lisp/recentf.el --- a/lisp/recentf.el Wed Mar 23 03:06:01 2005 +0000 +++ b/lisp/recentf.el Wed Mar 23 07:20:48 2005 +0000 @@ -1,6 +1,6 @@ ;;; recentf.el --- setup a menu of recently opened files -;; Copyright (C) 1999, 2000, 2001, 2002, 2003 +;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2005 ;; Free Software Foundation, Inc. ;; Author: David Ponce @@ -84,6 +84,22 @@ :group 'recentf :type '(repeat (choice regexp function))) +(defcustom recentf-keep + '(file-readable-p) + "*List of regexps and predicates for filenames kept in the recent list. +Regexps and predicates are tried in the specified order. +When nil all filenames are kept in the recent list. +When a filename matches any of the regexps or satisfies any of the +predicates it is kept in the recent list. +The default is to keep readable files. +A predicate is a function that is passed a filename to check and that +must return non-nil to keep it. For example, you can add the +`file-remote-p' predicate in front of this list to keep remote file +names in the recent list without checking their readability through a +remote access." + :group 'recentf + :type '(repeat (choice regexp function))) + (defun recentf-menu-customization-changed (variable value) "Function called when the recentf menu customization has changed. Set VARIABLE with VALUE, and force a rebuild of the recentf menu." @@ -114,9 +130,9 @@ (const :tag "Last" nil)) :set 'recentf-menu-customization-changed) -(defcustom recentf-menu-action 'recentf-find-file +(defcustom recentf-menu-action 'find-file "*Function to invoke with a filename item of the recentf menu. -The default is to call `recentf-find-file' to edit the selected file." +The default is to call `find-file' to edit the selected file." :group 'recentf :type 'function :set 'recentf-menu-customization-changed) @@ -194,17 +210,6 @@ 'recentf-menu-append-commands-flag "22.1") -(defcustom recentf-keep-non-readable-files-flag nil - "*non-nil means to keep non readable files in the recent list." - :group 'recentf - :type 'boolean) - -(defvaralias 'recentf-keep-non-readable-files-p - 'recentf-keep-non-readable-files-flag) -(make-obsolete-variable 'recentf-keep-non-readable-files-p - 'recentf-keep-non-readable-files-flag - "22.1") - (defcustom recentf-auto-cleanup 'mode "*Define when to automatically cleanup the recent list. The following values can be set: @@ -255,11 +260,6 @@ If it returns nil, the filename is left unchanged." :group 'recentf :type 'function) - -(defcustom recentf-cleanup-remote t - "*non-nil means to auto cleanup remote files." - :group 'recentf - :type 'boolean) ;;; Utilities ;; @@ -356,56 +356,56 @@ (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 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) (checks recentf-exclude) - (keepit t) - check) + (keepit t)) (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))))) + (setq keepit (condition-case nil + (not (if (stringp (car checks)) + ;; A regexp + (string-match (car checks) filename) + ;; A predicate + (funcall (car checks) filename))) + (error nil)) + checks (cdr checks))) + keepit)) + +(defun recentf-keep-p (filename) + "Return non-nil if FILENAME should be kept in the recent list. +That is, if it matches any of the `recentf-keep' checks." + (let* ((case-fold-search recentf-case-fold-search) + (checks recentf-keep) + (keepit (null checks))) + (while (and checks (not keepit)) + (setq keepit (condition-case nil + (if (stringp (car checks)) + ;; A regexp + (string-match (car checks) filename) + ;; A predicate + (funcall (car checks) filename)) + (error nil)) + checks (cdr checks))) keepit)) (defsubst recentf-add-file (filename) "Add or move FILENAME at the beginning of the recent list. -Does nothing if the name satisfies any of the `recentf-exclude' regexps or -predicates." +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))) -(defsubst recentf-remove-if-non-readable (filename) - "Remove FILENAME from the recent list, if file is not readable. +(defsubst recentf-remove-if-non-kept (filename) + "Remove FILENAME from the recent list, if file is not kept. Return non-nil if FILENAME has been removed." - (unless (recentf-file-readable-p filename) + (unless (recentf-keep-p filename) (let ((m (recentf-string-member (recentf-expand-file-name filename) recentf-list))) (and m (setq recentf-list (delq (car m) recentf-list)))))) -(defun recentf-find-file (filename) - "Edit file FILENAME using `find-file'. -If the file does not exist or is non readable, and -`recentf-keep-non-readable-files-flag' is nil, it is not edited and -its name is removed from the recent list." - (if (and (not recentf-keep-non-readable-files-flag) - (recentf-remove-if-non-readable filename)) - (message "File `%s' not found" filename) - (find-file filename))) - (defsubst recentf-directory-compare (f1 f2) "Compare absolute filenames F1 and F2. First compare directories, then filenames sans directory. @@ -422,7 +422,7 @@ (defvar recentf-menu-items-for-commands (list ["Cleanup list" recentf-cleanup - :help "Remove all non-readable and excluded files from the recent list" + :help "Remove all excluded and non-kept files from the recent list" :active t] ["Edit list..." recentf-edit-list @@ -938,11 +938,9 @@ (defun recentf-track-closed-file () "Update the recent list when a buffer is killed. -That is, remove a non readable file from the recent list, if -`recentf-keep-non-readable-files-flag' is nil." +That is, remove a non kept file from the recent list." (and buffer-file-name - (not recentf-keep-non-readable-files-flag) - (recentf-remove-if-non-readable buffer-file-name))) + (recentf-remove-if-non-kept buffer-file-name))) (defun recentf-update-menu () "Update the recentf menu from the current recent list." @@ -1169,19 +1167,18 @@ recentf-list)))))) (defun recentf-cleanup () - "Remove all excluded or non-readable files from the recent list." + "Remove all non-kept and excluded files from the recent list." (interactive) (message "Cleaning up the recentf list...") - (let (newlist) + (let ((n 0) newlist) (dolist (f recentf-list) (if (and (recentf-include-p f) - (or (and (file-remote-p f) - (not recentf-cleanup-remote)) - (recentf-file-readable-p f))) + (recentf-keep-p f)) (push f newlist) + (setq n (1+ n)) (message "File %s removed from the recentf list" f))) - (setq recentf-list (nreverse newlist)) - (message "Cleaning up the recentf list...done"))) + (message "Cleaning up the recentf list...done (%d removed)" n) + (setq recentf-list (nreverse newlist)))) ;;;###autoload (define-minor-mode recentf-mode