=== modified file 'lisp/emacs-lisp/package.el' --- lisp/emacs-lisp/package.el 2011-04-24 20:32:23 +0000 +++ lisp/emacs-lisp/package.el 2011-07-31 13:24:22 +0000 @@ -1266,6 +1266,7 @@ (define-key map "r" 'package-menu-refresh) (define-key map "~" 'package-menu-mark-obsolete-for-deletion) (define-key map "x" 'package-menu-execute) + (define-key map "s" 'package-menu-toggle-sorting) (define-key map "h" 'package-menu-quick-help) (define-key map "?" 'package-menu-describe-package) (define-key map [menu-bar package-menu] (cons "Package" menu-map)) @@ -1326,7 +1327,7 @@ ("Status" 10 package-menu--status-predicate) ("Description" 0 nil)]) (setq tabulated-list-padding 2) - (setq tabulated-list-sort-key (cons "Status" nil)) + (setq tabulated-list-sort-key package-menu-default-sort-key) (tabulated-list-init-header)) (defmacro package--push (package desc status listname) @@ -1537,6 +1538,28 @@ (package-menu--generate t t) (message "No operations specified.")))) +(defconst package-menu-sort-keys '(("Status") ("Package")) + "List of possible keys to sort by.") + +(defcustom package-menu-default-sort-key '("Status") + "Default key to sort by." + :type `(choice (const :tag "Status" ("Status")) + (const :tag "Package" ("Package")))) + +(defun package-menu-toggle-sorting () + "Toggle between the different sorting methods. +See the variable `package-menu-sort-keys'." + (interactive) + (let* ((curr-pos + (position tabulated-list-sort-key + package-menu-sort-keys :test 'equal)) + (next-pos + (mod (1+ curr-pos) (length package-menu-sort-keys))) + (next-key + (nth next-pos package-menu-sort-keys))) + (setq tabulated-list-sort-key next-key) + (revert-buffer))) + (defun package-menu--version-predicate (A B) (let ((vA (or (aref (cadr A) 1) '(0))) (vB (or (aref (cadr B) 1) '(0))))