diff options
| -rw-r--r-- | lisp/recentf.el | 108 |
1 files changed, 54 insertions, 54 deletions
diff --git a/lisp/recentf.el b/lisp/recentf.el index c819397a33d..9ae059a70dd 100644 --- a/lisp/recentf.el +++ b/lisp/recentf.el | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | ;;; recentf.el --- setup a menu of recently opened files | 1 | ;;; recentf.el --- setup a menu of recently opened files -*- lexical-binding: t -*- |
| 2 | 2 | ||
| 3 | ;; Copyright (C) 1999-2021 Free Software Foundation, Inc. | 3 | ;; Copyright (C) 1999-2021 Free Software Foundation, Inc. |
| 4 | 4 | ||
| @@ -24,16 +24,21 @@ | |||
| 24 | ;;; Commentary: | 24 | ;;; Commentary: |
| 25 | 25 | ||
| 26 | ;; This package maintains a menu for visiting files that were operated | 26 | ;; This package maintains a menu for visiting files that were operated |
| 27 | ;; on recently. When enabled a new "Open Recent" sub menu is | 27 | ;; on recently. When enabled a new "Open Recent" submenu is |
| 28 | ;; displayed in the "File" menu. The recent files list is | 28 | ;; displayed in the "File" menu. The recent files list is |
| 29 | ;; automatically saved across Emacs sessions. You can customize the | 29 | ;; automatically saved across Emacs sessions. |
| 30 | ;; number of recent files displayed, the location of the menu and | ||
| 31 | ;; others options (see the source code for details). | ||
| 32 | 30 | ||
| 33 | ;; To enable this package, add the following to your .emacs: | 31 | ;; You can customize the number of recent files displayed, the |
| 34 | ;; (recentf-mode 1) | 32 | ;; location of the menu and others options. Type: |
| 33 | ;; | ||
| 34 | ;; M-x customize-group RET recentf RET | ||
| 35 | |||
| 36 | ;; To enable this package, add this line to your Init file: | ||
| 37 | ;; | ||
| 38 | ;; (recentf-mode 1) | ||
| 35 | 39 | ||
| 36 | ;;; Code: | 40 | ;;; Code: |
| 41 | |||
| 37 | (require 'tree-widget) | 42 | (require 'tree-widget) |
| 38 | (require 'timer) | 43 | (require 'timer) |
| 39 | 44 | ||
| @@ -73,7 +78,7 @@ See the command `recentf-save-list'." | |||
| 73 | :type 'file | 78 | :type 'file |
| 74 | :initialize 'custom-initialize-default | 79 | :initialize 'custom-initialize-default |
| 75 | :set (lambda (symbol value) | 80 | :set (lambda (symbol value) |
| 76 | (let ((oldvalue (eval symbol))) | 81 | (let ((oldvalue (symbol-value symbol))) |
| 77 | (custom-set-default symbol value) | 82 | (custom-set-default symbol value) |
| 78 | (and (not (equal value oldvalue)) | 83 | (and (not (equal value oldvalue)) |
| 79 | recentf-mode | 84 | recentf-mode |
| @@ -292,7 +297,7 @@ They are successively passed a file name to transform it." | |||
| 292 | (function :tag "Other function"))))) | 297 | (function :tag "Other function"))))) |
| 293 | 298 | ||
| 294 | (defcustom recentf-show-file-shortcuts-flag t | 299 | (defcustom recentf-show-file-shortcuts-flag t |
| 295 | "Whether to show \"[N]\" for the Nth item up to 10. | 300 | "Non-nil means to show \"[N]\" for the Nth item up to 10. |
| 296 | If non-nil, `recentf-open-files' will show labels for keys that can be | 301 | If non-nil, `recentf-open-files' will show labels for keys that can be |
| 297 | used as shortcuts to open the Nth file." | 302 | used as shortcuts to open the Nth file." |
| 298 | :group 'recentf | 303 | :group 'recentf |
| @@ -327,15 +332,6 @@ Ignore case if `recentf-case-fold-search' is non-nil." | |||
| 327 | (setq list (cdr list))) | 332 | (setq list (cdr list))) |
| 328 | list) | 333 | list) |
| 329 | 334 | ||
| 330 | (defsubst recentf-trunc-list (l n) | ||
| 331 | "Return from L the list of its first N elements." | ||
| 332 | (let (nl) | ||
| 333 | (while (and l (> n 0)) | ||
| 334 | (setq nl (cons (car l) nl) | ||
| 335 | n (1- n) | ||
| 336 | l (cdr l))) | ||
| 337 | (nreverse nl))) | ||
| 338 | |||
| 339 | (defun recentf-dump-variable (variable &optional limit) | 335 | (defun recentf-dump-variable (variable &optional limit) |
| 340 | "Insert a \"(setq VARIABLE value)\" in the current buffer. | 336 | "Insert a \"(setq VARIABLE value)\" in the current buffer. |
| 341 | When the value of VARIABLE is a list, optional argument LIMIT | 337 | When the value of VARIABLE is a list, optional argument LIMIT |
| @@ -345,7 +341,7 @@ the full list." | |||
| 345 | (if (atom value) | 341 | (if (atom value) |
| 346 | (insert (format "\n(setq %S '%S)\n" variable value)) | 342 | (insert (format "\n(setq %S '%S)\n" variable value)) |
| 347 | (when (and (integerp limit) (> limit 0)) | 343 | (when (and (integerp limit) (> limit 0)) |
| 348 | (setq value (recentf-trunc-list value limit))) | 344 | (setq value (seq-take value limit))) |
| 349 | (insert (format "\n(setq %S\n '(" variable)) | 345 | (insert (format "\n(setq %S\n '(" variable)) |
| 350 | (dolist (e value) | 346 | (dolist (e value) |
| 351 | (insert (format "\n %S" e))) | 347 | (insert (format "\n %S" e))) |
| @@ -516,7 +512,7 @@ filter function this variable is reset to nil.") | |||
| 516 | 512 | ||
| 517 | (defsubst recentf-elements (n) | 513 | (defsubst recentf-elements (n) |
| 518 | "Return a list of the first N elements of the recent list." | 514 | "Return a list of the first N elements of the recent list." |
| 519 | (recentf-trunc-list recentf-list n)) | 515 | (seq-take recentf-list n)) |
| 520 | 516 | ||
| 521 | (defsubst recentf-make-menu-element (menu-item menu-value) | 517 | (defsubst recentf-make-menu-element (menu-item menu-value) |
| 522 | "Create a new menu-element. | 518 | "Create a new menu-element. |
| @@ -556,7 +552,7 @@ This a menu element (FILE . FILE)." | |||
| 556 | (defsubst recentf-menu-elements (n) | 552 | (defsubst recentf-menu-elements (n) |
| 557 | "Return a list of the first N default menu elements from the recent list. | 553 | "Return a list of the first N default menu elements from the recent list. |
| 558 | See also `recentf-make-default-menu-element'." | 554 | See also `recentf-make-default-menu-element'." |
| 559 | (mapcar 'recentf-make-default-menu-element | 555 | (mapcar #'recentf-make-default-menu-element |
| 560 | (recentf-elements n))) | 556 | (recentf-elements n))) |
| 561 | 557 | ||
| 562 | (defun recentf-apply-menu-filter (filter l) | 558 | (defun recentf-apply-menu-filter (filter l) |
| @@ -597,7 +593,7 @@ This is a menu filter function which ignores the MENU argument." | |||
| 597 | (let* ((recentf-menu-shortcuts 0) | 593 | (let* ((recentf-menu-shortcuts 0) |
| 598 | (file-items | 594 | (file-items |
| 599 | (condition-case err | 595 | (condition-case err |
| 600 | (mapcar 'recentf-make-menu-item | 596 | (mapcar #'recentf-make-menu-item |
| 601 | (recentf-apply-menu-filter | 597 | (recentf-apply-menu-filter |
| 602 | recentf-menu-filter | 598 | recentf-menu-filter |
| 603 | (recentf-menu-elements recentf-max-menu-items))) | 599 | (recentf-menu-elements recentf-max-menu-items))) |
| @@ -639,7 +635,7 @@ Return nil if file NAME is not one of the ten more recent." | |||
| 639 | (let ((item (recentf-menu-element-item elt)) | 635 | (let ((item (recentf-menu-element-item elt)) |
| 640 | (value (recentf-menu-element-value elt))) | 636 | (value (recentf-menu-element-value elt))) |
| 641 | (if (recentf-sub-menu-element-p elt) | 637 | (if (recentf-sub-menu-element-p elt) |
| 642 | (cons item (mapcar 'recentf-make-menu-item value)) | 638 | (cons item (mapcar #'recentf-make-menu-item value)) |
| 643 | (let ((k (and (< recentf-menu-shortcuts 10) | 639 | (let ((k (and (< recentf-menu-shortcuts 10) |
| 644 | (recentf-menu-value-shortcut value)))) | 640 | (recentf-menu-value-shortcut value)))) |
| 645 | (vector item | 641 | (vector item |
| @@ -764,12 +760,12 @@ This filter combines the `recentf-sort-basenames-descending' and | |||
| 764 | (defun recentf-relative-filter (l) | 760 | (defun recentf-relative-filter (l) |
| 765 | "Filter the list of menu-elements L to show relative filenames. | 761 | "Filter the list of menu-elements L to show relative filenames. |
| 766 | Filenames are relative to the `default-directory'." | 762 | Filenames are relative to the `default-directory'." |
| 767 | (mapcar #'(lambda (menu-element) | 763 | (mapcar (lambda (menu-element) |
| 768 | (let* ((ful (recentf-menu-element-value menu-element)) | 764 | (let* ((ful (recentf-menu-element-value menu-element)) |
| 769 | (rel (file-relative-name ful default-directory))) | 765 | (rel (file-relative-name ful default-directory))) |
| 770 | (if (string-match "^\\.\\." rel) | 766 | (if (string-match "^\\.\\." rel) |
| 771 | menu-element | 767 | menu-element |
| 772 | (recentf-make-menu-element rel ful)))) | 768 | (recentf-make-menu-element rel ful)))) |
| 773 | l)) | 769 | l)) |
| 774 | 770 | ||
| 775 | ;;; Rule based menu filters | 771 | ;;; Rule based menu filters |
| @@ -941,10 +937,10 @@ Rules obey `recentf-arrange-rules' format." | |||
| 941 | This simplified version of `recentf-show-basenames' does not handle | 937 | This simplified version of `recentf-show-basenames' does not handle |
| 942 | duplicates. It is used by `recentf-arrange-by-dir' as its | 938 | duplicates. It is used by `recentf-arrange-by-dir' as its |
| 943 | `recentf-arrange-by-rule-subfilter'." | 939 | `recentf-arrange-by-rule-subfilter'." |
| 944 | (mapcar #'(lambda (e) | 940 | (mapcar (lambda (e) |
| 945 | (recentf-make-menu-element | 941 | (recentf-make-menu-element |
| 946 | (file-name-nondirectory (recentf-menu-element-value e)) | 942 | (file-name-nondirectory (recentf-menu-element-value e)) |
| 947 | (recentf-menu-element-value e))) | 943 | (recentf-menu-element-value e))) |
| 948 | l)) | 944 | l)) |
| 949 | 945 | ||
| 950 | (defun recentf-dir-rule (file) | 946 | (defun recentf-dir-rule (file) |
| @@ -997,15 +993,15 @@ Filtering of L is delegated to the selected filter in the menu." | |||
| 997 | (list | 993 | (list |
| 998 | `("Show files" | 994 | `("Show files" |
| 999 | ,@(mapcar | 995 | ,@(mapcar |
| 1000 | #'(lambda (f) | 996 | (lambda (f) |
| 1001 | `[,(cdr f) | 997 | `[,(cdr f) |
| 1002 | (setq recentf-filter-changer-current ',(car f)) | 998 | (setq recentf-filter-changer-current ',(car f)) |
| 1003 | ;;:active t | 999 | ;;:active t |
| 1004 | :style radio ;;radio Don't work with GTK :-( | 1000 | :style radio ;;radio Don't work with GTK :-( |
| 1005 | :selected (eq recentf-filter-changer-current | 1001 | :selected (eq recentf-filter-changer-current |
| 1006 | ',(car f)) | 1002 | ',(car f)) |
| 1007 | ;;:help ,(cdr f) | 1003 | ;;:help ,(cdr f) |
| 1008 | ]) | 1004 | ]) |
| 1009 | recentf-filter-changer-alist)))) | 1005 | recentf-filter-changer-alist)))) |
| 1010 | (recentf-apply-menu-filter recentf-filter-changer-current l))) | 1006 | (recentf-apply-menu-filter recentf-filter-changer-current l))) |
| 1011 | 1007 | ||
| @@ -1062,9 +1058,9 @@ Go to the beginning of buffer if not found." | |||
| 1062 | (defvar recentf-dialog-mode-map | 1058 | (defvar recentf-dialog-mode-map |
| 1063 | (let ((km (copy-keymap recentf--shortcuts-keymap))) | 1059 | (let ((km (copy-keymap recentf--shortcuts-keymap))) |
| 1064 | (set-keymap-parent km widget-keymap) | 1060 | (set-keymap-parent km widget-keymap) |
| 1065 | (define-key km "q" 'recentf-cancel-dialog) | 1061 | (define-key km "q" #'recentf-cancel-dialog) |
| 1066 | (define-key km "n" 'next-line) | 1062 | (define-key km "n" #'next-line) |
| 1067 | (define-key km "p" 'previous-line) | 1063 | (define-key km "p" #'previous-line) |
| 1068 | km) | 1064 | km) |
| 1069 | "Keymap used in recentf dialogs.") | 1065 | "Keymap used in recentf dialogs.") |
| 1070 | 1066 | ||
| @@ -1083,8 +1079,8 @@ Go to the beginning of buffer if not found." | |||
| 1083 | ;; Cleanup buffer | 1079 | ;; Cleanup buffer |
| 1084 | (let ((inhibit-read-only t) | 1080 | (let ((inhibit-read-only t) |
| 1085 | (ol (overlay-lists))) | 1081 | (ol (overlay-lists))) |
| 1086 | (mapc 'delete-overlay (car ol)) | 1082 | (mapc #'delete-overlay (car ol)) |
| 1087 | (mapc 'delete-overlay (cdr ol)) | 1083 | (mapc #'delete-overlay (cdr ol)) |
| 1088 | (erase-buffer)) | 1084 | (erase-buffer)) |
| 1089 | (recentf-dialog-mode) | 1085 | (recentf-dialog-mode) |
| 1090 | ,@forms | 1086 | ,@forms |
| @@ -1178,7 +1174,7 @@ IGNORE other arguments." | |||
| 1178 | :node (item :tag ,(car menu-element) | 1174 | :node (item :tag ,(car menu-element) |
| 1179 | :sample-face bold | 1175 | :sample-face bold |
| 1180 | :format "%{%t%}:\n") | 1176 | :format "%{%t%}:\n") |
| 1181 | ,@(mapcar 'recentf-open-files-item | 1177 | ,@(mapcar #'recentf-open-files-item |
| 1182 | (cdr menu-element))) | 1178 | (cdr menu-element))) |
| 1183 | ;; Represent a single file with a link widget | 1179 | ;; Represent a single file with a link widget |
| 1184 | `(link :tag ,(car menu-element) | 1180 | `(link :tag ,(car menu-element) |
| @@ -1193,8 +1189,8 @@ IGNORE other arguments." | |||
| 1193 | (defun recentf-open-files-items (files) | 1189 | (defun recentf-open-files-items (files) |
| 1194 | "Return a list of widgets to display FILES in a dialog buffer." | 1190 | "Return a list of widgets to display FILES in a dialog buffer." |
| 1195 | (setq-local recentf--files-with-key | 1191 | (setq-local recentf--files-with-key |
| 1196 | (recentf-trunc-list files 10)) | 1192 | (seq-take files 10)) |
| 1197 | (mapcar 'recentf-open-files-item | 1193 | (mapcar #'recentf-open-files-item |
| 1198 | (append | 1194 | (append |
| 1199 | ;; When requested group the files with shortcuts together | 1195 | ;; When requested group the files with shortcuts together |
| 1200 | ;; at the top of the list. | 1196 | ;; at the top of the list. |
| @@ -1202,12 +1198,12 @@ IGNORE other arguments." | |||
| 1202 | (setq files (nthcdr 10 files)) | 1198 | (setq files (nthcdr 10 files)) |
| 1203 | (recentf-apply-menu-filter | 1199 | (recentf-apply-menu-filter |
| 1204 | 'recentf-show-digit-shortcut-filter | 1200 | 'recentf-show-digit-shortcut-filter |
| 1205 | (mapcar 'recentf-make-default-menu-element | 1201 | (mapcar #'recentf-make-default-menu-element |
| 1206 | recentf--files-with-key))) | 1202 | recentf--files-with-key))) |
| 1207 | ;; Then the other files. | 1203 | ;; Then the other files. |
| 1208 | (recentf-apply-menu-filter | 1204 | (recentf-apply-menu-filter |
| 1209 | recentf-menu-filter | 1205 | recentf-menu-filter |
| 1210 | (mapcar 'recentf-make-default-menu-element | 1206 | (mapcar #'recentf-make-default-menu-element |
| 1211 | files))))) | 1207 | files))))) |
| 1212 | 1208 | ||
| 1213 | (defun recentf-open-files (&optional files buffer-name) | 1209 | (defun recentf-open-files (&optional files buffer-name) |
| @@ -1228,7 +1224,7 @@ use for the dialog. It defaults to \"*`recentf-menu-title'*\"." | |||
| 1228 | (format-message "Click on Cancel or type `q' to cancel.\n")) | 1224 | (format-message "Click on Cancel or type `q' to cancel.\n")) |
| 1229 | ;; Use a L&F that looks like the recentf menu. | 1225 | ;; Use a L&F that looks like the recentf menu. |
| 1230 | (tree-widget-set-theme "folder") | 1226 | (tree-widget-set-theme "folder") |
| 1231 | (apply 'widget-create | 1227 | (apply #'widget-create |
| 1232 | `(group | 1228 | `(group |
| 1233 | :indent 2 | 1229 | :indent 2 |
| 1234 | :format "\n%v\n" | 1230 | :format "\n%v\n" |
| @@ -1310,7 +1306,7 @@ empty `file-name-history' with the recent list." | |||
| 1310 | (load-file file) | 1306 | (load-file file) |
| 1311 | (and recentf-initialize-file-name-history | 1307 | (and recentf-initialize-file-name-history |
| 1312 | (not file-name-history) | 1308 | (not file-name-history) |
| 1313 | (setq file-name-history (mapcar 'abbreviate-file-name | 1309 | (setq file-name-history (mapcar #'abbreviate-file-name |
| 1314 | recentf-list)))))) | 1310 | recentf-list)))))) |
| 1315 | 1311 | ||
| 1316 | (defun recentf-cleanup () | 1312 | (defun recentf-cleanup () |
| @@ -1377,6 +1373,10 @@ buffers you switch to a lot, you can say something like the following: | |||
| 1377 | ;; continue standard unloading | 1373 | ;; continue standard unloading |
| 1378 | nil) | 1374 | nil) |
| 1379 | 1375 | ||
| 1376 | ;; Obsolete. | ||
| 1377 | |||
| 1378 | (define-obsolete-function-alias 'recentf-trunc-list #'seq-take "28.1") | ||
| 1379 | |||
| 1380 | (provide 'recentf) | 1380 | (provide 'recentf) |
| 1381 | 1381 | ||
| 1382 | (run-hooks 'recentf-load-hook) | 1382 | (run-hooks 'recentf-load-hook) |