aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPieter van Oostrum2020-03-05 20:20:04 +0100
committerStefan Kangas2020-05-09 18:19:35 +0200
commit196bc13b7bc5a29fa4d27e83d7cf0db4d99aa8b7 (patch)
tree7ef40724ff11cf06a6c63c6be063a615ee274da8
parente59f697cd589e2b68bccb752787ad4a8c9da375d (diff)
downloademacs-196bc13b7bc5a29fa4d27e83d7cf0db4d99aa8b7.tar.gz
emacs-196bc13b7bc5a29fa4d27e83d7cf0db4d99aa8b7.zip
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.
-rw-r--r--doc/emacs/package.texi6
-rw-r--r--etc/NEWS1
-rw-r--r--lisp/emacs-lisp/package.el31
-rw-r--r--test/lisp/emacs-lisp/package-tests.el15
4 files changed, 53 insertions, 0 deletions
diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi
index db3cf317ff1..91e44b8eba8 100644
--- a/doc/emacs/package.texi
+++ b/doc/emacs/package.texi
@@ -202,6 +202,12 @@ This prompts first for one of the qualifiers @samp{<}, @samp{>} or
202@samp{=}, and then a package version, and shows packages that has a 202@samp{=}, and then a package version, and shows packages that has a
203lower, equal or higher version than the one specified. 203lower, equal or higher version than the one specified.
204 204
205@item / m
206@kindex / m @r{(Package Menu)}
207@findex package-menu-filter-marked
208Filter package list by non-empty mark (@code{package-menu-filter-marked}).
209This shows only the packages that have been marked to be installed or deleted.
210
205@item / / 211@item / /
206@kindex / / @r{(Package Menu)} 212@kindex / / @r{(Package Menu)}
207@findex package-menu-filter-clear 213@findex package-menu-filter-clear
diff --git a/etc/NEWS b/etc/NEWS
index 12406eea822..ae676a9bf83 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -219,6 +219,7 @@ key binding
219/ n package-menu-filter-by-name 219/ n package-menu-filter-by-name
220/ s package-menu-filter-by-status 220/ s package-menu-filter-by-status
221/ v package-menu-filter-by-version 221/ v package-menu-filter-by-version
222/ m package-menu-filter-marked
222/ / package-menu-filter-clear 223/ / package-menu-filter-clear
223 224
224** gdb-mi 225** gdb-mi
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 4312ab9ca9a..ecf833b5473 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -2692,6 +2692,7 @@ either a full name or nil, and EMAIL is a valid email address."
2692 (define-key map (kbd "/ n") 'package-menu-filter-by-name) 2692 (define-key map (kbd "/ n") 'package-menu-filter-by-name)
2693 (define-key map (kbd "/ s") 'package-menu-filter-by-status) 2693 (define-key map (kbd "/ s") 'package-menu-filter-by-status)
2694 (define-key map (kbd "/ v") 'package-menu-filter-by-version) 2694 (define-key map (kbd "/ v") 'package-menu-filter-by-version)
2695 (define-key map (kbd "/ m") 'package-menu-filter-marked)
2695 map) 2696 map)
2696 "Local keymap for `package-menu-mode' buffers.") 2697 "Local keymap for `package-menu-mode' buffers.")
2697 2698
@@ -2722,6 +2723,7 @@ either a full name or nil, and EMAIL is a valid email address."
2722 ["Filter by Name" package-menu-filter-by-name :help "Filter packages by name"] 2723 ["Filter by Name" package-menu-filter-by-name :help "Filter packages by name"]
2723 ["Filter by Status" package-menu-filter-by-status :help "Filter packages by status"] 2724 ["Filter by Status" package-menu-filter-by-status :help "Filter packages by status"]
2724 ["Filter by Version" package-menu-filter-by-version :help "Filter packages by version"] 2725 ["Filter by Version" package-menu-filter-by-version :help "Filter packages by version"]
2726 ["Filter Marked" package-menu-filter-marked :help "Filter packages marked for upgrade"]
2725 ["Clear Filter" package-menu-clear-filter :help "Clear package list filter"]) 2727 ["Clear Filter" package-menu-clear-filter :help "Clear package list filter"])
2726 2728
2727 ["Hide by Regexp" package-menu-hide-package :help "Hide all packages matching a regexp"] 2729 ["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."
3855 (funcall fun (package-desc-version pkg-desc) ver))) 3857 (funcall fun (package-desc-version pkg-desc) ver)))
3856 (format "versions:%s%s" predicate version))))) 3858 (format "versions:%s%s" predicate version)))))
3857 3859
3860(defun package-menu-filter-marked ()
3861 "Filter \"*Packages*\" buffer by non-empty upgrade mark.
3862Unlike other filters, this leaves the marks intact."
3863 (interactive)
3864 (package--ensure-package-menu-mode)
3865 (widen)
3866 (let (found-entries mark pkg-id entry marks)
3867 (save-excursion
3868 (goto-char (point-min))
3869 (while (not (eobp))
3870 (setq mark (char-after))
3871 (unless (eq mark ?\s)
3872 (setq pkg-id (tabulated-list-get-id))
3873 (setq entry (package-menu--print-info-simple pkg-id))
3874 (push entry found-entries)
3875 ;; remember the mark
3876 (push (cons pkg-id mark) marks))
3877 (forward-line))
3878 (if found-entries
3879 (progn
3880 (setq tabulated-list-entries found-entries)
3881 (package-menu--display t nil)
3882 ;; redo the marks, but we must remember the marks!!
3883 (goto-char (point-min))
3884 (while (not (eobp))
3885 (setq mark (cdr (assq (tabulated-list-get-id) marks)))
3886 (tabulated-list-put-tag (char-to-string mark) t)))
3887 (user-error "No packages found")))))
3888
3858(defun package-menu-clear-filter () 3889(defun package-menu-clear-filter ()
3859 "Clear any filter currently applied to the \"*Packages*\" buffer." 3890 "Clear any filter currently applied to the \"*Packages*\" buffer."
3860 (interactive) 3891 (interactive)
diff --git a/test/lisp/emacs-lisp/package-tests.el b/test/lisp/emacs-lisp/package-tests.el
index c0ed82c474a..732bf5e061f 100644
--- a/test/lisp/emacs-lisp/package-tests.el
+++ b/test/lisp/emacs-lisp/package-tests.el
@@ -413,6 +413,21 @@ Must called from within a `tar-mode' buffer."
413 ;; No installed packages in default environment. 413 ;; No installed packages in default environment.
414 (should-error (package-menu-filter-by-status "installed")))) 414 (should-error (package-menu-filter-by-status "installed"))))
415 415
416(ert-deftest package-test-list-filter-marked ()
417 "Ensure package list is filtered correctly by non-empty mark."
418 (with-package-test ()
419 (let ((buf (package-list-packages)))
420 (revert-buffer)
421 (search-forward-regexp "^ +simple-single")
422 (package-menu-mark-install)
423 (package-menu-filter-marked)
424 (goto-char (point-min))
425 (should (re-search-forward "^I +simple-single" nil t))
426 (should (= (count-lines (point-min) (point-max)) 1))
427 (package-menu-mark-unmark)
428 ;; No marked packages in default environment.
429 (should-error (package-menu-filter-marked)))))
430
416(ert-deftest package-test-list-filter-by-version () 431(ert-deftest package-test-list-filter-by-version ()
417 (with-package-menu-test 432 (with-package-menu-test
418 (should-error (package-menu-filter-by-version "1.1" 'unknown-symbol))) ) 433 (should-error (package-menu-filter-by-version "1.1" 'unknown-symbol))) )