aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Kangas2019-09-16 09:29:48 +0200
committerStefan Kangas2019-09-28 17:03:15 +0200
commita444bb78ad5d1a06f8d5b043e16941fdcc24de16 (patch)
tree41fd8183666479464bbe5d06c62a112fb132f804
parentdf05c26df3897108619237d359260ed9c91e3d78 (diff)
downloademacs-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/NEWS3
-rw-r--r--lisp/emacs-lisp/package.el29
2 files changed, 24 insertions, 8 deletions
diff --git a/etc/NEWS b/etc/NEWS
index 97b96d1e4e8..34b7a5aa29d 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -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)))) 3473This 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.
3482This 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))) 3514This 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.
3523This 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)) ""))) 3529This 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'.