diff options
| -rw-r--r-- | lisp/emacs-lisp/package.el | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index d6a3832016d..4dafe17aced 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el | |||
| @@ -2554,10 +2554,11 @@ Installed obsolete packages are always displayed.") | |||
| 2554 | (interactive) | 2554 | (interactive) |
| 2555 | (unless (derived-mode-p 'package-menu-mode) | 2555 | (unless (derived-mode-p 'package-menu-mode) |
| 2556 | (user-error "The current buffer is not a Package Menu")) | 2556 | (user-error "The current buffer is not a Package Menu")) |
| 2557 | (message "%s available-obsolete packages" (if package-menu--hide-obsolete | ||
| 2558 | "Hiding" "Displaying")) | ||
| 2559 | (setq package-menu--hide-packages | 2557 | (setq package-menu--hide-packages |
| 2560 | (not package-menu--hide-packages)) | 2558 | (not package-menu--hide-packages)) |
| 2559 | (message "%s packages" (if package-menu--hide-packages | ||
| 2560 | "Hiding obsolete or unwanted" | ||
| 2561 | "Displaying all")) | ||
| 2561 | (revert-buffer nil 'no-confirm)) | 2562 | (revert-buffer nil 'no-confirm)) |
| 2562 | 2563 | ||
| 2563 | (defun package--remove-hidden (pkg-list) | 2564 | (defun package--remove-hidden (pkg-list) |
| @@ -2600,13 +2601,23 @@ to their archives." | |||
| 2600 | ins-version)) | 2601 | ins-version)) |
| 2601 | filtered-by-priority)))))))) | 2602 | filtered-by-priority)))))))) |
| 2602 | 2603 | ||
| 2604 | (defcustom package-hidden-regexps nil | ||
| 2605 | "List of regexps matching the name of packages to hide. | ||
| 2606 | If the name of a package matches any of these regexps it is | ||
| 2607 | omited from the package menu. To toggle this, type \\[package-menu-toggle-hiding]. | ||
| 2608 | |||
| 2609 | Values can be interactively added to this list by typing | ||
| 2610 | \\[package-menu-hide-package] on a package" | ||
| 2611 | :type '(repeat (regexp :tag "Hide packages with name matching"))) | ||
| 2612 | |||
| 2603 | (defun package-menu--refresh (&optional packages keywords) | 2613 | (defun package-menu--refresh (&optional packages keywords) |
| 2604 | "Re-populate the `tabulated-list-entries'. | 2614 | "Re-populate the `tabulated-list-entries'. |
| 2605 | PACKAGES should be nil or t, which means to display all known packages. | 2615 | PACKAGES should be nil or t, which means to display all known packages. |
| 2606 | KEYWORDS should be nil or a list of keywords." | 2616 | KEYWORDS should be nil or a list of keywords." |
| 2607 | ;; Construct list of (PKG-DESC . STATUS). | 2617 | ;; Construct list of (PKG-DESC . STATUS). |
| 2608 | (unless packages (setq packages t)) | 2618 | (unless packages (setq packages t)) |
| 2609 | (let (info-list) | 2619 | (let ((hidden-names (mapconcat #'identity package-hidden-regexps "\\|")) |
| 2620 | info-list) | ||
| 2610 | ;; Installed packages: | 2621 | ;; Installed packages: |
| 2611 | (dolist (elt package-alist) | 2622 | (dolist (elt package-alist) |
| 2612 | (let ((name (car elt))) | 2623 | (let ((name (car elt))) |
| @@ -2629,7 +2640,13 @@ KEYWORDS should be nil or a list of keywords." | |||
| 2629 | ;; Available and disabled packages: | 2640 | ;; Available and disabled packages: |
| 2630 | (dolist (elt package-archive-contents) | 2641 | (dolist (elt package-archive-contents) |
| 2631 | (let ((name (car elt))) | 2642 | (let ((name (car elt))) |
| 2632 | (when (or (eq packages t) (memq name packages)) | 2643 | ;; To be displayed it must be in PACKAGES; |
| 2644 | (when (and (or (eq packages t) (memq name packages)) | ||
| 2645 | ;; and we must either not be hiding anything, | ||
| 2646 | (or (not package-menu--hide-packages) | ||
| 2647 | (not package-hidden-regexps) | ||
| 2648 | ;; or just not hiding this specific package. | ||
| 2649 | (not (string-match hidden-names (symbol-name name))))) | ||
| 2633 | ;; Hide available-obsolete or low-priority packages. | 2650 | ;; Hide available-obsolete or low-priority packages. |
| 2634 | (dolist (pkg (package--remove-hidden (cdr elt))) | 2651 | (dolist (pkg (package--remove-hidden (cdr elt))) |
| 2635 | (when (package--has-keyword-p pkg keywords) | 2652 | (when (package--has-keyword-p pkg keywords) |
| @@ -2770,6 +2787,29 @@ This fetches the contents of each archive specified in | |||
| 2770 | (setq package-menu--new-package-list nil) | 2787 | (setq package-menu--new-package-list nil) |
| 2771 | (package-refresh-contents package-menu-async)) | 2788 | (package-refresh-contents package-menu-async)) |
| 2772 | 2789 | ||
| 2790 | (defun package-menu-hide-package () | ||
| 2791 | "Hide a package under point. | ||
| 2792 | If optional arg BUTTON is non-nil, describe its associated package." | ||
| 2793 | (interactive) | ||
| 2794 | (declare (interactive-only "change `package-hidden-regexps' instead.")) | ||
| 2795 | (let* ((name (when (derived-mode-p 'package-menu-mode) | ||
| 2796 | (concat "\\`" (regexp-quote (symbol-name (package-desc-name | ||
| 2797 | (tabulated-list-get-id))))))) | ||
| 2798 | (re (read-string "Hide packages matching regexp: " name))) | ||
| 2799 | ;; Test if it is valid. | ||
| 2800 | (string-match re "") | ||
| 2801 | (push re package-hidden-regexps) | ||
| 2802 | (customize-save-variable 'package-hidden-regexps package-hidden-regexps) | ||
| 2803 | (package-menu--post-refresh) | ||
| 2804 | (let ((hidden | ||
| 2805 | (cl-remove-if-not (lambda (e) (string-match re (symbol-name (car e)))) | ||
| 2806 | package-archive-contents))) | ||
| 2807 | (message (substitute-command-keys | ||
| 2808 | (concat "Hiding %s packages, type `\\[package-menu-toggle-hiding]'" | ||
| 2809 | " to toggle or `\\[customize-variable] RET package-hidden-regexps'" | ||
| 2810 | " to customize it")) | ||
| 2811 | (length hidden))))) | ||
| 2812 | |||
| 2773 | (defun package-menu-describe-package (&optional button) | 2813 | (defun package-menu-describe-package (&optional button) |
| 2774 | "Describe the current package. | 2814 | "Describe the current package. |
| 2775 | If optional arg BUTTON is non-nil, describe its associated package." | 2815 | If optional arg BUTTON is non-nil, describe its associated package." |