diff options
| author | Gerd Moellmann | 2000-03-01 12:46:12 +0000 |
|---|---|---|
| committer | Gerd Moellmann | 2000-03-01 12:46:12 +0000 |
| commit | 70d9b8fd9083ddb0cbb0af6c6d60d733ce3f87b4 (patch) | |
| tree | cf1205372bc2f1dc20683558b24730e1ea4d1a00 | |
| parent | 72d19d752b111b05a04b8f88387253007ffada3e (diff) | |
| download | emacs-70d9b8fd9083ddb0cbb0af6c6d60d733ce3f87b4.tar.gz emacs-70d9b8fd9083ddb0cbb0af6c6d60d733ce3f87b4.zip | |
(recentf): Added version tag to the defgroup of
recentf.
(recentf-cleanup): Changed to remove excluded file
too.
(recentf-edit-list-action): `recentf-edit-list' checkbox widget
action to select/unselect a file.
(recentf-edit-list): Code cleanup and improvement.
(recentf-open-more-files-action): `recentf-open-more-files' button
widget action to open a file.
(recentf-open-more-files): No more use standard completion but
widgets.
(recentf-more-collection): Deleted.
(recentf-more-history): Deleted.
(recentf-setup-more-completion): Deleted.
(recentf-mode): No more needs that Emacs is running
under a window-system.
(recentf-edit-list): New command to edit the recent
list which allow the user to remove files.
(recentf-edit-selected-items): New global variable, used by
`recentf-edit-list' to hold the list of files to be removed from
the recent list.
(recentf-make-menu-items): Updated to display a "Edit list..."
menu item. Minor code cleanup.
(recentf-open-more-files): New command to open files
that are not displayed in the menu.
(recentf-more-collection): New global variable holding the set of
permissible completions used by `recentf-open-more-files'.
(recentf-more-history): New global variable holding the history list
used by `recentf-open-more-files' completion.
(recentf-setup-more-completion): New function to setup completion for
`recentf-open-more-files'.
(recentf-make-menu-items): Updated to display a "More..." menu item.
* recentf.el (recentf-menu-action): Doc fixed.
(recentf-menu-filter): Doc updated.
(recentf-update-menu-hook): Allow menu filters to force menu update.
(recentf-make-menu-items): New menu filter handling.
(recentf-make-menu-item): New helper function.
(recentf-menu-elements): New menu handling function.
(recentf-sort-ascending): Updated to new menu filter handling.
(recentf-sort-descending): Updated to new menu filter handling.
(recentf-sort-basenames-ascending): New menu filter function.
(recentf-sort-basenames-descending): New menu filter function.
(recentf-show-basenames): New menu filter function.
(recentf-show-basenames-ascending): New menu filter function.
(recentf-show-basenames-descending): New menu filter function.
| -rw-r--r-- | lisp/recentf.el | 187 |
1 files changed, 155 insertions, 32 deletions
diff --git a/lisp/recentf.el b/lisp/recentf.el index f7f998ead2c..519127d1967 100644 --- a/lisp/recentf.el +++ b/lisp/recentf.el | |||
| @@ -28,6 +28,9 @@ | |||
| 28 | ;;; Code: | 28 | ;;; Code: |
| 29 | 29 | ||
| 30 | (require 'easymenu) | 30 | (require 'easymenu) |
| 31 | (require 'widget) | ||
| 32 | (eval-when-compile | ||
| 33 | (require 'wid-edit)) | ||
| 31 | 34 | ||
| 32 | (defconst recentf-save-file-header | 35 | (defconst recentf-save-file-header |
| 33 | ";;; Automatically generated by `recentf' on %s.\n" | 36 | ";;; Automatically generated by `recentf' on %s.\n" |
| @@ -103,7 +106,7 @@ If nil add it at end of menu (see also `easy-menu-change')." | |||
| 103 | The default action `recentf-find-file' calls `find-file' to edit an | 106 | The default action `recentf-find-file' calls `find-file' to edit an |
| 104 | existing file. If the file does not exist or is not readable, it is | 107 | existing file. If the file does not exist or is not readable, it is |
| 105 | not edited and its name is removed from `recentf-list'. You can use | 108 | not edited and its name is removed from `recentf-list'. You can use |
| 106 | `find-file' instead to open non-existing files and keep them is the | 109 | `find-file' instead to open non-existing files and keep them in the |
| 107 | list of recently opened files." | 110 | list of recently opened files." |
| 108 | :group 'recentf | 111 | :group 'recentf |
| 109 | :type 'function | 112 | :type 'function |
| @@ -171,31 +174,30 @@ Returns the new status of recentf mode (non-nil means on). | |||
| 171 | When recentf mode is enabled, it maintains a menu for visiting files that | 174 | When recentf mode is enabled, it maintains a menu for visiting files that |
| 172 | were operated on recently." | 175 | were operated on recently." |
| 173 | (interactive "P") | 176 | (interactive "P") |
| 174 | (when window-system | 177 | (let ((on-p (if arg |
| 175 | (let ((on-p (if arg | 178 | (> (prefix-numeric-value arg) 0) |
| 176 | (> (prefix-numeric-value arg) 0) | 179 | (not recentf-mode)))) |
| 177 | (not recentf-mode)))) | 180 | (if on-p |
| 178 | (if on-p | 181 | (unless recentf-initialized-p |
| 179 | (unless recentf-initialized-p | 182 | (setq recentf-initialized-p t) |
| 180 | (setq recentf-initialized-p t) | 183 | (if (file-readable-p recentf-save-file) |
| 181 | (if (file-readable-p recentf-save-file) | 184 | (load-file recentf-save-file)) |
| 182 | (load-file recentf-save-file)) | 185 | (setq recentf-update-menu-p t) |
| 183 | (setq recentf-update-menu-p t) | 186 | (add-hook 'find-file-hooks 'recentf-add-file-hook) |
| 184 | (add-hook 'find-file-hooks 'recentf-add-file-hook) | 187 | (add-hook 'write-file-hooks 'recentf-add-file-hook) |
| 185 | (add-hook 'write-file-hooks 'recentf-add-file-hook) | 188 | ;; (add-hook 'activate-menubar-hook 'recentf-update-menu-hook) |
| 186 | ;; (add-hook 'activate-menubar-hook 'recentf-update-menu-hook) | 189 | (add-hook 'menu-bar-update-hook 'recentf-update-menu-hook) |
| 187 | (add-hook 'menu-bar-update-hook 'recentf-update-menu-hook) | 190 | (add-hook 'kill-emacs-hook 'recentf-save-list)) |
| 188 | (add-hook 'kill-emacs-hook 'recentf-save-list)) | 191 | (when recentf-initialized-p |
| 189 | (when recentf-initialized-p | 192 | (setq recentf-initialized-p nil) |
| 190 | (setq recentf-initialized-p nil) | 193 | (recentf-save-list) |
| 191 | (recentf-save-list) | 194 | (easy-menu-remove-item nil recentf-menu-path recentf-menu-title) |
| 192 | (easy-menu-remove-item nil recentf-menu-path recentf-menu-title) | 195 | (remove-hook 'find-file-hooks 'recentf-add-file-hook) |
| 193 | (remove-hook 'find-file-hooks 'recentf-add-file-hook) | 196 | (remove-hook 'write-file-hooks 'recentf-add-file-hook) |
| 194 | (remove-hook 'write-file-hooks 'recentf-add-file-hook) | 197 | ;; (remove-hook 'activate-menubar-hook 'recentf-update-menu-hook) |
| 195 | ;; (remove-hook 'activate-menubar-hook 'recentf-update-menu-hook) | 198 | (remove-hook 'menu-bar-update-hook 'recentf-update-menu-hook) |
| 196 | (remove-hook 'menu-bar-update-hook 'recentf-update-menu-hook) | 199 | (remove-hook 'kill-emacs-hook 'recentf-save-list))) |
| 197 | (remove-hook 'kill-emacs-hook 'recentf-save-list))) | 200 | (setq recentf-mode on-p))) |
| 198 | (setq recentf-mode on-p)))) | ||
| 199 | 201 | ||
| 200 | (defun recentf-add-file-hook () | 202 | (defun recentf-add-file-hook () |
| 201 | "Insert the name of the file just opened or written into `recentf-list'." | 203 | "Insert the name of the file just opened or written into `recentf-list'." |
| @@ -237,20 +239,139 @@ were operated on recently." | |||
| 237 | (kill-buffer (current-buffer)))) | 239 | (kill-buffer (current-buffer)))) |
| 238 | nil) | 240 | nil) |
| 239 | 241 | ||
| 242 | (defvar recentf-edit-selected-items nil | ||
| 243 | "Used by `recentf-edit-list' to hold the list of files to be deleted | ||
| 244 | from `recentf-list'.") | ||
| 245 | |||
| 246 | (defun recentf-edit-list-action (widget &rest ignore) | ||
| 247 | "Checkbox widget action used by `recentf-edit-list' to select/unselect a file." | ||
| 248 | (let ((value (widget-get widget ':tag))) | ||
| 249 | ;; if value is already in the selected items | ||
| 250 | (if (memq value recentf-edit-selected-items) | ||
| 251 | ;; then remove it | ||
| 252 | (progn | ||
| 253 | (setq recentf-edit-selected-items | ||
| 254 | (delq value recentf-edit-selected-items)) | ||
| 255 | (message "%s removed from selection." value)) | ||
| 256 | ;; else add it | ||
| 257 | (progn | ||
| 258 | (setq recentf-edit-selected-items | ||
| 259 | (nconc (list value) recentf-edit-selected-items)) | ||
| 260 | (message "%s added to selection." value))))) | ||
| 261 | |||
| 262 | ;;;###autoload | ||
| 263 | (defun recentf-edit-list () | ||
| 264 | "Allow the user to edit the files that are kept in the recent list." | ||
| 265 | (interactive) | ||
| 266 | (with-current-buffer (get-buffer-create (concat "*" recentf-menu-title " - Edit list*")) | ||
| 267 | (switch-to-buffer (current-buffer)) | ||
| 268 | (kill-all-local-variables) | ||
| 269 | (let ((inhibit-read-only t)) | ||
| 270 | (erase-buffer)) | ||
| 271 | (let ((all (overlay-lists))) | ||
| 272 | ;; Delete all the overlays. | ||
| 273 | (mapcar 'delete-overlay (car all)) | ||
| 274 | (mapcar 'delete-overlay (cdr all))) | ||
| 275 | (setq recentf-edit-selected-items nil) | ||
| 276 | ;; Insert the dialog header | ||
| 277 | (widget-insert "Select the files to be deleted from the 'recentf-list'.\n\n") | ||
| 278 | (widget-insert "Click on Ok to update the list or on Cancel to quit.\n" ) | ||
| 279 | ;; Insert the list of files as checkboxes | ||
| 280 | (mapcar '(lambda (item) | ||
| 281 | (widget-create 'checkbox | ||
| 282 | :value nil ; unselected checkbox | ||
| 283 | :format "\n %[%v%] %t" | ||
| 284 | :tag item | ||
| 285 | :notify 'recentf-edit-list-action)) | ||
| 286 | recentf-list) | ||
| 287 | (widget-insert "\n\n") | ||
| 288 | ;; Insert the Ok button | ||
| 289 | (widget-create 'push-button | ||
| 290 | :notify (lambda (&rest ignore) | ||
| 291 | (if recentf-edit-selected-items | ||
| 292 | (progn (kill-buffer (current-buffer)) | ||
| 293 | (mapcar '(lambda (item) | ||
| 294 | (setq recentf-list | ||
| 295 | (delq item recentf-list))) | ||
| 296 | recentf-edit-selected-items) | ||
| 297 | (message "%S file(s) removed from the list" | ||
| 298 | (length recentf-edit-selected-items)) | ||
| 299 | (setq recentf-update-menu-p t)) | ||
| 300 | (message "No file selected."))) | ||
| 301 | "Ok") | ||
| 302 | (widget-insert " ") | ||
| 303 | ;; Insert the Cancel button | ||
| 304 | (widget-create 'push-button | ||
| 305 | :notify (lambda (&rest ignore) | ||
| 306 | (kill-buffer (current-buffer)) | ||
| 307 | (message "Command canceled.")) | ||
| 308 | "Cancel") | ||
| 309 | (use-local-map widget-keymap) | ||
| 310 | (widget-setup))) | ||
| 311 | |||
| 240 | ;;;###autoload | 312 | ;;;###autoload |
| 241 | (defun recentf-cleanup () | 313 | (defun recentf-cleanup () |
| 242 | "Remove all non-readable files from `recentf-list'." | 314 | "Remove all non-readable and excluded files from `recentf-list'." |
| 243 | (interactive) | 315 | (interactive) |
| 244 | (setq recentf-list (delq nil (mapcar '(lambda (f) | 316 | (setq recentf-list |
| 245 | (and (file-readable-p f) f)) | 317 | (delq nil |
| 246 | recentf-list))) | 318 | (mapcar '(lambda (filename) |
| 319 | (and (file-readable-p filename) | ||
| 320 | (recentf-include-p filename) | ||
| 321 | filename)) | ||
| 322 | recentf-list))) | ||
| 247 | (setq recentf-update-menu-p t)) | 323 | (setq recentf-update-menu-p t)) |
| 248 | 324 | ||
| 325 | (defun recentf-open-more-files-action (widget &rest ignore) | ||
| 326 | "Button widget action used by `recentf-open-more-files' to open a file." | ||
| 327 | (kill-buffer (current-buffer)) | ||
| 328 | (funcall recentf-menu-action (widget-value widget))) | ||
| 329 | |||
| 330 | ;;;###autoload | ||
| 331 | (defun recentf-open-more-files () | ||
| 332 | "Allow the user to open files that are not in the menu." | ||
| 333 | (interactive) | ||
| 334 | (with-current-buffer (get-buffer-create (concat "*" recentf-menu-title " - More*")) | ||
| 335 | (switch-to-buffer (current-buffer)) | ||
| 336 | (kill-all-local-variables) | ||
| 337 | (let ((inhibit-read-only t)) | ||
| 338 | (erase-buffer)) | ||
| 339 | (let ((all (overlay-lists))) | ||
| 340 | ;; Delete all the overlays. | ||
| 341 | (mapcar 'delete-overlay (car all)) | ||
| 342 | (mapcar 'delete-overlay (cdr all))) | ||
| 343 | ;; Insert the dialog header | ||
| 344 | (widget-insert "Click on a file to open it or on Cancel to quit.\n\n") | ||
| 345 | ;; Insert the list of files as buttons | ||
| 346 | (mapcar '(lambda (menu-element) | ||
| 347 | (let ((menu-item (car menu-element)) | ||
| 348 | (file-path (cdr menu-element))) | ||
| 349 | (widget-create 'push-button | ||
| 350 | :button-face 'default | ||
| 351 | :tag menu-item | ||
| 352 | :help-echo (concat "Open " file-path) | ||
| 353 | :format "%[%t%]" | ||
| 354 | :notify 'recentf-open-more-files-action | ||
| 355 | file-path) | ||
| 356 | (widget-insert "\n"))) | ||
| 357 | (funcall (or recentf-menu-filter 'identity) | ||
| 358 | (mapcar '(lambda (item) (cons item item)) | ||
| 359 | (nthcdr recentf-max-menu-items recentf-list)))) | ||
| 360 | (widget-insert "\n") | ||
| 361 | ;; Insert the Cancel button | ||
| 362 | (widget-create 'push-button | ||
| 363 | :notify (lambda (&rest ignore) | ||
| 364 | (kill-buffer (current-buffer)) | ||
| 365 | (message "Command canceled.")) | ||
| 366 | "Cancel") | ||
| 367 | (use-local-map widget-keymap) | ||
| 368 | (widget-setup))) | ||
| 369 | |||
| 249 | (defvar recentf-menu-items-for-commands | 370 | (defvar recentf-menu-items-for-commands |
| 250 | (list ["Cleanup list" recentf-cleanup t] | 371 | (list ["Cleanup list" recentf-cleanup t] |
| 372 | ["Edit list..." recentf-edit-list t] | ||
| 251 | ["Save list now" recentf-save-list t] | 373 | ["Save list now" recentf-save-list t] |
| 252 | (vector (format "Recentf Options...") | 374 | (vector "Recentf Options..." '(customize-group "recentf") t)) |
| 253 | '(customize-group "recentf") t)) | ||
| 254 | "List of menu items for recentf commands.") | 375 | "List of menu items for recentf commands.") |
| 255 | 376 | ||
| 256 | (defun recentf-make-menu-items () | 377 | (defun recentf-make-menu-items () |
| @@ -261,6 +382,8 @@ were operated on recently." | |||
| 261 | (funcall (or recentf-menu-filter 'identity) | 382 | (funcall (or recentf-menu-filter 'identity) |
| 262 | (recentf-elements recentf-max-menu-items))))) | 383 | (recentf-elements recentf-max-menu-items))))) |
| 263 | (append (or file-items (list ["No files" t nil])) | 384 | (append (or file-items (list ["No files" t nil])) |
| 385 | (and (< recentf-max-menu-items (length recentf-list)) | ||
| 386 | (list ["More..." recentf-open-more-files t])) | ||
| 264 | (and recentf-menu-append-commands-p | 387 | (and recentf-menu-append-commands-p |
| 265 | (cons ["---" nil nil] | 388 | (cons ["---" nil nil] |
| 266 | recentf-menu-items-for-commands))))) | 389 | recentf-menu-items-for-commands))))) |