Make Package Menu a child of Tabulated List mode.

* emacs-lisp/package.el: Use Tabulated List mode.
(package-menu-mode-map): Inherit from tabulated-list-mode-map.
(package-menu-mode): Derive from tabulated-list-mode.  Set up the
table format using Tabulated List mode variables.
(package--push): New macro, replacing package-list-maybe-add.
(package-menu--generate): Use package--push.  Renamed from
package--generate-package-list.
(package-menu-refresh, list-packages): Use it.
(package-menu--print-info): Renamed from package-print-package.
Return insertion data instead of inserting it directly.
(package-menu-describe-package, package-menu-execute): Use
tabulated-list-get-id.
(package-menu-mark-delete, package-menu-mark-install)
(package-menu-mark-unmark, package-menu-backup-unmark)
(package-menu-mark-obsolete-for-deletion): Use
tabulated-list-put-tag.
(package--list-packages, package-menu-revert)
(package-menu-get-package, package-menu-get-version)
(package-menu-sort-by-column): Functions deleted.
(package-menu-package-list, package-menu-sort-key): Vars deleted.
(package-menu--status-predicate, package-menu--version-predicate)
(package-menu--name-predicate)
(package-menu--description-predicate): Handle arguments in the
Tabulated List format.
(package-list-packages-no-fetch): Call list-packages.
This commit is contained in:
Chong Yidong 2011-04-06 16:33:30 -04:00
parent a83ec3c99a
commit e91a96fefd
2 changed files with 187 additions and 293 deletions

View file

@ -2,6 +2,32 @@
* emacs-lisp/tabulated-list.el: New file. * emacs-lisp/tabulated-list.el: New file.
* emacs-lisp/package.el: Use Tabulated List mode.
(package-menu-mode-map): Inherit from tabulated-list-mode-map.
(package-menu-mode): Derive from tabulated-list-mode. Set up the
table format using Tabulated List mode variables.
(package--push): New macro, replacing package-list-maybe-add.
(package-menu--generate): Use package--push. Renamed from
package--generate-package-list.
(package-menu-refresh, list-packages): Use it.
(package-menu--print-info): Renamed from package-print-package.
Return insertion data instead of inserting it directly.
(package-menu-describe-package, package-menu-execute): Use
tabulated-list-get-id.
(package-menu-mark-delete, package-menu-mark-install)
(package-menu-mark-unmark, package-menu-backup-unmark)
(package-menu-mark-obsolete-for-deletion): Use
tabulated-list-put-tag.
(package--list-packages, package-menu-revert)
(package-menu-get-package, package-menu-get-version)
(package-menu-sort-by-column): Functions deleted.
(package-menu-package-list, package-menu-sort-key): Vars deleted.
(package-menu--status-predicate, package-menu--version-predicate)
(package-menu--name-predicate)
(package-menu--description-predicate): Handle arguments in the
Tabulated List format.
(package-list-packages-no-fetch): Call list-packages.
2011-04-06 Juanma Barranquero <lekktu@gmail.com> 2011-04-06 Juanma Barranquero <lekktu@gmail.com>
* files.el (after-find-file-from-revert-buffer): Remove variable. * files.el (after-find-file-from-revert-buffer): Remove variable.

View file

