unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Michael Mauger <mmaug@yahoo.com>
Cc: Emacs Devel <emacs-devel@gnu.org>
Subject: Re: Revisit: recentf-cleanup, file-readable-p & remote files
Date: Mon, 14 Mar 2005 09:36:38 -0800 (PST)	[thread overview]
Message-ID: <20050314173639.19272.qmail@web60305.mail.yahoo.com> (raw)
In-Reply-To: <423429B2.8000101@wanadoo.fr>

[-- Attachment #1: Type: text/plain, Size: 2115 bytes --]


--- David Ponce <david.ponce@wanadoo.fr> wrote:

> Hi Michael and other Emacs developers,
> 
>  > I am now in a situation where about half of the files I edit are
>  > local and the remainder are on a remote Unix server.  I appreciate
>  > the automatic cleanup of files on the recentf list and would like to
>  > leave that feature in place.  Unfortunately the time to connect to
>  > the badly overloaded server and checking files there has gotten
>  > painful.  Having the remote filenames on the recentf list is
>  > valuable (thus I don't want to place remote files on the
>  > recentf-exclude list).  What I would like to be able to do is just
>  > not check these remote files as part of the auto cleanup process.
>  >
> 
> Your patch looks good. However I would prefer a more general mechanism
> to keep files in the recent list, that is which can keep remote files
> of course but other ones too.
> 
> Here is a patch that implements that. It introduces a new customizable
> variable `recentf-keep' which can be saw as a counterpoint of
> `recentf-exclude'. It uses the same format so you can force to keep
> file names in the recent list based on regexp matching or on
> predicates. For compatibility, the default is to keep readable files,
> that is those that verify the `file-readable-p' predicate. It is
> easy to keep remote file names too by adding the `file-remote-p'
> predicate in front of `recentf-keep'. To keep all file names just set
> `recentf-keep' to nil.
> 
> Another advantage of that solution is that it eliminates the need of
> the `recentf-keep-non-readable-files-flag' flag and simplifies the
> implementation! I also removed the unnecessary `recentf-find-file'
> wrapper function to directly use `find-file' to open files.
> 
> Could you please try this patch? WDYT?
> 
> If there is no objection, can I commit it?
> 
> Thanks!
> David
> 

I had problems with the patch but was able to manually recreate the
results.  It works great.  I'll run it for a couple of days and I'll let
you and the list know if I encounter any problems.

Attached is my re-created version of the patch.

[-- Attachment #2: recentf.diff --]
[-- Type: application/octet-stream, Size: 10144 bytes --]

Index: emacs/lisp/recentf.el
===================================================================
RCS file: /c/cvsroot/emacs/emacs/lisp/recentf.el,v
retrieving revision 1.33
diff -c -r1.33 recentf.el
*** emacs/lisp/recentf.el	9 Feb 2005 15:50:41 -0000	1.33
--- emacs/lisp/recentf.el	14 Mar 2005 17:20:09 -0000
***************
*** 1,6 ****
  ;;; recentf.el --- setup a menu of recently opened files
  
! ;; Copyright (C) 1999, 2000, 2001, 2002, 2003
  ;;   Free Software Foundation, Inc.
  
  ;; Author: David Ponce <david@dponce.com>
--- 1,6 ----
  ;;; recentf.el --- setup a menu of recently opened files
  
! ;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2005
  ;;   Free Software Foundation, Inc.
  
  ;; Author: David Ponce <david@dponce.com>
***************
*** 84,89 ****
--- 84,102 ----
    :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.
+ A predicate is a function that is passed a filename to check and that
+ must return non-nil to keep it.
+ The default is to keep readable files."
+   :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,122 ****
                   (const :tag "Last" nil))
    :set 'recentf-menu-customization-changed)
  
! (defcustom recentf-menu-action 'recentf-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."
    :group 'recentf
    :type 'function
    :set 'recentf-menu-customization-changed)
--- 127,135 ----
                   (const :tag "Last" nil))
    :set 'recentf-menu-customization-changed)
  
! (defcustom recentf-menu-action 'find-file
    "*Function to invoke with a filename item of the recentf menu.
! The default is to call `find-file' to edit the selected file."
    :group 'recentf
    :type 'function
    :set 'recentf-menu-customization-changed)
***************
*** 194,210 ****
                          '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:
--- 207,212 ----
***************
*** 351,378 ****
               (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)
      (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)
--- 353,390 ----
               (funcall recentf-filename-handler filename))
          filename)))
  
  (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))
      (while (and checks keepit)
!       (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)
***************
*** 383,406 ****
    (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.
  Return non-nil if FILENAME has been removed."
!   (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))))))
  
- (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.
--- 395,408 ----
    (when (recentf-include-p filename)
      (recentf-push filename)))
  
! (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-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))))))
  
  (defsubst recentf-directory-compare (f1 f2)
    "Compare absolute filenames F1 and F2.
  First compare directories, then filenames sans directory.
***************
*** 417,423 ****
  (defvar recentf-menu-items-for-commands
    (list ["Cleanup list"
           recentf-cleanup
!          :help "Remove all non-readable and excluded files from the recent list"
           :active t]
          ["Edit list..."
           recentf-edit-list
--- 419,425 ----
  (defvar recentf-menu-items-for-commands
    (list ["Cleanup list"
           recentf-cleanup
!          :help "Remove all excluded and non-kept files from the recent list"
           :active t]
          ["Edit list..."
           recentf-edit-list
***************
*** 933,943 ****
  
  (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."
    (and buffer-file-name
!        (not recentf-keep-non-readable-files-flag)
!        (recentf-remove-if-non-readable buffer-file-name)))
  
  (defun recentf-update-menu ()
    "Update the recentf menu from the current recent list."
--- 935,943 ----
  
  (defun recentf-track-closed-file ()
    "Update the recent list when a buffer is killed.
! That is, remove a non kept file from the recent list."
    (and buffer-file-name
!        (recentf-remove-if-non-kept buffer-file-name)))
  
  (defun recentf-update-menu ()
    "Update the recentf menu from the current recent list."
***************
*** 1164,1179 ****
                                             recentf-list))))))
  
  (defun recentf-cleanup ()
!   "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) (recentf-file-readable-p f))
!           (push f newlist)
!         (message "File %s removed from the recentf list" f)))
!     (setq recentf-list (nreverse newlist))
!     (message "Cleaning up the recentf list...done")))
  
  ;;;###autoload
  (define-minor-mode recentf-mode
--- 1164,1181 ----
                                             recentf-list))))))
  
  (defun recentf-cleanup ()
!   "Remove all non-kept and excluded files from the recent list."
    (interactive)
    (message "Cleaning up the recentf list...")
!   (let ((n 0) newlist)
      (dolist (f recentf-list)
!       (if (and (recentf-include-p f)
! 	       (recentf-keep-p f))
! 	  (push f newlist)
! 	(setq n (1+ n))
! 	(message "File %s removed from the recentf list" f)))
!     (message "Cleaning up the recentf list...done (%d removed)" n)
!     (setq recentf-list (nreverse newlist))))
  
  ;;;###autoload
  (define-minor-mode recentf-mode

[-- Attachment #3: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel

  reply	other threads:[~2005-03-14 17:36 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-03-11 22:32 Revisit: recentf-cleanup, file-readable-p & remote files Michael Mauger
2005-03-13 11:53 ` David Ponce
2005-03-14 17:36   ` Michael Mauger [this message]
  -- strict thread matches above, loose matches on Subject: below --
2005-03-21 11:21 David PONCE

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20050314173639.19272.qmail@web60305.mail.yahoo.com \
    --to=mmaug@yahoo.com \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).