summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog5
-rw-r--r--lisp/recentf.el15
2 files changed, 16 insertions, 4 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 11bfa9bce85..0ad8e2f07cf 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,8 @@
+2009-09-13 Vincent Belaïche <vincent.belaiche@gmail.com>
+
+ * recentf.el (recentf-cleanup): Use a hash table to find
+ duplicates (Bug#4407).
+
2009-09-13 Per Starbäck <per@starback.se> (tiny change)
* textmodes/ispell.el (ispell-command-loop): Convert keys such as
diff --git a/lisp/recentf.el b/lisp/recentf.el
index bc8904f9211..c0fa933840a 100644
--- a/lisp/recentf.el
+++ b/lisp/recentf.el
@@ -1307,13 +1307,20 @@ empty `file-name-history' with the recent list."
That is, remove duplicates, non-kept, and excluded files."
(interactive)
(message "Cleaning up the recentf list...")
- (let ((n 0) newlist)
+ (let ((n 0)
+ (ht (make-hash-table
+ :size recentf-max-saved-items
+ :test 'equal))
+ newlist key)
(dolist (f recentf-list)
- (setq f (recentf-expand-file-name f))
+ (setq f (recentf-expand-file-name f)
+ key (if recentf-case-fold-search (downcase f) f))
(if (and (recentf-include-p f)
(recentf-keep-p f)
- (not (recentf-string-member f newlist)))
- (push f newlist)
+ (not (gethash key ht)))
+ (progn
+ (push f newlist)
+ (puthash key t ht))
(setq n (1+ n))
(message "File %s removed from the recentf list" f)))
(message "Cleaning up the recentf list...done (%d removed)" n)