annotate lisp/recentf.el @ 72550:666bd542be19

(get_window_cursor_type): Replace BOX cursor on images with a hollow box cursor if image is larger than 32x32 (or the default frame font if that is bigger). Replace any other cursor on images with hollow box cursor, as redisplay doesn't support bar and hbar cursors on images.
author Kim F. Storm <storm@cua.dk>
date Sun, 27 Aug 2006 22:23:07 +0000
parents 6828bafcac8e
children d14b0d59315b 81f2d90dee68 65ca8fb66a0d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38436
b174db545cfd Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 35971
diff changeset
1 ;;; recentf.el --- setup a menu of recently opened files
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
2
64762
41bb365f41c4 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64664
diff changeset
3 ;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
68651
3bd95f4f2941 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 67589
diff changeset
4 ;; 2005, 2006 Free Software Foundation, Inc.
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
5
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
6 ;; Author: David Ponce <david@dponce.com>
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
7 ;; Created: July 19 1999
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
8 ;; Keywords: files
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
9
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
10 ;; This file is part of GNU Emacs.
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
11
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
13 ;; it under the terms of the GNU General Public License as published
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
14 ;; by the Free Software Foundation; either version 2, or (at your
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
15 ;; option) any later version.
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
16
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
20 ;; GNU General Public License for more details.
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
21
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
22 ;; You should have received a copy of the GNU General Public License
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64091
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 63781
diff changeset
24 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 63781
diff changeset
25 ;; Boston, MA 02110-1301, USA.
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
26
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
27 ;;; Commentary:
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
28
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
29 ;; This package maintains a menu for visiting files that were operated
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
30 ;; on recently. When enabled a new "Open Recent" sub menu is
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
31 ;; displayed in the "Files" menu. The recent files list is
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
32 ;; automatically saved across Emacs sessions. You can customize the
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
33 ;; number of recent files displayed, the location of the menu and
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
34 ;; others options (see the source code for details).
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
35
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
36 ;;; History:
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
37 ;;
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
38
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
39 ;;; Code:
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
40 (require 'easymenu)
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
41 (require 'tree-widget)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
42 (require 'timer)
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
43
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
44 ;;; Internal data
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
45 ;;
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
46 (defvar recentf-list nil
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
47 "List of recently opened files.")
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
48
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
49 (defsubst recentf-enabled-p ()
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
50 "Return non-nil if recentf mode is currently enabled."
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
51 (memq 'recentf-save-list kill-emacs-hook))
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
52
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
53 ;;; Customization
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
54 ;;
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
55 (defgroup recentf nil
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
56 "Maintain a menu of recently opened files."
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
57 :version "21.1"
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
58 :group 'files)
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
59
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
60 (defgroup recentf-filters nil
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
61 "Group to customize recentf menu filters.
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
62 You should define the options of your own filters in this group."
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
63 :group 'recentf)
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
64
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
65 (defcustom recentf-max-saved-items 20
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
66 "*Maximum number of items of the recent list that will be saved.
64664
3161d6027fd7 (recentf-menu-append-commands-p): Declare with `define-obsolete-variable-alias'.
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
67 A nil value means to save the whole list.
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
68 See the command `recentf-save-list'."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
69 :group 'recentf
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
70 :type 'integer)
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
71
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
72 (defcustom recentf-save-file "~/.recentf"
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
73 "*File to save the recent list into."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
74 :group 'recentf
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
75 :type 'file)
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
76
65525
f68d6281086a (recentf-save-file-modes): New option.
David Ponce <david@dponce.com>
parents: 65368
diff changeset
77 (defcustom recentf-save-file-modes 384 ;; 0600
f68d6281086a (recentf-save-file-modes): New option.
David Ponce <david@dponce.com>
parents: 65368
diff changeset
78 "Mode bits of recentf save file, as an integer, or nil.
f68d6281086a (recentf-save-file-modes): New option.
David Ponce <david@dponce.com>
parents: 65368
diff changeset
79 If non-nil, after writing `recentf-save-file', set its mode bits to
f68d6281086a (recentf-save-file-modes): New option.
David Ponce <david@dponce.com>
parents: 65368
diff changeset
80 this value. By default give R/W access only to the user who owns that
f68d6281086a (recentf-save-file-modes): New option.
David Ponce <david@dponce.com>
parents: 65368
diff changeset
81 file. See also the function `set-file-modes'."
f68d6281086a (recentf-save-file-modes): New option.
David Ponce <david@dponce.com>
parents: 65368
diff changeset
82 :group 'recentf
f68d6281086a (recentf-save-file-modes): New option.
David Ponce <david@dponce.com>
parents: 65368
diff changeset
83 :type '(choice (const :tag "Don't change" nil)
f68d6281086a (recentf-save-file-modes): New option.
David Ponce <david@dponce.com>
parents: 65368
diff changeset
84 integer))
f68d6281086a (recentf-save-file-modes): New option.
David Ponce <david@dponce.com>
parents: 65368
diff changeset
85
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
86 (defcustom recentf-exclude nil
62916
f093607aa05a Whitespace change.
Richard M. Stallman <rms@gnu.org>
parents: 61733
diff changeset
87 "*List of regexps and predicates for filenames excluded from the recent list.
52509
5308684cd360 David Ponce <david@dponce.com>
Glenn Morris <rgm@gnu.org>
parents: 52468
diff changeset
88 When a filename matches any of the regexps or satisfies any of the
5308684cd360 David Ponce <david@dponce.com>
Glenn Morris <rgm@gnu.org>
parents: 52468
diff changeset
89 predicates it is excluded from the recent list.
5308684cd360 David Ponce <david@dponce.com>
Glenn Morris <rgm@gnu.org>
parents: 52468
diff changeset
90 A predicate is a function that is passed a filename to check and that
5308684cd360 David Ponce <david@dponce.com>
Glenn Morris <rgm@gnu.org>
parents: 52468
diff changeset
91 must return non-nil to exclude it."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
92 :group 'recentf
52509
5308684cd360 David Ponce <david@dponce.com>
Glenn Morris <rgm@gnu.org>
parents: 52468
diff changeset
93 :type '(repeat (choice regexp function)))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
94
60844
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
95 (defcustom recentf-keep
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
96 '(file-readable-p)
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
97 "*List of regexps and predicates for filenames kept in the recent list.
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
98 Regexps and predicates are tried in the specified order.
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
99 When nil all filenames are kept in the recent list.
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
100 When a filename matches any of the regexps or satisfies any of the
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
101 predicates it is kept in the recent list.
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
102 The default is to keep readable files.
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
103 A predicate is a function that is passed a filename to check and that
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
104 must return non-nil to keep it. For example, you can add the
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
105 `file-remote-p' predicate in front of this list to keep remote file
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
106 names in the recent list without checking their readability through a
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
107 remote access."
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
108 :group 'recentf
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
109 :type '(repeat (choice regexp function)))
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
110
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
111 (defun recentf-menu-customization-changed (variable value)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
112 "Function called when the recentf menu customization has changed.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
113 Set VARIABLE with VALUE, and force a rebuild of the recentf menu."
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
114 (if (and (featurep 'recentf) (recentf-enabled-p))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
115 (progn
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
116 ;; Unavailable until recentf has been loaded.
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
117 (recentf-hide-menu)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
118 (set-default variable value)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
119 (recentf-show-menu))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
120 (set-default variable value)))
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
121
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
122 (defcustom recentf-menu-title "Open Recent"
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
123 "*Name of the recentf menu."
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
124 :group 'recentf
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
125 :type 'string
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
126 :set 'recentf-menu-customization-changed)
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
127
57993
8e7d8d382255 (recentf-menu-path): Use menu item name.
David Ponce <david@dponce.com>
parents: 57451
diff changeset
128 (defcustom recentf-menu-path '("File")
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
129 "*Path where to add the recentf menu.
52468
de4ce9c67474 Ensure that recentf correctly update the menu bar:
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
130 If nil add it at top level (see also `easy-menu-add-item')."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
131 :group 'recentf
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
132 :type '(choice (const :tag "Top Level" nil)
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
133 (sexp :tag "Menu Path"))
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
134 :set 'recentf-menu-customization-changed)
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
135
44915
ea21866100eb (recentf-menu-before): Use string to specify path in the menu.
Pavel Janík <Pavel@Janik.cz>
parents: 42205
diff changeset
136 (defcustom recentf-menu-before "Open File..."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
137 "*Name of the menu before which the recentf menu will be added.
52468
de4ce9c67474 Ensure that recentf correctly update the menu bar:
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
138 If nil add it at end of menu (see also `easy-menu-add-item')."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
139 :group 'recentf
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
140 :type '(choice (string :tag "Name")
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
141 (const :tag "Last" nil))
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
142 :set 'recentf-menu-customization-changed)
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
143
60844
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
144 (defcustom recentf-menu-action 'find-file
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
145 "*Function to invoke with a filename item of the recentf menu.
60844
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
146 The default is to call `find-file' to edit the selected file."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
147 :group 'recentf
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
148 :type 'function)
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
149
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
150 (defcustom recentf-max-menu-items 10
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
151 "*Maximum number of items in the recentf menu."
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
152 :group 'recentf
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
153 :type 'integer)
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
154
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
155 (defcustom recentf-menu-filter nil
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
156 "*Function used to filter files displayed in the recentf menu.
64664
3161d6027fd7 (recentf-menu-append-commands-p): Declare with `define-obsolete-variable-alias'.
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
157 A nil value means no filter. The following functions are predefined:
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
158
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
159 - `recentf-sort-ascending'
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
160 Sort menu items in ascending order.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
161 - `recentf-sort-descending'
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
162 Sort menu items in descending order.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
163 - `recentf-sort-basenames-ascending'
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
164 Sort menu items by filenames sans directory in ascending order.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
165 - `recentf-sort-basenames-descending'
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
166 Sort menu items by filenames sans directory in descending order.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
167 - `recentf-sort-directories-ascending'
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
168 Sort menu items by directories in ascending order.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
169 - `recentf-sort-directories-descending'
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
170 Sort menu items by directories in descending order.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
171 - `recentf-show-basenames'
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
172 Show filenames sans directory in menu items.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
173 - `recentf-show-basenames-ascending'
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
174 Show filenames sans directory in ascending order.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
175 - `recentf-show-basenames-descending'
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
176 Show filenames sans directory in descending order.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
177 - `recentf-relative-filter'
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
178 Show filenames relative to `default-directory'.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
179 - `recentf-arrange-by-rule'
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
180 Show sub-menus following user defined rules.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
181 - `recentf-arrange-by-mode'
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
182 Show a sub-menu for each major mode.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
183 - `recentf-arrange-by-dir'
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
184 Show a sub-menu for each directory.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
185 - `recentf-filter-changer'
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
186 Manage a menu of filters.
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
187
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
188 The filter function is called with one argument, the list of menu
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
189 elements used to build the menu and must return a new list of menu
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
190 elements (see `recentf-make-menu-element' for menu element form)."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
191 :group 'recentf
49549
99be3a1e2589 Cygwin support patch.
Juanma Barranquero <lekktu@gmail.com>
parents: 44967
diff changeset
192 :type '(radio (const nil)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
193 (function-item recentf-sort-ascending)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
194 (function-item recentf-sort-descending)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
195 (function-item recentf-sort-basenames-ascending)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
196 (function-item recentf-sort-basenames-descending)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
197 (function-item recentf-sort-directories-ascending)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
198 (function-item recentf-sort-directories-descending)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
199 (function-item recentf-show-basenames)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
200 (function-item recentf-show-basenames-ascending)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
201 (function-item recentf-show-basenames-descending)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
202 (function-item recentf-relative-filter)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
203 (function-item recentf-arrange-by-rule)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
204 (function-item recentf-arrange-by-mode)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
205 (function-item recentf-arrange-by-dir)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
206 (function-item recentf-filter-changer)
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
207 function))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
208
65894
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
209 (defcustom recentf-menu-open-all-flag nil
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
210 "*Non-nil means to show an \"All...\" item in the menu.
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
211 This item will replace the \"More...\" item."
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
212 :group 'recentf
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
213 :type 'boolean)
65894
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
214
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
215 (defcustom recentf-menu-append-commands-flag t
64664
3161d6027fd7 (recentf-menu-append-commands-p): Declare with `define-obsolete-variable-alias'.
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
216 "*Non-nil means to append command items to the menu."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
217 :group 'recentf
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
218 :type 'boolean)
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
219
64664
3161d6027fd7 (recentf-menu-append-commands-p): Declare with `define-obsolete-variable-alias'.
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
220 (define-obsolete-variable-alias 'recentf-menu-append-commands-p
3161d6027fd7 (recentf-menu-append-commands-p): Declare with `define-obsolete-variable-alias'.
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
221 'recentf-menu-append-commands-flag
3161d6027fd7 (recentf-menu-append-commands-p): Declare with `define-obsolete-variable-alias'.
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
222 "22.1")
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
223
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
224 (defcustom recentf-auto-cleanup 'mode
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
225 "*Define when to automatically cleanup the recent list.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
226 The following values can be set:
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
227
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
228 - `mode'
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
229 Cleanup when turning the mode on (default).
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
230 - `never'
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
231 Never cleanup the list automatically.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
232 - A number
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
233 Cleanup each time Emacs has been idle that number of seconds.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
234 - A time string
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
235 Cleanup at specified time string, for example at \"11:00pm\".
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
236
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
237 Setting this variable directly does not take effect;
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
238 use \\[customize].
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
239
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
240 See also the command `recentf-cleanup', that can be used to manually
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
241 cleanup the list."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
242 :group 'recentf
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
243 :type '(radio (const :tag "When mode enabled"
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
244 :value mode)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
245 (const :tag "Never"
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
246 :value never)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
247 (number :tag "When idle that seconds"
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
248 :value 300)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
249 (string :tag "At time"
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
250 :value "11:00pm"))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
251 :set (lambda (variable value)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
252 (set-default variable value)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
253 (when (featurep 'recentf)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
254 ;; Unavailable until recentf has been loaded.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
255 (recentf-auto-cleanup))))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
256
52638
2a2c48cb8b59 (recentf-initialize-file-name-history): New defcustom.
Eli Zaretskii <eliz@gnu.org>
parents: 52509
diff changeset
257 (defcustom recentf-initialize-file-name-history t
64664
3161d6027fd7 (recentf-menu-append-commands-p): Declare with `define-obsolete-variable-alias'.
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
258 "*Non-nil means to initialize `file-name-history' with the recent list.
52638
2a2c48cb8b59 (recentf-initialize-file-name-history): New defcustom.
Eli Zaretskii <eliz@gnu.org>
parents: 52509
diff changeset
259 If `file-name-history' is not empty, do nothing."
2a2c48cb8b59 (recentf-initialize-file-name-history): New defcustom.
Eli Zaretskii <eliz@gnu.org>
parents: 52509
diff changeset
260 :group 'recentf
2a2c48cb8b59 (recentf-initialize-file-name-history): New defcustom.
Eli Zaretskii <eliz@gnu.org>
parents: 52509
diff changeset
261 :type 'boolean)
2a2c48cb8b59 (recentf-initialize-file-name-history): New defcustom.
Eli Zaretskii <eliz@gnu.org>
parents: 52509
diff changeset
262
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
263 (defcustom recentf-load-hook nil
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
264 "*Normal hook run at end of loading the `recentf' package."
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
265 :group 'recentf
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
266 :type 'hook)
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
267
65744
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
268 (defcustom recentf-filename-handlers nil
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
269 "Functions to post process recent file names.
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
270 They are successively passed a file name to transform it."
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
271 :group 'recentf
65744
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
272 :type '(choice
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
273 (const :tag "None" nil)
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
274 (repeat :tag "Functions"
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
275 (choice
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
276 (const file-truename)
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
277 (const abbreviate-file-name)
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
278 (function :tag "Other function")))))
65365
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
279
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
280 (defcustom recentf-show-file-shortcuts-flag t
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
281 "Whether to show ``[N]'' for the Nth item up to 10.
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
282 If non-nil, `recentf-open-files' will show labels for keys that can be
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
283 used as shortcuts to open the Nth file."
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
284 :group 'recentf
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
285 :type 'boolean)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
286
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
287 ;;; Utilities
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
288 ;;
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
289 (defconst recentf-case-fold-search
49549
99be3a1e2589 Cygwin support patch.
Juanma Barranquero <lekktu@gmail.com>
parents: 44967
diff changeset
290 (memq system-type '(vax-vms windows-nt cygwin))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
291 "Non-nil if recentf searches and matches should ignore case.")
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
292
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
293 (defsubst recentf-string-equal (s1 s2)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
294 "Return non-nil if strings S1 and S2 have identical contents.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
295 Ignore case if `recentf-case-fold-search' is non-nil."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
296 (if recentf-case-fold-search
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
297 (string-equal (downcase s1) (downcase s2))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
298 (string-equal s1 s2)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
299
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
300 (defsubst recentf-string-lessp (s1 s2)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
301 "Return non-nil if string S1 is less than S2 in lexicographic order.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
302 Ignore case if `recentf-case-fold-search' is non-nil."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
303 (if recentf-case-fold-search
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
304 (string-lessp (downcase s1) (downcase s2))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
305 (string-lessp s1 s2)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
306
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
307 (defun recentf-string-member (elt list)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
308 "Return non-nil if ELT is an element of LIST.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
309 The value is actually the tail of LIST whose car is ELT.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
310 ELT must be a string and LIST a list of strings.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
311 Ignore case if `recentf-case-fold-search' is non-nil."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
312 (while (and list (not (recentf-string-equal elt (car list))))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
313 (setq list (cdr list)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
314 list)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
315
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
316 (defsubst recentf-trunc-list (l n)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
317 "Return from L the list of its first N elements."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
318 (let (nl)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
319 (while (and l (> n 0))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
320 (setq nl (cons (car l) nl)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
321 n (1- n)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
322 l (cdr l)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
323 (nreverse nl)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
324
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
325 (defun recentf-dump-variable (variable &optional limit)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
326 "Insert a \"(setq VARIABLE value)\" in the current buffer.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
327 When the value of VARIABLE is a list, optional argument LIMIT
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
328 specifies a maximum number of elements to insert. By default insert
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
329 the full list."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
330 (let ((value (symbol-value variable)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
331 (if (atom value)
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
332 (insert (format "\n(setq %S '%S)\n" variable value))
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
333 (when (and (integerp limit) (> limit 0))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
334 (setq value (recentf-trunc-list value limit)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
335 (insert (format "\n(setq %S\n '(" variable))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
336 (dolist (e value)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
337 (insert (format "\n %S" e)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
338 (insert "\n ))\n"))))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
339
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
340 (defvar recentf-auto-cleanup-timer nil
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
341 "Timer used to automatically cleanup the recent list.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
342 See also the option `recentf-auto-cleanup'.")
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
343
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
344 (defun recentf-auto-cleanup ()
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
345 "Automatic cleanup of the recent list."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
346 (when (timerp recentf-auto-cleanup-timer)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
347 (cancel-timer recentf-auto-cleanup-timer))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
348 (when recentf-mode
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
349 (setq recentf-auto-cleanup-timer
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
350 (cond
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
351 ((eq 'mode recentf-auto-cleanup)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
352 (recentf-cleanup)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
353 nil)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
354 ((numberp recentf-auto-cleanup)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
355 (run-with-idle-timer
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
356 recentf-auto-cleanup t 'recentf-cleanup))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
357 ((stringp recentf-auto-cleanup)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
358 (run-at-time
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
359 recentf-auto-cleanup nil 'recentf-cleanup))))))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
360
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
361 ;;; File functions
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
362 ;;
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
363 (defsubst recentf-push (filename)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
364 "Push FILENAME into the recent list, if it isn't there yet.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
365 If it is there yet, move it at the beginning of the list.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
366 If `recentf-case-fold-search' is non-nil, ignore case when comparing
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
367 filenames."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
368 (let ((m (recentf-string-member filename recentf-list)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
369 (and m (setq recentf-list (delq (car m) recentf-list)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
370 (push filename recentf-list)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
371
65744
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
372 (defun recentf-apply-filename-handlers (name)
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
373 "Apply `recentf-filename-handlers' to file NAME.
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
374 Return the transformed file name, or NAME if any handler failed, or
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
375 returned nil."
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
376 (or (condition-case nil
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
377 (let ((handlers recentf-filename-handlers)
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
378 (filename name))
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
379 (while (and filename handlers)
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
380 (setq filename (funcall (car handlers) filename)
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
381 handlers (cdr handlers)))
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
382 filename)
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
383 (error nil))
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
384 name))
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
385
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
386 (defsubst recentf-expand-file-name (name)
65744
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
387 "Convert file NAME to absolute, and canonicalize it.
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
388 NAME is first passed to the function `expand-file-name', then to
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
389 `recentf-filename-handlers' to post process it."
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
390 (recentf-apply-filename-handlers (expand-file-name name)))
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
391
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
392 (defun recentf-include-p (filename)
52509
5308684cd360 David Ponce <david@dponce.com>
Glenn Morris <rgm@gnu.org>
parents: 52468
diff changeset
393 "Return non-nil if FILENAME should be included in the recent list.
5308684cd360 David Ponce <david@dponce.com>
Glenn Morris <rgm@gnu.org>
parents: 52468
diff changeset
394 That is, if it doesn't match any of the `recentf-exclude' checks."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
395 (let ((case-fold-search recentf-case-fold-search)
52509
5308684cd360 David Ponce <david@dponce.com>
Glenn Morris <rgm@gnu.org>
parents: 52468
diff changeset
396 (checks recentf-exclude)
60844
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
397 (keepit t))
52509
5308684cd360 David Ponce <david@dponce.com>
Glenn Morris <rgm@gnu.org>
parents: 52468
diff changeset
398 (while (and checks keepit)
60844
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
399 (setq keepit (condition-case nil
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
400 (not (if (stringp (car checks))
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
401 ;; A regexp
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
402 (string-match (car checks) filename)
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
403 ;; A predicate
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
404 (funcall (car checks) filename)))
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
405 (error nil))
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
406 checks (cdr checks)))
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
407 keepit))
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
408
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
409 (defun recentf-keep-p (filename)
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
410 "Return non-nil if FILENAME should be kept in the recent list.
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
411 That is, if it matches any of the `recentf-keep' checks."
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
412 (let* ((case-fold-search recentf-case-fold-search)
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
413 (checks recentf-keep)
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
414 (keepit (null checks)))
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
415 (while (and checks (not keepit))
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
416 (setq keepit (condition-case nil
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
417 (if (stringp (car checks))
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
418 ;; A regexp
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
419 (string-match (car checks) filename)
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
420 ;; A predicate
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
421 (funcall (car checks) filename))
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
422 (error nil))
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
423 checks (cdr checks)))
52509
5308684cd360 David Ponce <david@dponce.com>
Glenn Morris <rgm@gnu.org>
parents: 52468
diff changeset
424 keepit))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
425
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
426 (defsubst recentf-add-file (filename)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
427 "Add or move FILENAME at the beginning of the recent list.
60844
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
428 Does nothing if the name satisfies any of the `recentf-exclude'
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
429 regexps or predicates."
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
430 (setq filename (recentf-expand-file-name filename))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
431 (when (recentf-include-p filename)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
432 (recentf-push filename)))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
433
60844
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
434 (defsubst recentf-remove-if-non-kept (filename)
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
435 "Remove FILENAME from the recent list, if file is not kept.
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
436 Return non-nil if FILENAME has been removed."
60844
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
437 (unless (recentf-keep-p filename)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
438 (let ((m (recentf-string-member
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
439 (recentf-expand-file-name filename) recentf-list)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
440 (and m (setq recentf-list (delq (car m) recentf-list))))))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
441
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
442 (defsubst recentf-directory-compare (f1 f2)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
443 "Compare absolute filenames F1 and F2.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
444 First compare directories, then filenames sans directory.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
445 Return non-nil if F1 is less than F2."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
446 (let ((d1 (file-name-directory f1))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
447 (d2 (file-name-directory f2)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
448 (if (recentf-string-equal d1 d2)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
449 (recentf-string-lessp (file-name-nondirectory f1)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
450 (file-name-nondirectory f2))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
451 (recentf-string-lessp d1 d2))))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
452
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
453 ;;; Menu building
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
454 ;;
65894
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
455 (defsubst recentf-digit-shortcut-command-name (n)
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
456 "Return a command name to open the Nth most recent file.
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
457 See also the command `recentf-open-most-recent-file'."
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
458 (intern (format "recentf-open-most-recent-file-%d" n)))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
459
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
460 (defvar recentf--shortcuts-keymap
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
461 (let ((km (make-sparse-keymap)))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
462 (dolist (k '(0 9 8 7 6 5 4 3 2 1))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
463 (let ((cmd (recentf-digit-shortcut-command-name k)))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
464 ;; Define a shortcut command.
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
465 (defalias cmd
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
466 `(lambda ()
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
467 (interactive)
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
468 (recentf-open-most-recent-file ,k)))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
469 ;; Bind it to a digit key.
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
470 (define-key km (vector (+ k ?0)) cmd)))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
471 km)
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
472 "Digit shortcuts keymap.")
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
473
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
474 (defvar recentf-menu-items-for-commands
65744
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
475 (list
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
476 ["Cleanup list"
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
477 recentf-cleanup
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
478 :help "Remove duplicates, and obsoletes files from the recent list"
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
479 :active t]
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
480 ["Edit list..."
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
481 recentf-edit-list
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
482 :help "Manually remove files from the recent list"
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
483 :active t]
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
484 ["Save list now"
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
485 recentf-save-list
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
486 :help "Save the list of recently opened files now"
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
487 :active t]
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
488 ["Options..."
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
489 (customize-group "recentf")
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
490 :help "Customize recently opened files menu and options"
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
491 :active t]
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
492 )
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
493 "List of menu items for recentf commands.")
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
494
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
495 (defvar recentf-menu-filter-commands nil
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
496 "This variable can be used by menu filters to setup their own command menu.
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
497 If non-nil it must contain a list of valid menu-items to be appended
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
498 to the recent file list part of the menu. Before calling a menu
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
499 filter function this variable is reset to nil.")
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
500
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
501 (defsubst recentf-elements (n)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
502 "Return a list of the first N elements of the recent list."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
503 (recentf-trunc-list recentf-list n))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
504
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
505 (defsubst recentf-make-menu-element (menu-item menu-value)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
506 "Create a new menu-element.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
507 A menu element is a pair (MENU-ITEM . MENU-VALUE), where MENU-ITEM is
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
508 the menu item string displayed. MENU-VALUE is the file to be open
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
509 when the corresponding MENU-ITEM is selected. Or it is a
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
510 pair (SUB-MENU-TITLE . MENU-ELEMENTS) where SUB-MENU-TITLE is a
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
511 sub-menu title and MENU-ELEMENTS is the list of menu elements in the
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
512 sub-menu."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
513 (cons menu-item menu-value))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
514
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
515 (defsubst recentf-menu-element-item (e)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
516 "Return the item part of the menu-element E."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
517 (car e))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
518
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
519 (defsubst recentf-menu-element-value (e)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
520 "Return the value part of the menu-element E."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
521 (cdr e))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
522
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
523 (defsubst recentf-set-menu-element-item (e item)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
524 "Change the item part of menu-element E to ITEM."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
525 (setcar e item))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
526
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
527 (defsubst recentf-set-menu-element-value (e value)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
528 "Change the value part of menu-element E to VALUE."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
529 (setcdr e value))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
530
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
531 (defsubst recentf-sub-menu-element-p (e)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
532 "Return non-nil if menu-element E defines a sub-menu."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
533 (consp (recentf-menu-element-value e)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
534
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
535 (defsubst recentf-make-default-menu-element (file)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
536 "Make a new default menu element with FILE.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
537 This a menu element (FILE . FILE)."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
538 (recentf-make-menu-element file file))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
539
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
540 (defsubst recentf-menu-elements (n)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
541 "Return a list of the first N default menu elements from the recent list.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
542 See also `recentf-make-default-menu-element'."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
543 (mapcar 'recentf-make-default-menu-element
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
544 (recentf-elements n)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
545
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
546 (defun recentf-apply-menu-filter (filter l)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
547 "Apply function FILTER to the list of menu-elements L.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
548 It takes care of sub-menu elements in L and recursively apply FILTER
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
549 to them. It is guaranteed that FILTER receives only a list of single
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
550 menu-elements (no sub-menu)."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
551 (if (and l (functionp filter))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
552 (let ((case-fold-search recentf-case-fold-search)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
553 elts others)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
554 ;; split L into two sub-listes, one of sub-menus elements and
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
555 ;; another of single menu elements.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
556 (dolist (elt l)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
557 (if (recentf-sub-menu-element-p elt)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
558 (push elt elts)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
559 (push elt others)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
560 ;; Apply FILTER to single elements.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
561 (when others
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
562 (setq others (funcall filter (nreverse others))))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
563 ;; Apply FILTER to sub-menu elements.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
564 (setq l nil)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
565 (dolist (elt elts)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
566 (recentf-set-menu-element-value
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
567 elt (recentf-apply-menu-filter
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
568 filter (recentf-menu-element-value elt)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
569 (push elt l))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
570 ;; Return the new filtered menu element list.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
571 (nconc l others))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
572 l))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
573
65894
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
574 ;; Count the number of assigned menu shortcuts.
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
575 (defvar recentf-menu-shortcuts)
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
576
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
577 (defun recentf-make-menu-items (&optional menu)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
578 "Make menu items from the recent list.
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
579 This is a menu filter function which ignores the MENU argument."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
580 (setq recentf-menu-filter-commands nil)
65894
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
581 (let* ((recentf-menu-shortcuts 0)
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
582 (file-items
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
583 (condition-case err
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
584 (mapcar 'recentf-make-menu-item
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
585 (recentf-apply-menu-filter
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
586 recentf-menu-filter
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
587 (recentf-menu-elements recentf-max-menu-items)))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
588 (error
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
589 (message "recentf update menu failed: %s"
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
590 (error-message-string err))))))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
591 (append
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
592 (or file-items
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
593 '(["No files" t
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
594 :help "No recent file to open"
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
595 :active nil]))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
596 (if recentf-menu-open-all-flag
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
597 '(["All..." recentf-open-files
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
598 :help "Open recent files through a dialog"
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
599 :active t])
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
600 (and (< recentf-max-menu-items (length recentf-list))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
601 '(["More..." recentf-open-more-files
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
602 :help "Open files not in the menu through a dialog"
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
603 :active t])))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
604 (and recentf-menu-filter-commands '("---"))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
605 recentf-menu-filter-commands
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
606 (and recentf-menu-items-for-commands '("---"))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
607 recentf-menu-items-for-commands)))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
608
65894
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
609 (defun recentf-menu-value-shortcut (name)
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
610 "Return a shortcut digit for file NAME.
65894
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
611 Return nil if file NAME is not one of the ten more recent."
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
612 (let ((i 0) k)
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
613 (while (and (not k) (< i 10))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
614 (if (string-equal name (nth i recentf-list))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
615 (progn
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
616 (setq recentf-menu-shortcuts (1+ recentf-menu-shortcuts))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
617 (setq k (% (1+ i) 10)))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
618 (setq i (1+ i))))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
619 k))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
620
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
621 (defun recentf-make-menu-item (elt)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
622 "Make a menu item from menu element ELT."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
623 (let ((item (recentf-menu-element-item elt))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
624 (value (recentf-menu-element-value elt)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
625 (if (recentf-sub-menu-element-p elt)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
626 (cons item (mapcar 'recentf-make-menu-item value))
65894
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
627 (let ((k (and (< recentf-menu-shortcuts 10)
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
628 (recentf-menu-value-shortcut value))))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
629 (vector item
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
630 ;; If the file name is one of the ten more recent, use
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
631 ;; a digit shortcut command to open it, else use an
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
632 ;; anonymous command.
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
633 (if k
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
634 (recentf-digit-shortcut-command-name k)
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
635 `(lambda ()
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
636 (interactive)
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
637 (,recentf-menu-action ,value)))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
638 :help (concat "Open " value)
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
639 :active t)))))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
640
52468
de4ce9c67474 Ensure that recentf correctly update the menu bar:
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
641 (defsubst recentf-menu-bar ()
de4ce9c67474 Ensure that recentf correctly update the menu bar:
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
642 "Return the keymap of the global menu bar."
de4ce9c67474 Ensure that recentf correctly update the menu bar:
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
643 (lookup-key global-map [menu-bar]))
de4ce9c67474 Ensure that recentf correctly update the menu bar:
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
644
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
645 (defun recentf-show-menu ()
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
646 "Show the menu of recently opened files."
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
647 (easy-menu-add-item
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
648 (recentf-menu-bar) recentf-menu-path
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
649 (list recentf-menu-title :filter 'recentf-make-menu-items)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
650 recentf-menu-before))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
651
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
652 (defun recentf-hide-menu ()
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
653 "Hide the menu of recently opened files."
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
654 (easy-menu-remove-item (recentf-menu-bar) recentf-menu-path
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
655 recentf-menu-title))
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
656
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
657 ;;; Predefined menu filters
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
658 ;;
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
659 (defsubst recentf-sort-ascending (l)
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
660 "Sort the list of menu elements L in ascending order.
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
661 The MENU-ITEM part of each menu element is compared."
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
662 (sort (copy-sequence l)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
663 #'(lambda (e1 e2)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
664 (recentf-string-lessp
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
665 (recentf-menu-element-item e1)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
666 (recentf-menu-element-item e2)))))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
667
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
668 (defsubst recentf-sort-descending (l)
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
669 "Sort the list of menu elements L in descending order.
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
670 The MENU-ITEM part of each menu element is compared."
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
671 (sort (copy-sequence l)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
672 #'(lambda (e1 e2)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
673 (recentf-string-lessp
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
674 (recentf-menu-element-item e2)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
675 (recentf-menu-element-item e1)))))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
676
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
677 (defsubst recentf-sort-basenames-ascending (l)
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
678 "Sort the list of menu elements L in ascending order.
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
679 Only filenames sans directory are compared."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
680 (sort (copy-sequence l)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
681 #'(lambda (e1 e2)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
682 (recentf-string-lessp
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
683 (file-name-nondirectory (recentf-menu-element-value e1))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
684 (file-name-nondirectory (recentf-menu-element-value e2))))))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
685
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
686 (defsubst recentf-sort-basenames-descending (l)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
687 "Sort the list of menu elements L in descending order.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
688 Only filenames sans directory are compared."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
689 (sort (copy-sequence l)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
690 #'(lambda (e1 e2)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
691 (recentf-string-lessp
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
692 (file-name-nondirectory (recentf-menu-element-value e2))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
693 (file-name-nondirectory (recentf-menu-element-value e1))))))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
694
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
695 (defsubst recentf-sort-directories-ascending (l)
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
696 "Sort the list of menu elements L in ascending order.
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
697 Compares directories then filenames to order the list."
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
698 (sort (copy-sequence l)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
699 #'(lambda (e1 e2)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
700 (recentf-directory-compare
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
701 (recentf-menu-element-value e1)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
702 (recentf-menu-element-value e2)))))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
703
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
704 (defsubst recentf-sort-directories-descending (l)
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
705 "Sort the list of menu elements L in descending order.
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
706 Compares directories then filenames to order the list."
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
707 (sort (copy-sequence l)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
708 #'(lambda (e1 e2)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
709 (recentf-directory-compare
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
710 (recentf-menu-element-value e2)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
711 (recentf-menu-element-value e1)))))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
712
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
713 (defun recentf-show-basenames (l &optional no-dir)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
714 "Filter the list of menu elements L to show filenames sans directory.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
715 When a filename is duplicated, it is appended a sequence number if
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
716 optional argument NO-DIR is non-nil, or its directory otherwise."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
717 (let (filtered-names filtered-list full name counters sufx)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
718 (dolist (elt l (nreverse filtered-list))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
719 (setq full (recentf-menu-element-value elt)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
720 name (file-name-nondirectory full))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
721 (if (not (member name filtered-names))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
722 (push name filtered-names)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
723 (if no-dir
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
724 (if (setq sufx (assoc name counters))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
725 (setcdr sufx (1+ (cdr sufx)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
726 (setq sufx 1)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
727 (push (cons name sufx) counters))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
728 (setq sufx (file-name-directory full)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
729 (setq name (format "%s(%s)" name sufx)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
730 (push (recentf-make-menu-element name full) filtered-list))))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
731
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
732 (defsubst recentf-show-basenames-ascending (l)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
733 "Filter the list of menu elements L to show filenames sans directory.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
734 Filenames are sorted in ascending order.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
735 This filter combines the `recentf-sort-basenames-ascending' and
32292
11bee5bae414 Doc fixes.
Dave Love <fx@gnu.org>
parents: 30778
diff changeset
736 `recentf-show-basenames' filters."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
737 (recentf-show-basenames (recentf-sort-basenames-ascending l)))
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
738
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
739 (defsubst recentf-show-basenames-descending (l)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
740 "Filter the list of menu elements L to show filenames sans directory.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
741 Filenames are sorted in descending order.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
742 This filter combines the `recentf-sort-basenames-descending' and
32292
11bee5bae414 Doc fixes.
Dave Love <fx@gnu.org>
parents: 30778
diff changeset
743 `recentf-show-basenames' filters."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
744 (recentf-show-basenames (recentf-sort-basenames-descending l)))
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
745
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
746 (defun recentf-relative-filter (l)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
747 "Filter the list of menu-elements L to show relative filenames.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
748 Filenames are relative to the `default-directory'."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
749 (mapcar #'(lambda (menu-element)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
750 (let* ((ful (recentf-menu-element-value menu-element))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
751 (rel (file-relative-name ful default-directory)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
752 (if (string-match "^\\.\\." rel)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
753 menu-element
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
754 (recentf-make-menu-element rel ful))))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
755 l))
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
756
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
757 ;;; Rule based menu filters
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
758 ;;
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
759 (defcustom recentf-arrange-rules
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
760 '(
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
761 ("Elisp files (%d)" ".\\.el\\'")
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
762 ("Java files (%d)" ".\\.java\\'")
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
763 ("C/C++ files (%d)" "c\\(pp\\)?\\'")
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
764 )
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
765 "*List of rules used by `recentf-arrange-by-rule' to build sub-menus.
32292
11bee5bae414 Doc fixes.
Dave Love <fx@gnu.org>
parents: 30778
diff changeset
766 A rule is a pair (SUB-MENU-TITLE . MATCHER). SUB-MENU-TITLE is the
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
767 displayed title of the sub-menu where a '%d' `format' pattern is
32292
11bee5bae414 Doc fixes.
Dave Love <fx@gnu.org>
parents: 30778
diff changeset
768 replaced by the number of items in the sub-menu. MATCHER is a regexp
11bee5bae414 Doc fixes.
Dave Love <fx@gnu.org>
parents: 30778
diff changeset
769 or a list of regexps. Items matching one of the regular expressions in
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
770 MATCHER are added to the corresponding sub-menu.
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
771 SUB-MENU-TITLE can be a function. It is passed every items that
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
772 matched the corresponding MATCHER, and it must return a
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
773 pair (SUB-MENU-TITLE . ITEM). SUB-MENU-TITLE is a computed sub-menu
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
774 title that can be another function. ITEM is the received item which
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
775 may have been modified to match another rule."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
776 :group 'recentf-filters
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
777 :type '(repeat (cons (choice string function)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
778 (repeat regexp))))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
779
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
780 (defcustom recentf-arrange-by-rule-others "Other files (%d)"
32292
11bee5bae414 Doc fixes.
Dave Love <fx@gnu.org>
parents: 30778
diff changeset
781 "*Title of the `recentf-arrange-by-rule' sub-menu.
11bee5bae414 Doc fixes.
Dave Love <fx@gnu.org>
parents: 30778
diff changeset
782 This is for the menu where items that don't match any
11bee5bae414 Doc fixes.
Dave Love <fx@gnu.org>
parents: 30778
diff changeset
783 `recentf-arrange-rules' are displayed. If nil these items are
11bee5bae414 Doc fixes.
Dave Love <fx@gnu.org>
parents: 30778
diff changeset
784 displayed in the main recent files menu. A '%d' `format' pattern in
11bee5bae414 Doc fixes.
Dave Love <fx@gnu.org>
parents: 30778
diff changeset
785 the title is replaced by the number of items in the sub-menu."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
786 :group 'recentf-filters
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
787 :type '(choice (const :tag "Main menu" nil)
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
788 (string :tag "Title")))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
789
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
790 (defcustom recentf-arrange-by-rules-min-items 0
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
791 "*Minimum number of items in a `recentf-arrange-by-rule' sub-menu.
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
792 If the number of items in a sub-menu is less than this value the
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
793 corresponding sub-menu items are displayed in the main recent files
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
794 menu or in the `recentf-arrange-by-rule-others' sub-menu if
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
795 defined."
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
796 :group 'recentf-filters
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
797 :type 'number)
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
798
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
799 (defcustom recentf-arrange-by-rule-subfilter nil
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
800 "*Function called by a rule based filter to filter sub-menu elements.
64664
3161d6027fd7 (recentf-menu-append-commands-p): Declare with `define-obsolete-variable-alias'.
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
801 A nil value means no filter. See also `recentf-menu-filter'.
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
802 You can't use another rule based filter here."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
803 :group 'recentf-filters
35971
6dd6fce1542a (recentf-menu-filter): Fix :type.
Dave Love <fx@gnu.org>
parents: 33770
diff changeset
804 :type '(choice (const nil) function)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
805 :set (lambda (variable value)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
806 (when (memq value '(recentf-arrange-by-rule
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
807 recentf-arrange-by-mode
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
808 recentf-arrange-by-dir))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
809 (error "Recursive use of a rule based filter"))
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
810 (set-default variable value)))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
811
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
812 (defun recentf-match-rule (file)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
813 "Return the rule that match FILE."
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
814 (let ((rules recentf-arrange-rules)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
815 match found)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
816 (while (and (not found) rules)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
817 (setq match (cdar rules))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
818 (when (stringp match)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
819 (setq match (list match)))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
820 (while (and match (not (string-match (car match) file)))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
821 (setq match (cdr match)))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
822 (if match
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
823 (setq found (cons (caar rules) file))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
824 (setq rules (cdr rules))))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
825 found))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
826
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
827 (defun recentf-arrange-by-rule (l)
32292
11bee5bae414 Doc fixes.
Dave Love <fx@gnu.org>
parents: 30778
diff changeset
828 "Filter the list of menu-elements L.
11bee5bae414 Doc fixes.
Dave Love <fx@gnu.org>
parents: 30778
diff changeset
829 Arrange them in sub-menus following rules in `recentf-arrange-rules'."
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
830 (when recentf-arrange-rules
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
831 (let (menus others menu file min count)
67119
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
832 ;; Put menu items into sub-menus as defined by rules.
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
833 (dolist (elt l)
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
834 (setq file (recentf-menu-element-value elt)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
835 menu (recentf-match-rule file))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
836 (while (functionp (car menu))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
837 (setq menu (funcall (car menu) (cdr menu))))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
838 (if (not (stringp (car menu)))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
839 (push elt others)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
840 (setq menu (or (assoc (car menu) menus)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
841 (car (push (list (car menu)) menus))))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
842 (recentf-set-menu-element-value
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
843 menu (cons elt (recentf-menu-element-value menu)))))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
844 ;; Finalize each sub-menu:
67119
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
845 ;; - truncate it depending on the value of
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
846 ;; `recentf-arrange-by-rules-min-items',
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
847 ;; - replace %d by the number of menu items,
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
848 ;; - apply `recentf-arrange-by-rule-subfilter' to menu items.
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
849 (setq min (if (natnump recentf-arrange-by-rules-min-items)
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
850 recentf-arrange-by-rules-min-items 0)
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
851 l nil)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
852 (dolist (elt menus)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
853 (setq menu (recentf-menu-element-value elt)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
854 count (length menu))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
855 (if (< count min)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
856 (setq others (nconc menu others))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
857 (recentf-set-menu-element-item
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
858 elt (format (recentf-menu-element-item elt) count))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
859 (recentf-set-menu-element-value
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
860 elt (recentf-apply-menu-filter
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
861 recentf-arrange-by-rule-subfilter (nreverse menu)))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
862 (push elt l)))
67119
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
863 ;; Add the menu items remaining in the `others' bin.
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
864 (when (setq others (nreverse others))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
865 (setq l (nconc
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
866 l
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
867 ;; Put items in an sub menu.
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
868 (if (stringp recentf-arrange-by-rule-others)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
869 (list
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
870 (recentf-make-menu-element
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
871 (format recentf-arrange-by-rule-others
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
872 (length others))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
873 (recentf-apply-menu-filter
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
874 recentf-arrange-by-rule-subfilter others)))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
875 ;; Append items to the main menu.
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
876 (recentf-apply-menu-filter
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
877 recentf-arrange-by-rule-subfilter others)))))))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
878 l)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
879
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
880 ;;; Predefined rule based menu filters
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
881 ;;
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
882 (defun recentf-indirect-mode-rule (file)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
883 "Apply a second level `auto-mode-alist' regexp to FILE."
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
884 (recentf-match-rule (substring file 0 (match-beginning 0))))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
885
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
886 (defun recentf-build-mode-rules ()
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
887 "Convert `auto-mode-alist' to menu filter rules.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
888 Rules obey `recentf-arrange-rules' format."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
889 (let ((case-fold-search recentf-case-fold-search)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
890 regexp rule-name rule rules)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
891 (dolist (mode auto-mode-alist)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
892 (setq regexp (car mode)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
893 mode (cdr mode))
67119
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
894 (when mode
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
895 (cond
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
896 ;; Build a special "strip suffix" rule from entries of the
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
897 ;; form (REGEXP FUNCTION NON-NIL). Notice that FUNCTION is
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
898 ;; ignored by the menu filter. So in some corner cases a
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
899 ;; wrong mode could be guessed.
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
900 ((and (consp mode) (cadr mode))
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
901 (setq rule-name 'recentf-indirect-mode-rule))
67119
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
902 ((and mode (symbolp mode))
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
903 (setq rule-name (symbol-name mode))
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
904 (if (string-match "\\(.*\\)-mode$" rule-name)
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
905 (setq rule-name (match-string 1 rule-name)))
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
906 (setq rule-name (concat rule-name " (%d)"))))
c4aae786a4e4 (recentf-arrange-by-rule): Handle a special `auto-mode-alist'-like
David Ponce <david@dponce.com>
parents: 66083
diff changeset
907 (setq rule (assoc rule-name rules))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
908 (if rule
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
909 (setcdr rule (cons regexp (cdr rule)))
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
910 (push (list rule-name regexp) rules))))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
911 ;; It is important to preserve auto-mode-alist order
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
912 ;; to ensure the right file <-> mode association
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
913 (nreverse rules)))
49549
99be3a1e2589 Cygwin support patch.
Juanma Barranquero <lekktu@gmail.com>
parents: 44967
diff changeset
914
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
915 (defun recentf-arrange-by-mode (l)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
916 "Split the list of menu-elements L into sub-menus by major mode."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
917 (let ((recentf-arrange-rules (recentf-build-mode-rules))
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
918 (recentf-arrange-by-rule-others "others (%d)"))
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
919 (recentf-arrange-by-rule l)))
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
920
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
921 (defun recentf-file-name-nondir (l)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
922 "Filter the list of menu-elements L to show filenames sans directory.
32292
11bee5bae414 Doc fixes.
Dave Love <fx@gnu.org>
parents: 30778
diff changeset
923 This simplified version of `recentf-show-basenames' does not handle
11bee5bae414 Doc fixes.
Dave Love <fx@gnu.org>
parents: 30778
diff changeset
924 duplicates. It is used by `recentf-arrange-by-dir' as its
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
925 `recentf-arrange-by-rule-subfilter'."
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
926 (mapcar #'(lambda (e)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
927 (recentf-make-menu-element
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
928 (file-name-nondirectory (recentf-menu-element-value e))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
929 (recentf-menu-element-value e)))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
930 l))
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
931
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
932 (defun recentf-dir-rule (file)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
933 "Return as a sub-menu, the directory FILE belongs to."
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
934 (cons (file-name-directory file) file))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
935
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
936 (defun recentf-arrange-by-dir (l)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
937 "Split the list of menu-elements L into sub-menus by directory."
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
938 (let ((recentf-arrange-rules '((recentf-dir-rule . ".*")))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
939 (recentf-arrange-by-rule-subfilter 'recentf-file-name-nondir)
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
940 recentf-arrange-by-rule-others)
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
941 (recentf-arrange-by-rule l)))
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
942
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
943 ;;; Menu of menu filters
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
944 ;;
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
945 (defvar recentf-filter-changer-current nil
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
946 "Current filter used by `recentf-filter-changer'.")
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
947
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
948 (defcustom recentf-filter-changer-alist
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
949 '(
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
950 (recentf-arrange-by-mode . "Grouped by Mode")
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
951 (recentf-arrange-by-dir . "Grouped by Directory")
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
952 (recentf-arrange-by-rule . "Grouped by Custom Rules")
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
953 )
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
954 "*List of filters managed by `recentf-filter-changer'.
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
955 Each filter is defined by a pair (FUNCTION . LABEL), where FUNCTION is
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
956 the filter function, and LABEL is the menu item displayed to select
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
957 that filter."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
958 :group 'recentf-filters
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
959 :type '(repeat (cons function string))
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
960 :set (lambda (variable value)
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
961 (setq recentf-filter-changer-current nil)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
962 (set-default variable value)))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
963
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
964 (defun recentf-filter-changer-select (filter)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
965 "Select FILTER as the current menu filter.
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
966 See `recentf-filter-changer'."
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
967 (setq recentf-filter-changer-current filter))
49549
99be3a1e2589 Cygwin support patch.
Juanma Barranquero <lekktu@gmail.com>
parents: 44967
diff changeset
968
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
969 (defun recentf-filter-changer (l)
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
970 "Manage a sub-menu of menu filters.
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
971 `recentf-filter-changer-alist' defines the filters in the menu.
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
972 Filtering of L is delegated to the selected filter in the menu."
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
973 (unless recentf-filter-changer-current
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
974 (setq recentf-filter-changer-current
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
975 (caar recentf-filter-changer-alist)))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
976 (if (not recentf-filter-changer-current)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
977 l
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
978 (setq recentf-menu-filter-commands
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
979 (list
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
980 `("Show files"
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
981 ,@(mapcar
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
982 #'(lambda (f)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
983 `[,(cdr f)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
984 (setq recentf-filter-changer-current ',(car f))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
985 ;;:active t
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
986 :style radio ;;radio Don't work with GTK :-(
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
987 :selected (eq recentf-filter-changer-current
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
988 ',(car f))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
989 ;;:help ,(cdr f)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
990 ])
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
991 recentf-filter-changer-alist))))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
992 (recentf-apply-menu-filter recentf-filter-changer-current l)))
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
993
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
994 ;;; Hooks
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
995 ;;
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
996 (defun recentf-track-opened-file ()
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
997 "Insert the name of the file just opened or written into the recent list."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
998 (and buffer-file-name
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
999 (recentf-add-file buffer-file-name))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1000 ;; Must return nil because it is run from `write-file-functions'.
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1001 nil)
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1002
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1003 (defun recentf-track-closed-file ()
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1004 "Update the recent list when a buffer is killed.
60844
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
1005 That is, remove a non kept file from the recent list."
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1006 (and buffer-file-name
60844
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
1007 (recentf-remove-if-non-kept buffer-file-name)))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1008
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1009 (defconst recentf-used-hooks
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1010 '(
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1011 (find-file-hook recentf-track-opened-file)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1012 (write-file-functions recentf-track-opened-file)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1013 (kill-buffer-hook recentf-track-closed-file)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1014 (kill-emacs-hook recentf-save-list)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1015 )
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1016 "Hooks used by recentf.")
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1017
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1018 ;;; Commands
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1019 ;;
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1020
66083
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1021 ;;; Common dialog stuff
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1022 ;;
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1023 (defun recentf-cancel-dialog (&rest ignore)
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1024 "Cancel the current dialog.
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1025 IGNORE arguments."
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1026 (interactive)
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1027 (kill-buffer (current-buffer))
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1028 (message "Dialog canceled"))
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1029
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1030 (defun recentf-dialog-goto-first (widget-type)
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1031 "Move the cursor to the first WIDGET-TYPE in current dialog.
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1032 Go to the beginning of buffer if not found."
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1033 (goto-char (point-min))
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1034 (condition-case nil
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1035 (let (done)
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1036 (widget-move 1)
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1037 (while (not done)
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1038 (if (eq widget-type (widget-type (widget-at (point))))
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1039 (setq done t)
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1040 (widget-move 1))))
67589
afb90762aa99 (recentf-dialog-goto-first): Fix missing error condition.
David Ponce <david@dponce.com>
parents: 67417
diff changeset
1041 (error
afb90762aa99 (recentf-dialog-goto-first): Fix missing error condition.
David Ponce <david@dponce.com>
parents: 67417
diff changeset
1042 (goto-char (point-min)))))
66083
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1043
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1044 (defvar recentf-dialog-mode-map
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1045 (let ((km (copy-keymap recentf--shortcuts-keymap)))
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1046 (set-keymap-parent km widget-keymap)
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1047 (define-key km "q" 'recentf-cancel-dialog)
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1048 (define-key km [follow-link] "\C-m")
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1049 km)
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1050 "Keymap used in recentf dialogs.")
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1051
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1052 (define-derived-mode recentf-dialog-mode nil "recentf-dialog"
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1053 "Major mode of recentf dialogs.
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1054
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1055 \\{recentf-dialog-mode-map}"
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1056 :syntax-table nil
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1057 :abbrev-table nil
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1058 (setq truncate-lines t))
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1059
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1060 (defmacro recentf-dialog (name &rest forms)
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1061 "Show a dialog buffer with NAME, setup with FORMS."
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1062 (declare (indent 1) (debug t))
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1063 `(with-current-buffer (get-buffer-create ,name)
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1064 ;; Cleanup buffer
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1065 (let ((inhibit-read-only t)
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1066 (ol (overlay-lists)))
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1067 (mapc 'delete-overlay (car ol))
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1068 (mapc 'delete-overlay (cdr ol))
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1069 (erase-buffer))
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1070 (recentf-dialog-mode)
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1071 ,@forms
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1072 (widget-setup)
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1073 (switch-to-buffer (current-buffer))))
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1074
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1075 ;;; Edit list dialog
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1076 ;;
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1077 (defvar recentf-edit-list nil)
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1078
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1079 (defun recentf-edit-list-select (widget &rest ignore)
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1080 "Toggle a file selection based on the checkbox WIDGET state.
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1081 IGNORE other arguments."
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1082 (let ((value (widget-get widget :tag))
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1083 (check (widget-value widget)))
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1084 (if check
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1085 (add-to-list 'recentf-edit-list value)
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1086 (setq recentf-edit-list (delq value recentf-edit-list)))
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1087 (message "%s %sselected" value (if check "" "un"))))
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1088
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1089 (defun recentf-edit-list-validate (&rest ignore)
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1090 "Process the recent list when the edit list dialog is committed.
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1091 IGNORE arguments."
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1092 (if recentf-edit-list
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1093 (let ((i 0))
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1094 (dolist (e recentf-edit-list)
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1095 (setq recentf-list (delq e recentf-list)
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1096 i (1+ i)))
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1097 (kill-buffer (current-buffer))
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
1098 (message "%S file(s) removed from the list" i))
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1099 (message "No file selected")))
49549
99be3a1e2589 Cygwin support patch.
Juanma Barranquero <lekktu@gmail.com>
parents: 44967
diff changeset
1100
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1101 (defun recentf-edit-list ()
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1102 "Show a dialog to delete selected files from the recent list."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1103 (interactive)
67589
afb90762aa99 (recentf-dialog-goto-first): Fix missing error condition.
David Ponce <david@dponce.com>
parents: 67417
diff changeset
1104 (unless recentf-list
afb90762aa99 (recentf-dialog-goto-first): Fix missing error condition.
David Ponce <david@dponce.com>
parents: 67417
diff changeset
1105 (error "The list of recent files is empty"))
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1106 (recentf-dialog (format "*%s - Edit list*" recentf-menu-title)
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1107 (set (make-local-variable 'recentf-edit-list) nil)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1108 (widget-insert
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1109 "Click on OK to delete selected files from the recent list.
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1110 Click on Cancel or type `q' to cancel.\n")
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1111 ;; Insert the list of files as checkboxes
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1112 (dolist (item recentf-list)
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1113 (widget-create 'checkbox
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1114 :value nil ; unselected checkbox
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1115 :format "\n %[%v%] %t"
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1116 :tag item
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1117 :notify 'recentf-edit-list-select))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1118 (widget-insert "\n\n")
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1119 (widget-create
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1120 'push-button
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1121 :notify 'recentf-edit-list-validate
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1122 :help-echo "Delete selected files from the recent list"
65894
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1123 "Ok")
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1124 (widget-insert " ")
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1125 (widget-create
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1126 'push-button
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1127 :notify 'recentf-cancel-dialog
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1128 "Cancel")
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1129 (recentf-dialog-goto-first 'checkbox)))
66083
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1130
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1131 ;;; Open file dialog
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1132 ;;
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1133 (defun recentf-open-files-action (widget &rest ignore)
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1134 "Open the file stored in WIDGET's value when notified.
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1135 IGNORE other arguments."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1136 (kill-buffer (current-buffer))
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1137 (funcall recentf-menu-action (widget-value widget)))
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1138
65365
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1139 ;; List of files associated to a digit shortcut key.
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1140 (defvar recentf--files-with-key nil)
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1141
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1142 (defun recentf-show-digit-shortcut-filter (l)
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1143 "Filter the list of menu-elements L to show digit shortcuts."
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1144 (let ((i 0))
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1145 (dolist (e l)
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1146 (setq i (1+ i))
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1147 (recentf-set-menu-element-item
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1148 e (format "[%d] %s" (% i 10) (recentf-menu-element-item e))))
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1149 l))
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1150
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1151 (defun recentf-open-files-item (menu-element)
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1152 "Return a widget to display MENU-ELEMENT in a dialog buffer."
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1153 (if (consp (cdr menu-element))
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1154 ;; Represent a sub-menu with a tree widget
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1155 `(tree-widget
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1156 :open t
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1157 :match ignore
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1158 :node (item :tag ,(car menu-element)
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1159 :sample-face bold
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1160 :format "%{%t%}:\n")
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1161 ,@(mapcar 'recentf-open-files-item
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1162 (cdr menu-element)))
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1163 ;; Represent a single file with a link widget
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1164 `(link :tag ,(car menu-element)
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1165 :button-prefix ""
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1166 :button-suffix ""
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1167 :button-face default
69778
6828bafcac8e (recentf-open-files-item): Include newline in button
David Ponce <david@dponce.com>
parents: 68651
diff changeset
1168 :format "%[%t\n%]"
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1169 :help-echo ,(concat "Open " (cdr menu-element))
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1170 :action recentf-open-files-action
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1171 ,(cdr menu-element))))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1172
65365
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1173 (defun recentf-open-files-items (files)
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1174 "Return a list of widgets to display FILES in a dialog buffer."
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1175 (set (make-local-variable 'recentf--files-with-key)
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1176 (recentf-trunc-list files 10))
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1177 (mapcar 'recentf-open-files-item
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1178 (append
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1179 ;; When requested group the files with shortcuts together
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1180 ;; at the top of the list.
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1181 (when recentf-show-file-shortcuts-flag
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1182 (setq files (nthcdr 10 files))
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1183 (recentf-apply-menu-filter
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1184 'recentf-show-digit-shortcut-filter
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1185 (mapcar 'recentf-make-default-menu-element
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1186 recentf--files-with-key)))
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1187 ;; Then the other files.
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1188 (recentf-apply-menu-filter
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1189 recentf-menu-filter
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1190 (mapcar 'recentf-make-default-menu-element
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1191 files)))))
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1192
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1193 (defun recentf-open-files (&optional files buffer-name)
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1194 "Show a dialog to open a recent file.
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1195 If optional argument FILES is non-nil, it is a list of recently-opened
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1196 files to choose from. It defaults to the whole recent list.
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1197 If optional argument BUFFER-NAME is non-nil, it is a buffer name to
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1198 use for the dialog. It defaults to \"*`recentf-menu-title'*\"."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1199 (interactive)
67589
afb90762aa99 (recentf-dialog-goto-first): Fix missing error condition.
David Ponce <david@dponce.com>
parents: 67417
diff changeset
1200 (unless (or files recentf-list)
afb90762aa99 (recentf-dialog-goto-first): Fix missing error condition.
David Ponce <david@dponce.com>
parents: 67417
diff changeset
1201 (error "There is no recent file to open"))
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1202 (recentf-dialog (or buffer-name (format "*%s*" recentf-menu-title))
65365
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1203 (widget-insert "Click on a file"
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1204 (if recentf-show-file-shortcuts-flag
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1205 ", or type the corresponding digit key,"
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1206 "")
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1207 " to open it.\n"
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1208 "Click on Cancel or type `q' to cancel.\n")
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1209 ;; Use a L&F that looks like the recentf menu.
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1210 (tree-widget-set-theme "folder")
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1211 (apply 'widget-create
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1212 `(group
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1213 :indent 2
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1214 :format "\n%v\n"
65365
83aa6efe327f (recentf-show-file-shortcuts-flag): New option.
David Ponce <david@dponce.com>
parents: 64762
diff changeset
1215 ,@(recentf-open-files-items (or files recentf-list))))
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1216 (widget-create
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1217 'push-button
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1218 :notify 'recentf-cancel-dialog
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1219 "Cancel")
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1220 (recentf-dialog-goto-first 'link)))
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1221
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1222 (defun recentf-open-more-files ()
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1223 "Show a dialog to open a recent file that is not in the menu."
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1224 (interactive)
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1225 (recentf-open-files (nthcdr recentf-max-menu-items recentf-list)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1226 (format "*%s - More*" recentf-menu-title)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1227
65894
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1228 (defun recentf-open-most-recent-file (&optional n)
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1229 "Open the Nth most recent file.
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1230 Optional argument N must be a valid digit number. It defaults to 1.
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1231 1 opens the most recent file, 2 the second most recent one, etc..
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1232 0 opens the tenth most recent file."
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1233 (interactive "p")
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1234 (cond
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1235 ((zerop n) (setq n 10))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1236 ((and (> n 0) (< n 10)))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1237 ((error "Recent file number out of range [0-9], %d" n)))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1238 (let ((file (nth (1- n) (or recentf--files-with-key recentf-list))))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1239 (unless file (error "Not that many recent files"))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1240 ;; Close the open files dialog.
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1241 (when recentf--files-with-key
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1242 (kill-buffer (current-buffer)))
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1243 (funcall recentf-menu-action file)))
66083
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1244
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1245 ;;; Save/load/cleanup the recent list
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1246 ;;
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1247 (defconst recentf-save-file-header
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1248 ";;; Automatically generated by `recentf' on %s.\n"
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1249 "Header to be written into the `recentf-save-file'.")
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1250
61733
34f8bb98e444 (recentf-save-file-coding-system): New variable.
Kenichi Handa <handa@m17n.org>
parents: 60844
diff changeset
1251 (defconst recentf-save-file-coding-system
34f8bb98e444 (recentf-save-file-coding-system): New variable.
Kenichi Handa <handa@m17n.org>
parents: 60844
diff changeset
1252 (if (coding-system-p 'utf-8-emacs)
34f8bb98e444 (recentf-save-file-coding-system): New variable.
Kenichi Handa <handa@m17n.org>
parents: 60844
diff changeset
1253 'utf-8-emacs
34f8bb98e444 (recentf-save-file-coding-system): New variable.
Kenichi Handa <handa@m17n.org>
parents: 60844
diff changeset
1254 'emacs-mule)
34f8bb98e444 (recentf-save-file-coding-system): New variable.
Kenichi Handa <handa@m17n.org>
parents: 60844
diff changeset
1255 "Coding system of the file `recentf-save-file'.")
34f8bb98e444 (recentf-save-file-coding-system): New variable.
Kenichi Handa <handa@m17n.org>
parents: 60844
diff changeset
1256
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1257 (defun recentf-save-list ()
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1258 "Save the recent list.
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1259 Write data into the file specified by `recentf-save-file'."
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1260 (interactive)
55012
13ef2f084366 (recentf-save-list): Catch and warn about errors.
Richard M. Stallman <rms@gnu.org>
parents: 54770
diff changeset
1261 (condition-case error
13ef2f084366 (recentf-save-list): Catch and warn about errors.
Richard M. Stallman <rms@gnu.org>
parents: 54770
diff changeset
1262 (with-temp-buffer
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1263 (erase-buffer)
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1264 (set-buffer-file-coding-system recentf-save-file-coding-system)
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1265 (insert (format recentf-save-file-header (current-time-string)))
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1266 (recentf-dump-variable 'recentf-list recentf-max-saved-items)
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
1267 (recentf-dump-variable 'recentf-filter-changer-current)
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1268 (insert "\n \n;;; Local Variables:\n"
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1269 (format ";;; coding: %s\n" recentf-save-file-coding-system)
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1270 ";;; End:\n")
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1271 (write-file (expand-file-name recentf-save-file))
65525
f68d6281086a (recentf-save-file-modes): New option.
David Ponce <david@dponce.com>
parents: 65368
diff changeset
1272 (when recentf-save-file-modes
f68d6281086a (recentf-save-file-modes): New option.
David Ponce <david@dponce.com>
parents: 65368
diff changeset
1273 (set-file-modes recentf-save-file recentf-save-file-modes))
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1274 nil)
55012
13ef2f084366 (recentf-save-list): Catch and warn about errors.
Richard M. Stallman <rms@gnu.org>
parents: 54770
diff changeset
1275 (error
13ef2f084366 (recentf-save-list): Catch and warn about errors.
Richard M. Stallman <rms@gnu.org>
parents: 54770
diff changeset
1276 (warn "recentf mode: %s" (error-message-string error)))))
32866
8ef794e21542 (recentf-mode): Variable removed.
Miles Bader <miles@gnu.org>
parents: 32429
diff changeset
1277
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1278 (defun recentf-load-list ()
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1279 "Load a previously saved recent list.
52638
2a2c48cb8b59 (recentf-initialize-file-name-history): New defcustom.
Eli Zaretskii <eliz@gnu.org>
parents: 52509
diff changeset
1280 Read data from the file specified by `recentf-save-file'.
2a2c48cb8b59 (recentf-initialize-file-name-history): New defcustom.
Eli Zaretskii <eliz@gnu.org>
parents: 52509
diff changeset
1281 When `recentf-initialize-file-name-history' is non-nil, initialize an
2a2c48cb8b59 (recentf-initialize-file-name-history): New defcustom.
Eli Zaretskii <eliz@gnu.org>
parents: 52509
diff changeset
1282 empty `file-name-history' with the recent list."
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1283 (interactive)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1284 (let ((file (expand-file-name recentf-save-file)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1285 (when (file-readable-p file)
52638
2a2c48cb8b59 (recentf-initialize-file-name-history): New defcustom.
Eli Zaretskii <eliz@gnu.org>
parents: 52509
diff changeset
1286 (load-file file)
2a2c48cb8b59 (recentf-initialize-file-name-history): New defcustom.
Eli Zaretskii <eliz@gnu.org>
parents: 52509
diff changeset
1287 (and recentf-initialize-file-name-history
2a2c48cb8b59 (recentf-initialize-file-name-history): New defcustom.
Eli Zaretskii <eliz@gnu.org>
parents: 52509
diff changeset
1288 (not file-name-history)
2a2c48cb8b59 (recentf-initialize-file-name-history): New defcustom.
Eli Zaretskii <eliz@gnu.org>
parents: 52509
diff changeset
1289 (setq file-name-history (mapcar 'abbreviate-file-name
2a2c48cb8b59 (recentf-initialize-file-name-history): New defcustom.
Eli Zaretskii <eliz@gnu.org>
parents: 52509
diff changeset
1290 recentf-list))))))
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1291
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1292 (defun recentf-cleanup ()
65744
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
1293 "Cleanup the recent list.
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
1294 That is, remove duplicates, non-kept, and excluded files."
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1295 (interactive)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1296 (message "Cleaning up the recentf list...")
60844
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
1297 (let ((n 0) newlist)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1298 (dolist (f recentf-list)
65744
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
1299 (setq f (recentf-expand-file-name f))
60740
1e67e22bcc1b (recentf-cleanup-remote): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 59996
diff changeset
1300 (if (and (recentf-include-p f)
65744
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
1301 (recentf-keep-p f)
4bbd95905599 (recentf-filename-handlers): Rename from
David Ponce <david@dponce.com>
parents: 65525
diff changeset
1302 (not (recentf-string-member f newlist)))
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1303 (push f newlist)
60844
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
1304 (setq n (1+ n))
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1305 (message "File %s removed from the recentf list" f)))
60844
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
1306 (message "Cleaning up the recentf list...done (%d removed)" n)
5bb0c1e05b1b (recentf-keep): New option.
David Ponce <david@dponce.com>
parents: 60740
diff changeset
1307 (setq recentf-list (nreverse newlist))))
66083
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1308
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1309 ;;; The minor mode
3ee176d1ff23 (recentf-track-opened-file)
David Ponce <david@dponce.com>
parents: 65894
diff changeset
1310 ;;
65894
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1311 (defvar recentf-mode-map (make-sparse-keymap)
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1312 "Keymap to use in recentf mode.")
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1313
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1314 ;;;###autoload
32866
8ef794e21542 (recentf-mode): Variable removed.
Miles Bader <miles@gnu.org>
parents: 32429
diff changeset
1315 (define-minor-mode recentf-mode
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1316 "Toggle recentf mode.
32866
8ef794e21542 (recentf-mode): Variable removed.
Miles Bader <miles@gnu.org>
parents: 32429
diff changeset
1317 With prefix argument ARG, turn on if positive, otherwise off.
8ef794e21542 (recentf-mode): Variable removed.
Miles Bader <miles@gnu.org>
parents: 32429
diff changeset
1318 Returns non-nil if the new state is enabled.
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1319
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1320 When recentf mode is enabled, it maintains a menu for visiting files
65894
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1321 that were operated on recently.
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1322
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1323 \\{recentf-mode-map}"
32866
8ef794e21542 (recentf-mode): Variable removed.
Miles Bader <miles@gnu.org>
parents: 32429
diff changeset
1324 :global t
8ef794e21542 (recentf-mode): Variable removed.
Miles Bader <miles@gnu.org>
parents: 32429
diff changeset
1325 :group 'recentf
65894
e0cf1ed38749 (recentf-menu-open-all-flag): New option.
David Ponce <david@dponce.com>
parents: 65744
diff changeset
1326 :keymap recentf-mode-map
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1327 (unless (and recentf-mode (recentf-enabled-p))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1328 (if recentf-mode
67417
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
1329 (progn
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
1330 (recentf-load-list)
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
1331 (recentf-show-menu))
29df8eb9daf1 Improvement of the menu code.
David Ponce <david@dponce.com>
parents: 67119
diff changeset
1332 (recentf-hide-menu)
50715
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1333 (recentf-save-list))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1334 (recentf-auto-cleanup)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1335 (let ((hook-setup (if recentf-mode 'add-hook 'remove-hook)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1336 (dolist (hook recentf-used-hooks)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1337 (apply hook-setup hook)))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1338 (run-hooks 'recentf-mode-hook)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1339 (when (interactive-p)
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1340 (message "Recentf mode %sabled" (if recentf-mode "en" "dis"))))
46229d46cbeb Major rewrite. The code is reordered, cleaner and faster.
Juanma Barranquero <lekktu@gmail.com>
parents: 49549
diff changeset
1341 recentf-mode)
30416
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1342
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1343 (provide 'recentf)
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1344
cc08ed656c8c Fix CRLF eols.
Dave Love <fx@gnu.org>
parents: 30286
diff changeset
1345 (run-hooks 'recentf-load-hook)
61733
34f8bb98e444 (recentf-save-file-coding-system): New variable.
Kenichi Handa <handa@m17n.org>
parents: 60844
diff changeset
1346
63781
99d460dc50ca Require 'tree-widget instead of 'wid-edit.
David Ponce <david@dponce.com>
parents: 63409
diff changeset
1347 ;; arch-tag: 78f1eec9-0d16-4d19-a4eb-2e4529edb62a
32429
0e626f0c2b8a Maintainer's checkdoc fixes.
Dave Love <fx@gnu.org>
parents: 32292
diff changeset
1348 ;;; recentf.el ends here