X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/4787a496a05fdc03241850b45911dd283d4b06b8..52bedd34385bf6434d60d884b306e5883fb656d9:/lisp/recentf.el diff --git a/lisp/recentf.el b/lisp/recentf.el index 589e5ebbd3..79f4eb437d 100644 --- a/lisp/recentf.el +++ b/lisp/recentf.el @@ -1,7 +1,6 @@ ;;; recentf.el --- setup a menu of recently opened files -;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, -;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +;; Copyright (C) 1999-2011 Free Software Foundation, Inc. ;; Author: David Ponce ;; Created: July 19 1999 @@ -26,11 +25,14 @@ ;; This package maintains a menu for visiting files that were operated ;; on recently. When enabled a new "Open Recent" sub menu is -;; displayed in the "Files" menu. The recent files list is +;; displayed in the "File" menu. The recent files list is ;; automatically saved across Emacs sessions. You can customize the ;; number of recent files displayed, the location of the menu and ;; others options (see the source code for details). +;; To enable this package, add the following to your .emacs: +;; (recentf-mode 1) + ;;; History: ;; @@ -67,7 +69,7 @@ See the command `recentf-save-list'." :group 'recentf :type 'integer) -(defcustom recentf-save-file "~/.recentf" +(defcustom recentf-save-file (convert-standard-filename "~/.recentf") "File to save the recent list into." :group 'recentf :type 'file @@ -300,7 +302,7 @@ used as shortcuts to open the Nth file." ;;; Utilities ;; (defconst recentf-case-fold-search - (memq system-type '(vax-vms windows-nt cygwin)) + (memq system-type '(windows-nt cygwin)) "Non-nil if recentf searches and matches should ignore case.") (defsubst recentf-string-equal (s1 s2) @@ -409,13 +411,14 @@ That is, if it doesn't match any of the `recentf-exclude' checks." (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)) + ;; If there was an error in a predicate, err on the side of + ;; keeping the file. (Bug#5843) + (setq keepit (not (ignore-errors + (if (stringp (car checks)) + ;; A regexp + (string-match (car checks) filename) + ;; A predicate + (funcall (car checks) filename)))) checks (cdr checks))) keepit)) @@ -587,7 +590,7 @@ menu-elements (no sub-menu)." ;; Count the number of assigned menu shortcuts. (defvar recentf-menu-shortcuts) -(defun recentf-make-menu-items (&optional menu) +(defun recentf-make-menu-items (&optional _menu) "Make menu items from the recent list. This is a menu filter function which ignores the MENU argument." (setq recentf-menu-filter-commands nil) @@ -1033,7 +1036,7 @@ That is, remove a non kept file from the recent list." ;;; Common dialog stuff ;; -(defun recentf-cancel-dialog (&rest ignore) +(defun recentf-cancel-dialog (&rest _ignore) "Cancel the current dialog. IGNORE arguments." (interactive) @@ -1089,7 +1092,7 @@ Go to the beginning of buffer if not found." ;; (defvar recentf-edit-list nil) -(defun recentf-edit-list-select (widget &rest ignore) +(defun recentf-edit-list-select (widget &rest _ignore) "Toggle a file selection based on the checkbox WIDGET state. IGNORE other arguments." (let ((value (widget-get widget :tag)) @@ -1099,7 +1102,7 @@ IGNORE other arguments." (setq recentf-edit-list (delq value recentf-edit-list))) (message "%s %sselected" value (if check "" "un")))) -(defun recentf-edit-list-validate (&rest ignore) +(defun recentf-edit-list-validate (&rest _ignore) "Process the recent list when the edit list dialog is committed. IGNORE arguments." (if recentf-edit-list @@ -1143,7 +1146,7 @@ Click on Cancel or type `q' to cancel.\n") ;;; Open file dialog ;; -(defun recentf-open-files-action (widget &rest ignore) +(defun recentf-open-files-action (widget &rest _ignore) "Open the file stored in WIDGET's value when notified. IGNORE other arguments." (kill-buffer (current-buffer)) @@ -1307,13 +1310,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) @@ -1326,12 +1336,14 @@ That is, remove duplicates, non-kept, and excluded files." ;;;###autoload (define-minor-mode recentf-mode - "Toggle recentf mode. -With prefix argument ARG, turn on if positive, otherwise off. -Returns non-nil if the new state is enabled. - -When recentf mode is enabled, it maintains a menu for visiting files -that were operated on recently." + "Toggle \"Open Recent\" menu (Recentf mode). +With a prefix argument ARG, enable Recentf mode if ARG is +positive, and disable it otherwise. If called from Lisp, enable +Recentf mode if ARG is omitted or nil. + +When Recentf mode is enabled, a \"Open Recent\" submenu is +displayed in the \"File\" menu, containing a list of files that +were operated on recently." :global t :group 'recentf :keymap recentf-mode-map @@ -1345,15 +1357,16 @@ that were operated on recently." (recentf-auto-cleanup) (let ((hook-setup (if recentf-mode 'add-hook 'remove-hook))) (dolist (hook recentf-used-hooks) - (apply hook-setup hook))) - (run-hooks 'recentf-mode-hook) - (when (interactive-p) - (message "Recentf mode %sabled" (if recentf-mode "en" "dis")))) - recentf-mode) + (apply hook-setup hook))))) + +(defun recentf-unload-function () + "Unload the recentf library." + (recentf-mode -1) + ;; continue standard unloading + nil) (provide 'recentf) (run-hooks 'recentf-load-hook) -;; arch-tag: 78f1eec9-0d16-4d19-a4eb-2e4529edb62a ;;; recentf.el ends here