aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/emacs-lisp/package.el48
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.
2606If the name of a package matches any of these regexps it is
2607omited from the package menu. To toggle this, type \\[package-menu-toggle-hiding].
2608
2609Values 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'.
2605PACKAGES should be nil or t, which means to display all known packages. 2615PACKAGES should be nil or t, which means to display all known packages.
2606KEYWORDS should be nil or a list of keywords." 2616KEYWORDS 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.
2792If 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.
2775If optional arg BUTTON is non-nil, describe its associated package." 2815If optional arg BUTTON is non-nil, describe its associated package."