@ -173,6 +173,8 @@
;;; Code: ;;; Code:
(require 'tabulated-list)
(defgroup package nil (defgroup package nil
"Manager for Emacs Lisp packages." "Manager for Emacs Lisp packages."
:group 'applications :group 'applications
@ -1249,12 +1251,10 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages."
;;;; Package menu mode. ;;;; Package menu mode.
(defvar package-menu-mode-map (defvar package-menu-mode-map
(let ((map (copy-keymap special-mode-map)) (let ((map (make-sparse-keymap))
(menu-map (make-sparse-keymap "Package"))) (menu-map (make-sparse-keymap "Package")))
(set-keymap-parent map button-buffer-map) (set-keymap-parent map tabulated-list-mode-map)
(define-key map "\C-m" 'package-menu-describe-package) (define-key map "\C-m" 'package-menu-describe-package)
(define-key map "n" 'next-line)
(define-key map "p" 'previous-line)
(define-key map "u" 'package-menu-mark-unmark) (define-key map "u" 'package-menu-mark-unmark)
(define-key map "\177" 'package-menu-backup-unmark) (define-key map "\177" 'package-menu-backup-unmark)
(define-key map "d" 'package-menu-mark-delete) (define-key map "d" 'package-menu-mark-delete)
@ -1264,8 +1264,6 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages."
(define-key map "x" 'package-menu-execute) (define-key map "x" 'package-menu-execute)
(define-key map "h" 'package-menu-quick-help) (define-key map "h" 'package-menu-quick-help)
(define-key map "?" 'package-menu-describe-package) (define-key map "?" 'package-menu-describe-package)
(define-key map [follow-link] 'mouse-face)
(define-key map [mouse-2] 'mouse-select-window)
(define-key map [menu-bar package-menu] (cons "Package" menu-map)) (define-key map [menu-bar package-menu] (cons "Package" menu-map))
(define-key menu-map [mq] (define-key menu-map [mq]
'(menu-item "Quit" quit-window '(menu-item "Quit" quit-window
@ -1314,49 +1312,93 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages."
map) map)
"Local keymap for `package-menu-mode' buffers.") "Local keymap for `package-menu-mode' buffers.")
(defvar package-menu-sort-button-map (define-derived-mode package-menu-mode tabulated-list-mode "Package Menu"
(let ((map (make-sparse-keymap)))
(define-key map [header-line mouse-1] 'package-menu-sort-by-column)
(define-key map [header-line mouse-2] 'package-menu-sort-by-column)
(define-key map [follow-link] 'mouse-face)
map)
"Local keymap for package menu sort buttons.")
(put 'package-menu-mode 'mode-class 'special)
(define-derived-mode package-menu-mode special-mode "Package Menu"
"Major mode for browsing a list of packages. "Major mode for browsing a list of packages.
Letters do not insert themselves; instead, they are commands. Letters do not insert themselves; instead, they are commands.
\\<package-menu-mode-map> \\<package-menu-mode-map>
\\{package-menu-mode-map}" \\{package-menu-mode-map}"
(setq truncate-lines t) (setq tabulated-list-format [("Package" 18 package-menu--name-predicate)
(setq buffer-read-only t) ("Version" 12 nil)
(set (make-local-variable 'revert-buffer-function) 'package-menu-revert) ("Status" 10 package-menu--status-predicate)
(setq header-line-format ("Description" 0 nil)])
(mapconcat (setq tabulated-list-padding 2)
(lambda (pair) (setq tabulated-list-sort-key (cons "Status" nil))
(let ((column (car pair)) (tabulated-list-init-header))
(name (cdr pair)))
(concat (defmacro package--push (package desc status listname)
;; Insert a space that aligns the button properly. "Convenience macro for `package-menu--generate'.
(propertize " " 'display (list 'space :align-to column) If the alist stored in the symbol LISTNAME lacks an entry for a
'face 'fixed-pitch) package PACKAGE with descriptor DESC, add one. The alist is
;; Set up the column button. keyed with cons cells (PACKAGE . VERSION), where PACKAGE is a
(propertize name symbol and VERSION is a version list."
'column-name name `(let* ((version (package-desc-vers ,desc))
'help-echo "mouse-1: sort by column" (key (cons ,package version)))
'mouse-face 'highlight (unless (assoc key ,listname)
'keymap package-menu-sort-button-map)))) (push (list key ,status (package-desc-doc ,desc)) ,listname))))
;; We take a trick from buff-menu and have a dummy leading
;; space to align the header line with the beginning of the (defun package-menu--generate (&optional remember-pos)
;; text. This doesn't really work properly on Emacs 21, but "Populate the Package Menu.
;; it is close enough. Optional argument REMEMBER-POS, if non-nil, means to move point
'((0 . "") to the entry as before."
(2 . "Package") ;; Construct list of ((PACKAGE . VERSION) STATUS DESCRIPTION).
(20 . "Version") (let (info-list name builtin)
(32 . "Status") ;; Installed packages:
(43 . "Description")) (dolist (elt package-alist)
""))) (setq name (car elt))
(package--push name (cdr elt)
(if (stringp (cadr (assq name package-load-list)))
"held" "installed")
info-list))
;; Built-in packages:
(dolist (elt package--builtins)
(setq name (car elt))
(unless (eq name 'emacs) ; Hide the `emacs' package.
(package--push name (cdr elt) "built-in" info-list)))
;; Available and disabled packages:
(dolist (elt package-archive-contents)
(setq name (car elt))
(let ((hold (assq name package-load-list)))
(package--push name (cdr elt)
(if (and hold (null (cadr hold))) "disabled" "available")
info-list)))
;; Obsolete packages:
(dolist (elt package-obsolete-alist)
(dolist (inner-elt (cdr elt))
(package--push (car elt) (cdr inner-elt) "obsolete" info-list)))
;; Print the result.
(setq tabulated-list-entries (mapcar 'package-menu--print-info info-list))
(tabulated-list-print remember-pos)))
(defun package-menu--print-info (pkg)
"Return a package entry suitable for `tabulated-list-entries'.
PKG has the form ((PACKAGE . VERSION) STATUS DOC).
Return (KEY [NAME VERSION STATUS DOC]), where KEY is the
identifier (NAME . VERSION-LIST)."
(let* ((package (caar pkg))
(version (cdr (car pkg)))
(status (nth 1 pkg))
(doc (or (nth 2 pkg) ""))
(face (cond
((string= status "built-in") 'font-lock-builtin-face)
((string= status "available") 'default)
((string= status "held") 'font-lock-constant-face)
((string= status "disabled") 'font-lock-warning-face)
((string= status "installed") 'font-lock-comment-face)
(t 'font-lock-warning-face)))) ; obsolete.
(list (cons package version)
(vector (list (symbol-name package)
'face 'link
'follow-link t
'package-symbol package
'action 'package-menu-describe-package)
(propertize (package-version-join version)
'font-lock-face face)
(propertize status 'font-lock-face face)
(propertize doc 'font-lock-face face)))))
(defun package-menu-refresh () (defun package-menu-refresh ()
"Download the Emacs Lisp package archive. "Download the Emacs Lisp package archive.
@ -1366,59 +1408,42 @@ This fetches the contents of each archive specified in
(unless (eq major-mode 'package-menu-mode) (unless (eq major-mode 'package-menu-mode)
(error "The current buffer is not a Package Menu")) (error "The current buffer is not a Package Menu"))
(package-refresh-contents) (package-refresh-contents)
(package--generate-package-list)) (package-menu--generate t))
(defun package-menu-revert (&optional arg noconfirm) (defun package-menu-describe-package (&optional button)
"Update the list of packages. "Describe the current package.
This function is the `revert-buffer-function' for Package Menu If optional arg BUTTON is non-nil, describe its associated package."
buffers. The arguments are ignored."
(interactive) (interactive)
(unless (eq major-mode 'package-menu-mode) (let ((package (if button (button-get button 'package-symbol)
(error "The current buffer is not a Package Menu")) (car (tabulated-list-get-id)))))
(package--generate-package-list)) (if package
(describe-package package))))
(defun package-menu-describe-package ()
"Describe the package in the current line."
(interactive)
(let ((name (package-menu-get-package)))
(if name
(describe-package (intern name))
(message "No package on this line"))))
(defun package-menu-mark-internal (what)
(unless (eobp)
(let ((buffer-read-only nil))
(beginning-of-line)
(delete-char 1)
(insert what)
(forward-line))))
;; fixme numeric argument ;; fixme numeric argument
(defun package-menu-mark-delete (num) (defun package-menu-mark-delete (num)
"Mark a package for deletion and move to the next line." "Mark a package for deletion and move to the next line."
(interactive "p") (interactive "p")
(if (string-equal (package-menu-get-status) "installed") (if (string-equal (package-menu-get-status) "installed")
(package-menu-mark-internal "D") (tabulated-list-put-tag "D" t)
(forward-line))) (forward-line)))
(defun package-menu-mark-install (num) (defun package-menu-mark-install (num)
"Mark a package for installation and move to the next line." "Mark a package for installation and move to the next line."
(interactive "p") (interactive "p")
(if (string-equal (package-menu-get-status) "available") (if (string-equal (package-menu-get-status) "available")
(package-menu-mark-internal "I") (tabulated-list-put-tag "I" t)
(forward-line))) (forward-line)))
(defun package-menu-mark-unmark (num) (defun package-menu-mark-unmark (num)
"Clear any marks on a package and move to the next line." "Clear any marks on a package and move to the next line."
(interactive "p") (interactive "p")
(package-menu-mark-internal " ")) (tabulated-list-put-tag " " t))
(defun package-menu-backup-unmark () (defun package-menu-backup-unmark ()
"Back up one line and clear any marks on that package." "Back up one line and clear any marks on that package."
(interactive) (interactive)
(forward-line -1) (forward-line -1)
(package-menu-mark-internal " ") (tabulated-list-put-tag " "))
(forward-line -1))
(defun package-menu-mark-obsolete-for-deletion () (defun package-menu-mark-obsolete-for-deletion ()
"Mark all obsolete packages for deletion." "Mark all obsolete packages for deletion."
@ -1428,7 +1453,7 @@ buffers. The arguments are ignored."
(forward-line 2) (forward-line 2)
(while (not (eobp)) (while (not (eobp))
(if (looking-at ".*\\s obsolete\\s ") (if (looking-at ".*\\s obsolete\\s ")
(package-menu-mark-internal "D") (tabulated-list-put-tag "D" t)
(forward-line 1))))) (forward-line 1)))))
(defun package-menu-quick-help () (defun package-menu-quick-help ()
@ -1439,20 +1464,6 @@ buffers. The arguments are ignored."
(define-obsolete-function-alias (define-obsolete-function-alias
'package-menu-view-commentary 'package-menu-describe-package "24.1") 'package-menu-view-commentary 'package-menu-describe-package "24.1")
;; Return the name of the package on the current line.
(defun package-menu-get-package ()
(save-excursion
(beginning-of-line)
(if (looking-at ". \\([^ \t]*\\)")
(match-string-no-properties 1))))
;; Return the version of the package on the current line.
(defun package-menu-get-version ()
(save-excursion
(beginning-of-line)
(if (looking-at ". [^ \t]*[ \t]*\\([0-9.]*\\)")
(match-string 1))))
(defun package-menu-get-status () (defun package-menu-get-status ()
(save-excursion (save-excursion
(if (looking-at ". [^ \t]*[ \t]*[^ \t]*[ \t]*\\([^ \t]*\\)") (if (looking-at ". [^ \t]*[ \t]*[^ \t]*[ \t]*\\([^ \t]*\\)")
@ -1464,19 +1475,22 @@ buffers. The arguments are ignored."
Packages marked for installation are downloaded and installed; Packages marked for installation are downloaded and installed;
packages marked for deletion are removed." packages marked for deletion are removed."
(interactive) (interactive)
(let (install-list delete-list cmd) (unless (eq major-mode 'package-menu-mode)
(error "The current buffer is not in Package Menu mode"))
(let (install-list delete-list cmd id)
(save-excursion (save-excursion
(goto-char (point-min)) (goto-char (point-min))
(while (not (eobp)) (while (not (eobp))
(setq cmd (char-after)) (setq cmd (char-after))
(cond (unless (eq cmd ?\s)
((eq cmd ?\s) t) ;; This is the key (PACKAGE . VERSION-LIST).
((eq cmd ?D) (setq id (tabulated-list-get-id))
(push (cons (package-menu-get-package) (cond ((eq cmd ?D)
(package-menu-get-version)) (push (cons (symbol-name (car id))
(package-version-join (cdr id)))
delete-list)) delete-list))
((eq cmd ?I) ((eq cmd ?I)
(push (package-menu-get-package) install-list))) (push (car id) install-list))))
(forward-line))) (forward-line)))
;; Delete packages, prompting if necessary. ;; Delete packages, prompting if necessary.
(when delete-list (when delete-list
@ -1502,217 +1516,71 @@ packages marked for deletion are removed."
(format "Install package `%s'? " (car install-list)) (format "Install package `%s'? " (car install-list))
(format "Install these %d packages (%s)? " (format "Install these %d packages (%s)? "
(length install-list) (length install-list)
(mapconcat 'identity install-list ", ")))) (mapconcat 'symbol-name install-list ", "))))
(dolist (elt install-list) (mapc 'package-install install-list)))
(package-install (intern elt)))))
;; If we deleted anything, regenerate `package-alist'. This is done ;; If we deleted anything, regenerate `package-alist'. This is done
;; automatically if we installed a package. ;; automatically if we installed a package.
(and delete-list (null install-list) (and delete-list (null install-list)
(package-initialize)) (package-initialize))
(if (or delete-list install-list) (if (or delete-list install-list)
(package-menu-revert) (package-menu--generate t)
(message "No operations specified.")))) (message "No operations specified."))))
(defun package-print-package (package version key desc) (defun package-menu--version-predicate (A B)
(let ((face (let ((vA (or (aref (cadr A) 1) '(0)))
(cond ((string= key "built-in") 'font-lock-builtin-face) (vB (or (aref (cadr B) 1) '(0))))
((string= key "available") 'default) (if (version-list-= vA vB)
((string= key "held") 'font-lock-constant-face) (package-menu--name-predicate A B)
((string= key "disabled") 'font-lock-warning-face) (version-list-< vA vB))))
((string= key "installed") 'font-lock-comment-face)
(t ; obsolete, but also the default.
'font-lock-warning-face))))
(insert (propertize " " 'font-lock-face face))
(insert-text-button (symbol-name package)
'face 'link
'follow-link t
'package-symbol package
'action (lambda (button)
(describe-package
(button-get button 'package-symbol))))
(indent-to 20 1)
(insert (propertize (package-version-join version) 'font-lock-face face))
(indent-to 32 1)
(insert (propertize key 'font-lock-face face))
;; FIXME: this 'when' is bogus...
(when desc
(indent-to 43 1)
(let ((opoint (point)))
(insert (propertize desc 'font-lock-face face))
(upcase-region opoint (min (point) (1+ opoint)))))
(insert "\n")))
(defun package-list-maybe-add (package version status description result) (defun package-menu--status-predicate (A B)
(unless (assoc (cons package version) result) (let ((sA (aref (cadr A) 2))
(push (list (cons package version) status description) result)) (sB (aref (cadr B) 2)))
result) (cond ((string= sA sB)
(package-menu--name-predicate A B))
((string= sA "available") t)
((string= sB "available") nil)
((string= sA "installed") t)
((string= sB "installed") nil)
((string= sA "held") t)
((string= sB "held") nil)
((string= sA "built-in") t)
((string= sB "built-in") nil)
((string= sA "obsolete") t)
((string= sB "obsolete") nil)
(t (string< sA sB)))))
(defvar package-menu-package-list nil (defun package-menu--description-predicate (A B)
"List of packages to display in the Package Menu buffer. (let ((dA (aref (cadr A) 3))
A value of nil means to display all packages.") (dB (aref (cadr B) 3)))
(if (string= dA dB)
(package-menu--name-predicate A B)
(string< dA dB))))
(defvar package-menu-sort-key nil (defun package-menu--name-predicate (A B)
"Sort key for the current Package Menu buffer.") (string< (symbol-name (caar A))
(symbol-name (caar B))))
(defun package--generate-package-list ()
"Populate the current Package Menu buffer."
(let ((inhibit-read-only t)
info-list name desc hold builtin)
(erase-buffer)
;; List installed packages
(dolist (elt package-alist)
(setq name (car elt))
(when (or (null package-menu-package-list)
(memq name package-menu-package-list))
(setq desc (cdr elt)
hold (cadr (assq name package-load-list)))
(setq info-list
(package-list-maybe-add
name (package-desc-vers desc)
;; FIXME: it turns out to be tricky to see if this
;; package is presently activated.
(if (stringp hold) "held" "installed")
(package-desc-doc desc)
info-list))))
;; List built-in packages
(dolist (elt package--builtins)
(setq name (car elt))
(when (and (not (eq name 'emacs)) ; Hide the `emacs' package.
(or (null package-menu-package-list)
(memq name package-menu-package-list)))
(setq desc (cdr elt))
(setq info-list
(package-list-maybe-add
name (package-desc-vers desc)
"built-in"
(package-desc-doc desc)
info-list))))
;; List available and disabled packages
(dolist (elt package-archive-contents)
(setq name (car elt)
desc (cdr elt)
hold (assq name package-load-list))
(when (or (null package-menu-package-list)
(memq name package-menu-package-list))
(setq info-list
(package-list-maybe-add name
(package-desc-vers desc)
(if (and hold (null (cadr hold)))
"disabled"
"available")
(package-desc-doc (cdr elt))
info-list))))
;; List obsolete packages
(mapc (lambda (elt)
(mapc (lambda (inner-elt)
(setq info-list
(package-list-maybe-add (car elt)
(package-desc-vers
(cdr inner-elt))
"obsolete"
(package-desc-doc
(cdr inner-elt))
info-list)))
(cdr elt)))
package-obsolete-alist)
(setq info-list
(sort info-list
(cond ((string= package-menu-sort-key "Package")
'package-menu--name-predicate)
((string= package-menu-sort-key "Version")
'package-menu--version-predicate)
((string= package-menu-sort-key "Description")
'package-menu--description-predicate)
(t ; By default, sort by package status
'package-menu--status-predicate))))
(dolist (elt info-list)
(package-print-package (car (car elt))
(cdr (car elt))
(car (cdr elt))
(car (cdr (cdr elt)))))
(goto-char (point-min))
(set-buffer-modified-p nil)
(current-buffer)))
(defun package-menu--version-predicate (left right)
(let ((vleft (or (cdr (car left)) '(0)))
(vright (or (cdr (car right)) '(0))))
(if (version-list-= vleft vright)
(package-menu--name-predicate left right)
(version-list-< vleft vright))))
(defun package-menu--status-predicate (left right)
(let ((sleft (cadr left))
(sright (cadr right)))
(cond ((string= sleft sright)
(package-menu--name-predicate left right))
((string= sleft "available") t)
((string= sright "available") nil)
((string= sleft "installed") t)
((string= sright "installed") nil)
((string= sleft "held") t)
((string= sright "held") nil)
((string= sleft "built-in") t)
((string= sright "built-in") nil)
((string= sleft "obsolete") t)
((string= sright "obsolete") nil)
(t (string< sleft sright)))))
(defun package-menu--description-predicate (left right)
(let ((sleft (car (cddr left)))
(sright (car (cddr right))))
(if (string= sleft sright)
(package-menu--name-predicate left right)
(string< sleft sright))))
(defun package-menu--name-predicate (left right)
(string< (symbol-name (caar left))
(symbol-name (caar right))))
(defun package-menu-sort-by-column (&optional e)
"Sort the package menu by the column of the mouse click E."
(interactive "e")
(let* ((pos (event-start e))
(obj (posn-object pos))
(col (if obj
(get-text-property (cdr obj) 'column-name (car obj))
(get-text-property (posn-point pos) 'column-name)))
(buf (window-buffer (posn-window (event-start e)))))
(with-current-buffer buf
(when (eq major-mode 'package-menu-mode)
(setq package-menu-sort-key col)
(package--generate-package-list)))))
(defun package--list-packages (&optional packages)
"Generate and pop to the *Packages* buffer.
Optional PACKAGES is a list of names of packages (symbols) to
list; the default is to display everything in `package-alist'."
(require 'finder-inf nil t)
(let ((buf (get-buffer-create "*Packages*")))
(with-current-buffer buf
(package-menu-mode)
(set (make-local-variable 'package-menu-package-list) packages)
(set (make-local-variable 'package-menu-sort-key) nil)
(package--generate-package-list))
;; The package menu buffer has keybindings. If the user types
;; `M-x list-packages', that suggests it should become current.
(switch-to-buffer buf)))
;;;###autoload ;;;###autoload
(defun list-packages () (defun list-packages (&optional no-fetch)
"Display a list of packages. "Display a list of packages.
Fetches the updated list of packages before displaying. This first fetches the updated list of packages before
displaying, unless a prefix argument NO-FETCH is specified.
The list is displayed in a buffer named `*Packages*'." The list is displayed in a buffer named `*Packages*'."
(interactive) (interactive "P")
(require 'finder-inf nil t)
;; Initialize the package system if necessary. ;; Initialize the package system if necessary.
(unless package--initialized (unless package--initialized
(package-initialize t)) (package-initialize t))
(package-refresh-contents) (unless no-fetch
(package--list-packages)) (package-refresh-contents))
(let ((buf (get-buffer-create "*Packages*")))
(with-current-buffer buf
(package-menu-mode)
(package-menu--generate))
;; The package menu buffer has keybindings. If the user types
;; `M-x list-packages', that suggests it should become current.
(switch-to-buffer buf)))
;;;###autoload ;;;###autoload
(defalias 'package-list-packages 'list-packages) (defalias 'package-list-packages 'list-packages)
@ -1722,7 +1590,7 @@ The list is displayed in a buffer named `*Packages*'."
Does not fetch the updated list of packages before displaying. Does not fetch the updated list of packages before displaying.
The list is displayed in a buffer named `*Packages*'." The list is displayed in a buffer named `*Packages*'."
(interactive) (interactive)
(package--list-packages)) (list-packages t))
(provide 'package) (provide 'package)