>From cb14b951949e26bea8c12b202b70754271d9f4e2 Mon Sep 17 00:00:00 2001 From: Federico Tedin Date: Sun, 8 Sep 2019 02:38:43 +0200 Subject: [PATCH 1/1] Search packages by name in list-packages (Bug#36981) * lisp/emacs-lisp/package.el (package-menu-search): Added a new function that allows filtering packages by name. (package-menu--generate): Show full packages list with 'q' if current list has been filtered. (package-menu-mode-map): Bind 's' to package-menu-search. * test/lisp/emacs-lisp/package-tests.el (package-test-list-search): Added a test for package-menu-search. --- lisp/emacs-lisp/package.el | 30 +++++++++++++++++++++++++-- test/lisp/emacs-lisp/package-tests.el | 11 +++++++++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index ef0c5171de..0993015fde 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -2621,6 +2621,7 @@ package-menu-mode-map (define-key map "U" 'package-menu-mark-upgrades) (define-key map "r" 'package-menu-refresh) (define-key map "f" 'package-menu-filter) + (define-key map "s" 'package-menu-search) (define-key map "~" 'package-menu-mark-obsolete-for-deletion) (define-key map "x" 'package-menu-execute) (define-key map "h" 'package-menu-quick-help) @@ -2652,7 +2653,8 @@ package-menu-mode-map ["Unmark" package-menu-mark-unmark :help "Clear any marks on a package and move to the next line"] "--" - ["Filter Package List" package-menu-filter :help "Filter package selection (q to go back)"] + ["Filter Packages by Keywords" package-menu-filter :help "Filter packages by keywords (q to go back)"] + ["Filter Packages by Name" package-menu-search :help "Filter packages by name (q to go back)"] ["Hide by Regexp" package-menu-hide-package :help "Permanently hide all packages matching a regexp"] ["Display Older Versions" package-menu-toggle-hiding :style toggle :selected (not package-menu--hide-packages) @@ -2963,7 +2965,7 @@ package-menu--generate (let ((filters (mapconcat #'identity keywords ","))) (concat "Package[" filters "]")) "Package")) - (if keywords + (if (or keywords (and packages (listp packages))) (define-key package-menu-mode-map "q" 'package-show-package-list) (define-key package-menu-mode-map "q" 'quit-window)) (tabulated-list-init-header) @@ -3598,6 +3600,30 @@ package-menu-filter (list keyword) keyword))) +(defun package-menu-search (name) + "Filter the *Packages* buffer. +Show only those items whose name matches NAME. If NAME is nil or an +empty string, show all packages. + +To restore the full package list, type `q'." + (interactive + (list (read-from-minibuffer "Package name: ") + current-prefix-arg)) + (if (or (not name) (string-empty-p name)) + (package-show-package-list t nil) + ;; Update `tabulated-list-entries' so that in contains all + ;; packages before searching. + (package-menu--refresh t nil) + (let (matched) + (dolist (entry tabulated-list-entries) + (let* ((pkg-name-sym (package-desc-name (car entry))) + (pkg-name (symbol-name pkg-name-sym))) + (when (string-match name pkg-name) + (push pkg-name-sym matched)))) + (if matched + (package-show-package-list matched nil) + (user-error "No packages found"))))) + (defun package-list-packages-no-fetch () "Display a list of packages. Does not fetch the updated list of packages before displaying. diff --git a/test/lisp/emacs-lisp/package-tests.el b/test/lisp/emacs-lisp/package-tests.el index c757bccf67..ea28db83ce 100644 --- a/test/lisp/emacs-lisp/package-tests.el +++ b/test/lisp/emacs-lisp/package-tests.el @@ -28,7 +28,7 @@ ;; Run this in a clean Emacs session using: ;; -;; $ emacs -Q --batch -L . -l package-test.el -l ert -f ert-run-tests-batch-and-exit +;; $ emacs -Q --batch -L . -l package-tests.el -l ert -f ert-run-tests-batch-and-exit ;;; Code: @@ -360,6 +360,15 @@ package-test--compatible-p (should-not (re-search-forward "^\\s-+simple-single\\s-+1.3\\s-+\\(available\\|new\\)" nil t)) (kill-buffer buf)))) +(ert-deftest package-test-list-search () + "Ensure package list is filtered correctly by package name." + (with-package-test () + (let ((buf (package-list-packages))) + (package-menu-search "tetris") + (should (= (length tabulated-list-entries) 1)) + (should (eq (package-desc-name (caar tabulated-list-entries)) 'tetris)) + (kill-buffer buf)))) + (ert-deftest package-test-update-archives () "Test updating package archives." (with-package-test () -- 2.17.1