]> git.eshelyaron.com Git - emacs.git/commitdiff
Tweaks to package list UI.
authorChong Yidong <cyd@stupidchicken.com>
Sun, 20 Jun 2010 04:55:14 +0000 (00:55 -0400)
committerChong Yidong <cyd@stupidchicken.com>
Sun, 20 Jun 2010 04:55:14 +0000 (00:55 -0400)
* help-mode.el (help-package): New button type.

* emacs-lisp/package.el (package-print-package): Add link to
package description via describe-package.
(describe-package-1): List package requirements.  Add button to
perform installation.
(package-menu-describe-package): New command.

lisp/ChangeLog
lisp/emacs-lisp/package.el
lisp/help-mode.el

index f4d0d1ac2b1627766d4a93128a010de8f85f75a6..a1776062cdabaa57e3834eb16bcb0a77cf458b39 100644 (file)
@@ -1,3 +1,13 @@
+2010-06-20  Chong Yidong  <cyd@stupidchicken.com>
+
+       * emacs-lisp/package.el (package-print-package): Add link to
+       package description via describe-package.
+       (describe-package-1): List package requirements.  Add button to
+       perform installation.
+       (package-menu-describe-package): New command.
+
+       * help-mode.el (help-package): New button type.
+
 2010-06-19  Chong Yidong  <cyd@stupidchicken.com>
 
        * emacs-lisp/package.el: Move package-list-packages binding to
index 2a93535718c45d123369478654e6adbff7628965..c6035442313a499f021b1c83d5f2764a9810fb19 100644 (file)
@@ -1069,7 +1069,7 @@ The variable `package-load-list' controls which packages to load."
 
 (defun describe-package-1 (package)
   (let ((desc (cdr (assq package package-alist)))
-       version)
+       reqs version installable)
     (prin1 package)
     (princ " is ")
     (cond
@@ -1091,14 +1091,51 @@ The variable `package-load-list' controls which packages to load."
            (setq version nil)))))
      (t
       ;; An uninstalled package.
-      (setq desc (cdr (assq package package-archive-contents)))
-      (setq version (package-version-join (package-desc-vers desc)))
-      (insert "a package that is not installed.\n\n")))
+      (setq desc (cdr (assq package package-archive-contents))
+           version (package-version-join (package-desc-vers desc))
+           installable t)
+      (insert "an installable package.\n\n")))
     (if version
        (insert "      Version: " version "\n"))
-    (insert "  Description: " (package-desc-doc desc) "\n")))
-;; To do: add buttons for installing, uninstalling, etc.
-
+    (setq reqs (package-desc-reqs desc))
+    (when reqs
+      (insert "     Requires: ")
+      (let ((first t)
+           name vers text)
+       (dolist (req reqs)
+         (setq name (car req)
+               vers (cadr req)
+               text (format "%s-%s" (symbol-name name)
+                            (package-version-join vers)))
+         (cond (first (setq first nil))
+               ((>= (+ 2 (current-column) (length text))
+                    (window-width))
+                (insert ",\n               "))
+               (t (insert ", ")))
+         (help-insert-xref-button text 'help-package name))
+       (insert "\n")))
+    (insert "  Description: " (package-desc-doc desc) "\n")
+    ;; Todo: button for uninstalling a package.
+    (when installable
+      (let ((button-text (if (display-graphic-p)
+                            "Install"
+                          "[Install]"))
+           (button-face (if (display-graphic-p)
+                            '(:box (:line-width 2 :color "dark grey")
+                                   :background "light grey"
+                                   :foreground "black")
+                          'link)))
+       (insert "\n")
+       (insert-text-button button-text
+                           'face button-face
+                           'follow-link t
+                           'package-symbol package
+                           'action (lambda (button)
+                                     (package-install
+                                      (button-get button 'package-symbol))
+                                     (revert-buffer nil t)
+                                     (goto-char (point-min))))
+       (insert "\n")))))
 
 \f
 ;;;; Package menu mode.
@@ -1107,6 +1144,7 @@ The variable `package-load-list' controls which packages to load."
   (let ((map (make-keymap))
        (menu-map (make-sparse-keymap "Package")))
     (suppress-keymap map)
+    (define-key map "\C-m" 'package-menu-describe-package)
     (define-key map "q" 'quit-window)
     (define-key map "n" 'next-line)
     (define-key map "p" 'previous-line)
@@ -1208,6 +1246,14 @@ available for download."
   (interactive)
   (package-list-packages-internal))
 
+(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))
@@ -1286,7 +1332,7 @@ For larger packages, shows the README file."
   (save-excursion
     (beginning-of-line)
     (if (looking-at ". \\([^ \t]*\\)")
-       (match-string 1))))
+       (match-string-no-properties 1))))
 
 ;; Return the version of the package on the current line.
 (defun package-menu-get-version ()
@@ -1342,14 +1388,20 @@ Emacs."
               (t ; obsolete, but also the default.
                'font-lock-warning-face))))
     (insert (propertize "  " 'font-lock-face face))
-    (insert (propertize (symbol-name package) '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 30 1)
+    (indent-to 32 1)
     (insert (propertize key 'font-lock-face face))
     ;; FIXME: this 'when' is bogus...
     (when desc
-      (indent-to 41 1)
+      (indent-to 43 1)
       (insert (propertize desc 'font-lock-face face)))
     (insert "\n")))
 
index b04a289b4ae548fcc0bfb84b0324e96abcdbf749..7a7a1ddaf79bd8d21ee60ef24ff1d912acd73fa1 100644 (file)
@@ -244,6 +244,11 @@ The format is (FUNCTION ARGS...).")
                       (message "Unable to find location in file"))))
   'help-echo (purecopy "mouse-2, RET: find face's definition"))
 
+(define-button-type 'help-package
+  :supertype 'help-xref
+  'help-function 'describe-package
+  'help-echo (purecopy "mouse-2, RET: Describe package"))
+
 (define-button-type 'help-package-def
   :supertype 'help-xref
   'help-function (lambda (file) (dired file))