diff options
| author | Pieter van Oostrum | 2020-03-05 20:20:04 +0100 |
|---|---|---|
| committer | Stefan Kangas | 2020-05-09 18:19:35 +0200 |
| commit | 196bc13b7bc5a29fa4d27e83d7cf0db4d99aa8b7 (patch) | |
| tree | 7ef40724ff11cf06a6c63c6be063a615ee274da8 | |
| parent | e59f697cd589e2b68bccb752787ad4a8c9da375d (diff) | |
| download | emacs-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.texi | 6 | ||||
| -rw-r--r-- | etc/NEWS | 1 | ||||
| -rw-r--r-- | lisp/emacs-lisp/package.el | 31 | ||||
| -rw-r--r-- | test/lisp/emacs-lisp/package-tests.el | 15 |
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 |
| 203 | lower, equal or higher version than the one specified. | 203 | lower, 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 | ||
| 208 | Filter package list by non-empty mark (@code{package-menu-filter-marked}). | ||
| 209 | This 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 |
| @@ -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. | ||
| 3862 | Unlike 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))) ) |