(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.
This commit is contained in:
David Ponce 2005-03-23 07:20:48 +00:00
parent 90563cb3fb
commit eafc2b271a

View file

@ -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 <david@dponce.com>
@ -84,6 +84,22 @@ must return non-nil to exclude it."
: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 @@ If nil add it at end of menu (see also `easy-menu-add-item')."
(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 @@ elements (see `recentf-make-menu-element' for menu element form)."
'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 @@ It is passed a filename to give a chance to transform it.
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 @@ process the canonical name."
(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 @@ Return non-nil if F1 is less than F2."
(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 @@ IGNORE arguments."
(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 @@ empty `file-name-history' with the recent list."
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