diff options
| author | Chong Yidong | 2010-06-20 00:55:14 -0400 |
|---|---|---|
| committer | Chong Yidong | 2010-06-20 00:55:14 -0400 |
| commit | 8adb4c33da6fb4c3dfeb664152b0076e6d62fef8 (patch) | |
| tree | 2553cc314cf09e1be5d317c65d7f4dae9c1793ae | |
| parent | cced75847f64f1387ab3b4fac79034463afe1d93 (diff) | |
| download | emacs-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/ChangeLog | 10 | ||||
| -rw-r--r-- | lisp/emacs-lisp/package.el | 74 | ||||
| -rw-r--r-- | lisp/help-mode.el | 5 |
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 @@ | |||
| 1 | 2010-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 | |||
| 1 | 2010-06-19 Chong Yidong <cyd@stupidchicken.com> | 11 | 2010-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)) |