Add new filter command to Package Menu (Bug#39903)

* lisp/emacs-lisp/package.el
(package-menu-filter-marked): New filter command.
* test/lisp/emacs-lisp/package-tests.el
(package-test-list-filter-marked): New test.
(package-menu-mode-menu):
(package-menu-mode-map): Update menu to include new filter command.

* doc/emacs/package.texi (Package Menu): Document the new command.
* etc/NEWS: Announce the new command.
This commit is contained in:
Pieter van Oostrum 2020-03-05 20:20:04 +01:00 committed by Stefan Kangas
parent e59f697cd5
commit 196bc13b7b
4 changed files with 53 additions and 0 deletions

View file

@ -202,6 +202,12 @@ This prompts first for one of the qualifiers @samp{<}, @samp{>} or
@samp{=}, and then a package version, and shows packages that has a
lower, equal or higher version than the one specified.
@item / m
@kindex / m @r{(Package Menu)}
@findex package-menu-filter-marked
Filter package list by non-empty mark (@code{package-menu-filter-marked}).
This shows only the packages that have been marked to be installed or deleted.
@item / /
@kindex / / @r{(Package Menu)}
@findex package-menu-filter-clear

View file

@ -219,6 +219,7 @@ key binding
/ n package-menu-filter-by-name
/ s package-menu-filter-by-status
/ v package-menu-filter-by-version
/ m package-menu-filter-marked
/ / package-menu-filter-clear
** gdb-mi

View file

@ -2692,6 +2692,7 @@ either a full name or nil, and EMAIL is a valid email address."
(define-key map (kbd "/ n") 'package-menu-filter-by-name)
(define-key map (kbd "/ s") 'package-menu-filter-by-status)
(define-key map (kbd "/ v") 'package-menu-filter-by-version)
(define-key map (kbd "/ m") 'package-menu-filter-marked)
map)
"Local keymap for `package-menu-mode' buffers.")
@ -2722,6 +2723,7 @@ either a full name or nil, and EMAIL is a valid email address."
["Filter by Name" package-menu-filter-by-name :help "Filter packages by name"]
["Filter by Status" package-menu-filter-by-status :help "Filter packages by status"]
["Filter by Version" package-menu-filter-by-version :help "Filter packages by version"]
["Filter Marked" package-menu-filter-marked :help "Filter packages marked for upgrade"]
["Clear Filter" package-menu-clear-filter :help "Clear package list filter"])
["Hide by Regexp" package-menu-hide-package :help "Hide all packages matching a regexp"]
@ -3855,6 +3857,35 @@ If VERSION is nil or the empty string, show all packages."
(funcall fun (package-desc-version pkg-desc) ver)))
(format "versions:%s%s" predicate version)))))
(defun package-menu-filter-marked ()
"Filter \"*Packages*\" buffer by non-empty upgrade mark.
Unlike other filters, this leaves the marks intact."
(interactive)
(package--ensure-package-menu-mode)
(widen)
(let (found-entries mark pkg-id entry marks)
(save-excursion
(goto-char (point-min))
(while (not (eobp))
(setq mark (char-after))
(unless (eq mark ?\s)
(setq pkg-id (tabulated-list-get-id))
(setq entry (package-menu--print-info-simple pkg-id))
(push entry found-entries)
;; remember the mark
(push (cons pkg-id mark) marks))
(forward-line))
(if found-entries
(progn
(setq tabulated-list-entries found-entries)
(package-menu--display t nil)
;; redo the marks, but we must remember the marks!!
(goto-char (point-min))
(while (not (eobp))
(setq mark (cdr (assq (tabulated-list-get-id) marks)))
(tabulated-list-put-tag (char-to-string mark) t)))
(user-error "No packages found")))))
(defun package-menu-clear-filter ()
"Clear any filter currently applied to the \"*Packages*\" buffer."
(interactive)

View file

@ -413,6 +413,21 @@ Must called from within a `tar-mode' buffer."
;; No installed packages in default environment.
(should-error (package-menu-filter-by-status "installed"))))
(ert-deftest package-test-list-filter-marked ()
"Ensure package list is filtered correctly by non-empty mark."
(with-package-test ()
(let ((buf (package-list-packages)))
(revert-buffer)
(search-forward-regexp "^ +simple-single")
(package-menu-mark-install)
(package-menu-filter-marked)
(goto-char (point-min))
(should (re-search-forward "^I +simple-single" nil t))
(should (= (count-lines (point-min) (point-max)) 1))
(package-menu-mark-unmark)
;; No marked packages in default environment.
(should-error (package-menu-filter-marked)))))
(ert-deftest package-test-list-filter-by-version ()
(with-package-menu-test
(should-error (package-menu-filter-by-version "1.1" 'unknown-symbol))) )