diff options
| author | Stefan Kangas | 2019-09-16 09:29:48 +0200 |
|---|---|---|
| committer | Stefan Kangas | 2019-09-28 17:03:15 +0200 |
| commit | a444bb78ad5d1a06f8d5b043e16941fdcc24de16 (patch) | |
| tree | 41fd8183666479464bbe5d06c62a112fb132f804 | |
| parent | df05c26df3897108619237d359260ed9c91e3d78 (diff) | |
| download | emacs-a444bb78ad5d1a06f8d5b043e16941fdcc24de16.tar.gz emacs-a444bb78ad5d1a06f8d5b043e16941fdcc24de16.zip | |
Improve sorting in package list (Bug#37419)
* lisp/emacs-lisp/package.el (package-menu-mode): Allow sorting by
version or description.
(package-menu--version-predicate): Fix sorting by version.
(package-menu--description-predicate): Fix sorting by description.
(package-menu--archive-predicate): Fall back to sorting by name if
archive is the same.
(package-menu--name-predicate, package-menu--status-predicate): Add
doc string.
* etc/NEWS: Announce the above changes.
| -rw-r--r-- | etc/NEWS | 3 | ||||
| -rw-r--r-- | lisp/emacs-lisp/package.el | 29 |
2 files changed, 24 insertions, 8 deletions
| @@ -983,6 +983,9 @@ early init file. | |||
| 983 | --- | 983 | --- |
| 984 | *** Imenu support has been added to 'package-menu-mode'. | 984 | *** Imenu support has been added to 'package-menu-mode'. |
| 985 | 985 | ||
| 986 | --- | ||
| 987 | *** The package list can now be sorted by version or description. | ||
| 988 | |||
| 986 | ** Info | 989 | ** Info |
| 987 | 990 | ||
| 988 | +++ | 991 | +++ |
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index a8362cb2050..ab1fb8b90fc 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el | |||
| @@ -2725,11 +2725,11 @@ Letters do not insert themselves; instead, they are commands. | |||
| 2725 | package-menu--transaction-status))) | 2725 | package-menu--transaction-status))) |
| 2726 | (setq tabulated-list-format | 2726 | (setq tabulated-list-format |
| 2727 | `[("Package" 18 package-menu--name-predicate) | 2727 | `[("Package" 18 package-menu--name-predicate) |
| 2728 | ("Version" 13 nil) | 2728 | ("Version" 13 package-menu--version-predicate) |
| 2729 | ("Status" 10 package-menu--status-predicate) | 2729 | ("Status" 10 package-menu--status-predicate) |
| 2730 | ,@(if (cdr package-archives) | 2730 | ,@(if (cdr package-archives) |
| 2731 | '(("Archive" 10 package-menu--archive-predicate))) | 2731 | '(("Archive" 10 package-menu--archive-predicate))) |
| 2732 | ("Description" 0 nil)]) | 2732 | ("Description" 0 package-menu--description-predicate)]) |
| 2733 | (setq tabulated-list-padding 2) | 2733 | (setq tabulated-list-padding 2) |
| 2734 | (setq tabulated-list-sort-key (cons "Status" nil)) | 2734 | (setq tabulated-list-sort-key (cons "Status" nil)) |
| 2735 | (add-hook 'tabulated-list-revert-hook #'package-menu--refresh nil t) | 2735 | (add-hook 'tabulated-list-revert-hook #'package-menu--refresh nil t) |
| @@ -3469,13 +3469,17 @@ Optional argument NOQUERY non-nil means do not ask the user to confirm." | |||
| 3469 | (message "Operation %s finished" message-template)))))))) | 3469 | (message "Operation %s finished" message-template)))))))) |
| 3470 | 3470 | ||
| 3471 | (defun package-menu--version-predicate (A B) | 3471 | (defun package-menu--version-predicate (A B) |
| 3472 | (let ((vA (or (aref (cadr A) 1) '(0))) | 3472 | "Predicate to sort \"*Packages*\" buffer by the version column. |
| 3473 | (vB (or (aref (cadr B) 1) '(0)))) | 3473 | This is used for `tabulated-list-format' in `package-menu-mode'." |
| 3474 | (let ((vA (or (version-to-list (aref (cadr A) 1)) '(0))) | ||
| 3475 | (vB (or (version-to-list (aref (cadr B) 1)) '(0)))) | ||
| 3474 | (if (version-list-= vA vB) | 3476 | (if (version-list-= vA vB) |
| 3475 | (package-menu--name-predicate A B) | 3477 | (package-menu--name-predicate A B) |
| 3476 | (version-list-< vA vB)))) | 3478 | (version-list-< vA vB)))) |
| 3477 | 3479 | ||
| 3478 | (defun package-menu--status-predicate (A B) | 3480 | (defun package-menu--status-predicate (A B) |
| 3481 | "Predicate to sort \"*Packages*\" buffer by the status column. | ||
| 3482 | This is used for `tabulated-list-format' in `package-menu-mode'." | ||
| 3479 | (let ((sA (aref (cadr A) 2)) | 3483 | (let ((sA (aref (cadr A) 2)) |
| 3480 | (sB (aref (cadr B) 2))) | 3484 | (sB (aref (cadr B) 2))) |
| 3481 | (cond ((string= sA sB) | 3485 | (cond ((string= sA sB) |
| @@ -3506,19 +3510,28 @@ Optional argument NOQUERY non-nil means do not ask the user to confirm." | |||
| 3506 | (t (string< sA sB))))) | 3510 | (t (string< sA sB))))) |
| 3507 | 3511 | ||
| 3508 | (defun package-menu--description-predicate (A B) | 3512 | (defun package-menu--description-predicate (A B) |
| 3509 | (let ((dA (aref (cadr A) 3)) | 3513 | "Predicate to sort \"*Packages*\" buffer by the description column. |
| 3510 | (dB (aref (cadr B) 3))) | 3514 | This is used for `tabulated-list-format' in `package-menu-mode'." |
| 3515 | (let ((dA (aref (cadr A) (if (cdr package-archives) 4 3))) | ||
| 3516 | (dB (aref (cadr B) (if (cdr package-archives) 4 3)))) | ||
| 3511 | (if (string= dA dB) | 3517 | (if (string= dA dB) |
| 3512 | (package-menu--name-predicate A B) | 3518 | (package-menu--name-predicate A B) |
| 3513 | (string< dA dB)))) | 3519 | (string< dA dB)))) |
| 3514 | 3520 | ||
| 3515 | (defun package-menu--name-predicate (A B) | 3521 | (defun package-menu--name-predicate (A B) |
| 3522 | "Predicate to sort \"*Packages*\" buffer by the name column. | ||
| 3523 | This is used for `tabulated-list-format' in `package-menu-mode'." | ||
| 3516 | (string< (symbol-name (package-desc-name (car A))) | 3524 | (string< (symbol-name (package-desc-name (car A))) |
| 3517 | (symbol-name (package-desc-name (car B))))) | 3525 | (symbol-name (package-desc-name (car B))))) |
| 3518 | 3526 | ||
| 3519 | (defun package-menu--archive-predicate (A B) | 3527 | (defun package-menu--archive-predicate (A B) |
| 3520 | (string< (or (package-desc-archive (car A)) "") | 3528 | "Predicate to sort \"*Packages*\" buffer by the archive column. |
| 3521 | (or (package-desc-archive (car B)) ""))) | 3529 | This is used for `tabulated-list-format' in `package-menu-mode'." |
| 3530 | (let ((a (or (package-desc-archive (car A)) "")) | ||
| 3531 | (b (or (package-desc-archive (car B)) ""))) | ||
| 3532 | (if (string= a b) | ||
| 3533 | (package-menu--name-predicate A B) | ||
| 3534 | (string< a b)))) | ||
| 3522 | 3535 | ||
| 3523 | (defun package-menu--populate-new-package-list () | 3536 | (defun package-menu--populate-new-package-list () |
| 3524 | "Decide which packages are new in `package-archives-contents'. | 3537 | "Decide which packages are new in `package-archives-contents'. |