aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChong Yidong2010-06-20 00:55:14 -0400
committerChong Yidong2010-06-20 00:55:14 -0400
commit8adb4c33da6fb4c3dfeb664152b0076e6d62fef8 (patch)
tree2553cc314cf09e1be5d317c65d7f4dae9c1793ae
parentcced75847f64f1387ab3b4fac79034463afe1d93 (diff)
downloademacs-8adb4c33da6fb4c3dfeb664152b0076e6d62fef8.tar.gz
emacs-8adb4c33da6fb4c3dfeb664152b0076e6d62fef8.zip
Tweaks to package list UI.
* 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.
-rw-r--r--lisp/ChangeLog10
-rw-r--r--lisp/emacs-lisp/package.el74
-rw-r--r--lisp/help-mode.el5
3 files changed, 78 insertions, 11 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index f4d0d1ac2b1..a1776062cda 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,13 @@
12010-06-20 Chong Yidong <cyd@stupidchicken.com>
2
3 * emacs-lisp/package.el (package-print-package): Add link to
4 package description via describe-package.
5 (describe-package-1): List package requirements. Add button to
6 perform installation.
7 (package-menu-describe-package): New command.
8
9 * help-mode.el (help-package): New button type.
10
12010-06-19 Chong Yidong <cyd@stupidchicken.com> 112010-06-19 Chong Yidong <cyd@stupidchicken.com>
2 12
3 * emacs-lisp/package.el: Move package-list-packages binding to 13 * emacs-lisp/package.el: Move package-list-packages binding to
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 2a93535718c..c6035442313 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -1069,7 +1069,7 @@ The variable `package-load-list' controls which packages to load."
1069 1069
1070(defun describe-package-1 (package) 1070(defun describe-package-1 (package)
1071 (let ((desc (cdr (assq package package-alist))) 1071 (let ((desc (cdr (assq package package-alist)))
1072 version) 1072 reqs version installable)
1073 (prin1 package) 1073 (prin1 package)
1074 (princ " is ") 1074 (princ " is ")
1075 (cond 1075 (cond
@@ -1091,14 +1091,51 @@ The variable `package-load-list' controls which packages to load."
1091 (setq version nil))))) 1091 (setq version nil)))))
1092 (t 1092 (t
1093 ;; An uninstalled package. 1093 ;; An uninstalled package.
1094 (setq desc (cdr (assq package package-archive-contents))) 1094 (setq desc (cdr (assq package package-archive-contents))
1095 (setq version (package-version-join (package-desc-vers desc))) 1095 version (package-version-join (package-desc-vers desc))
1096 (insert "a package that is not installed.\n\n"))) 1096 installable t)
1097 (insert "an installable package.\n\n")))
1097 (if version 1098 (if version
1098 (insert " Version: " version "\n")) 1099 (insert " Version: " version "\n"))
1099 (insert " Description: " (package-desc-doc desc) "\n"))) 1100 (setq reqs (package-desc-reqs desc))
1100;; To do: add buttons for installing, uninstalling, etc. 1101 (when reqs
1101 1102 (insert " Requires: ")
1103 (let ((first t)
1104 name vers text)
1105 (dolist (req reqs)
1106 (setq name (car req)
1107 vers (cadr req)
1108 text (format "%s-%s" (symbol-name name)
1109 (package-version-join vers)))
1110 (cond (first (setq first nil))
1111 ((>= (+ 2 (current-column) (length text))
1112 (window-width))
1113 (insert ",\n "))
1114 (t (insert ", ")))
1115 (help-insert-xref-button text 'help-package name))
1116 (insert "\n")))
1117 (insert " Description: " (package-desc-doc desc) "\n")
1118 ;; Todo: button for uninstalling a package.
1119 (when installable
1120 (let ((button-text (if (display-graphic-p)
1121 "Install"
1122 "[Install]"))
1123 (button-face (if (display-graphic-p)
1124 '(:box (:line-width 2 :color "dark grey")
1125 :background "light grey"
1126 :foreground "black")
1127 'link)))
1128 (insert "\n")
1129 (insert-text-button button-text
1130 'face button-face
1131 'follow-link t
1132 'package-symbol package
1133 'action (lambda (button)
1134 (package-install
1135 (button-get button 'package-symbol))
1136 (revert-buffer nil t)
1137 (goto-char (point-min))))
1138 (insert "\n")))))
1102 1139
1103 1140
1104;;;; Package menu mode. 1141;;;; Package menu mode.
@@ -1107,6 +1144,7 @@ The variable `package-load-list' controls which packages to load."
1107 (let ((map (make-keymap)) 1144 (let ((map (make-keymap))
1108 (menu-map (make-sparse-keymap "Package"))) 1145 (menu-map (make-sparse-keymap "Package")))
1109 (suppress-keymap map) 1146 (suppress-keymap map)
1147 (define-key map "\C-m" 'package-menu-describe-package)
1110 (define-key map "q" 'quit-window) 1148 (define-key map "q" 'quit-window)
1111 (define-key map "n" 'next-line) 1149 (define-key map "n" 'next-line)
1112 (define-key map "p" 'previous-line) 1150 (define-key map "p" 'previous-line)
@@ -1208,6 +1246,14 @@ available for download."
1208 (interactive) 1246 (interactive)
1209 (package-list-packages-internal)) 1247 (package-list-packages-internal))
1210 1248
1249(defun package-menu-describe-package ()
1250 "Describe the package in the current line."
1251 (interactive)
1252 (let ((name (package-menu-get-package)))
1253 (if name
1254 (describe-package (intern name))
1255 (message "No package on this line"))))
1256
1211(defun package-menu-mark-internal (what) 1257(defun package-menu-mark-internal (what)
1212 (unless (eobp) 1258 (unless (eobp)
1213 (let ((buffer-read-only nil)) 1259 (let ((buffer-read-only nil))
@@ -1286,7 +1332,7 @@ For larger packages, shows the README file."
1286 (save-excursion 1332 (save-excursion
1287 (beginning-of-line) 1333 (beginning-of-line)
1288 (if (looking-at ". \\([^ \t]*\\)") 1334 (if (looking-at ". \\([^ \t]*\\)")
1289 (match-string 1)))) 1335 (match-string-no-properties 1))))
1290 1336
1291;; Return the version of the package on the current line. 1337;; Return the version of the package on the current line.
1292(defun package-menu-get-version () 1338(defun package-menu-get-version ()
@@ -1342,14 +1388,20 @@ Emacs."
1342 (t ; obsolete, but also the default. 1388 (t ; obsolete, but also the default.
1343 'font-lock-warning-face)))) 1389 'font-lock-warning-face))))
1344 (insert (propertize " " 'font-lock-face face)) 1390 (insert (propertize " " 'font-lock-face face))
1345 (insert (propertize (symbol-name package) 'font-lock-face face)) 1391 (insert-text-button (symbol-name package)
1392 'face 'link
1393 'follow-link t
1394 'package-symbol package
1395 'action (lambda (button)
1396 (describe-package
1397 (button-get button 'package-symbol))))
1346 (indent-to 20 1) 1398 (indent-to 20 1)
1347 (insert (propertize (package-version-join version) 'font-lock-face face)) 1399 (insert (propertize (package-version-join version) 'font-lock-face face))
1348 (indent-to 30 1) 1400 (indent-to 32 1)
1349 (insert (propertize key 'font-lock-face face)) 1401 (insert (propertize key 'font-lock-face face))
1350 ;; FIXME: this 'when' is bogus... 1402 ;; FIXME: this 'when' is bogus...
1351 (when desc 1403 (when desc
1352 (indent-to 41 1) 1404 (indent-to 43 1)
1353 (insert (propertize desc 'font-lock-face face))) 1405 (insert (propertize desc 'font-lock-face face)))
1354 (insert "\n"))) 1406 (insert "\n")))
1355 1407
diff --git a/lisp/help-mode.el b/lisp/help-mode.el
index b04a289b4ae..7a7a1ddaf79 100644
--- a/lisp/help-mode.el
+++ b/lisp/help-mode.el
@@ -244,6 +244,11 @@ The format is (FUNCTION ARGS...).")
244 (message "Unable to find location in file")))) 244 (message "Unable to find location in file"))))
245 'help-echo (purecopy "mouse-2, RET: find face's definition")) 245 'help-echo (purecopy "mouse-2, RET: find face's definition"))
246 246
247(define-button-type 'help-package
248 :supertype 'help-xref
249 'help-function 'describe-package
250 'help-echo (purecopy "mouse-2, RET: Describe package"))
251
247(define-button-type 'help-package-def 252(define-button-type 'help-package-def
248 :supertype 'help-xref 253 :supertype 'help-xref
249 'help-function (lambda (file) (dired file)) 254 'help-function (lambda (file) (dired file))