diff options
| -rw-r--r-- | etc/NEWS | 8 | ||||
| -rw-r--r-- | lisp/ChangeLog | 14 | ||||
| -rw-r--r-- | lisp/emacs-lisp/package.el | 177 | ||||
| -rw-r--r-- | lisp/help.el | 1 | ||||
| -rw-r--r-- | lisp/menu-bar.el | 9 |
5 files changed, 124 insertions, 85 deletions
| @@ -176,8 +176,12 @@ for `list-colors-display'. | |||
| 176 | 176 | ||
| 177 | ** An Emacs Lisp package manager is now included. | 177 | ** An Emacs Lisp package manager is now included. |
| 178 | This is a convenient way to download and install additional packages, | 178 | This is a convenient way to download and install additional packages, |
| 179 | from elpa.gnu.org. `M-x package-list-packages' shows a list of | 179 | from elpa.gnu.org. |
| 180 | packages, which can be selected for installation. | 180 | |
| 181 | *** `M-x list-packages' shows a list of packages, which can be | ||
| 182 | selected for installation. | ||
| 183 | |||
| 184 | *** New command `describe-package', bound to `C-h P'. | ||
| 181 | 185 | ||
| 182 | *** By default, all installed packages are loaded and activated | 186 | *** By default, all installed packages are loaded and activated |
| 183 | automatically when Emacs starts up. To disable this, set | 187 | automatically when Emacs starts up. To disable this, set |
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 83d93e9b5ef..28bc8123501 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,17 @@ | |||
| 1 | 2010-08-26 Chong Yidong <cyd@stupidchicken.com> | ||
| 2 | |||
| 3 | * help.el (help-map): Bind `C-h P' to describe-package. | ||
| 4 | |||
| 5 | * menu-bar.el (menu-bar-describe-menu): Add describe-package. | ||
| 6 | |||
| 7 | * emacs-lisp/package.el (package-refresh-contents): Catch errors | ||
| 8 | when downloading archives. | ||
| 9 | (describe-package-1): Add package commentary. | ||
| 10 | (package-install-button-action): New function. | ||
| 11 | (package-menu-mode-map): Bind ? to package-menu-describe-package. | ||
| 12 | (package-menu-view-commentary): Function removed. | ||
| 13 | (package-list-packages-internal): Hide the `package' package too. | ||
| 14 | |||
| 1 | 2010-08-25 Kenichi Handa <handa@m17n.org> | 15 | 2010-08-25 Kenichi Handa <handa@m17n.org> |
| 2 | 16 | ||
| 3 | * language/misc-lang.el ("Arabic"): New language environment. | 17 | * language/misc-lang.el ("Arabic"): New language environment. |
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 634a05df15e..7042566724c 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el | |||
| @@ -216,6 +216,7 @@ If VERSION is nil, the package is not loaded (it is \"disabled\")." | |||
| 216 | (declare-function lm-header "lisp-mnt" (header)) | 216 | (declare-function lm-header "lisp-mnt" (header)) |
| 217 | (declare-function lm-commentary "lisp-mnt" (&optional file)) | 217 | (declare-function lm-commentary "lisp-mnt" (&optional file)) |
| 218 | (declare-function dired-delete-file "dired" (file &optional recursive trash)) | 218 | (declare-function dired-delete-file "dired" (file &optional recursive trash)) |
| 219 | (defvar url-http-end-of-headers) | ||
| 219 | 220 | ||
| 220 | (defcustom package-archives '(("gnu" . "http://elpa.gnu.org/packages/")) | 221 | (defcustom package-archives '(("gnu" . "http://elpa.gnu.org/packages/")) |
| 221 | "An alist of archives from which to fetch. | 222 | "An alist of archives from which to fetch. |
| @@ -1016,7 +1017,10 @@ download." | |||
| 1016 | (unless (file-exists-p package-user-dir) | 1017 | (unless (file-exists-p package-user-dir) |
| 1017 | (make-directory package-user-dir t)) | 1018 | (make-directory package-user-dir t)) |
| 1018 | (dolist (archive package-archives) | 1019 | (dolist (archive package-archives) |
| 1019 | (package--download-one-archive archive "archive-contents")) | 1020 | (condition-case nil |
| 1021 | (package--download-one-archive archive "archive-contents") | ||
| 1022 | (error (message "Failed to download archive `%s'." | ||
| 1023 | (car archive))))) | ||
| 1020 | (package-read-all-archive-contents)) | 1024 | (package-read-all-archive-contents)) |
| 1021 | 1025 | ||
| 1022 | ;;;###autoload | 1026 | ;;;###autoload |
| @@ -1052,9 +1056,7 @@ The variable `package-load-list' controls which packages to load." | |||
| 1052 | guess) | 1056 | guess) |
| 1053 | "Describe package: ") | 1057 | "Describe package: ") |
| 1054 | packages nil t nil nil guess)) | 1058 | packages nil t nil nil guess)) |
| 1055 | (list (if (equal val "") | 1059 | (list (if (equal val "") guess (intern val))))) |
| 1056 | guess | ||
| 1057 | (intern val))))) | ||
| 1058 | (if (or (null package) (null (symbolp package))) | 1060 | (if (or (null package) (null (symbolp package))) |
| 1059 | (message "You did not specify a package") | 1061 | (message "You did not specify a package") |
| 1060 | (help-setup-xref (list #'describe-package package) | 1062 | (help-setup-xref (list #'describe-package package) |
| @@ -1064,38 +1066,60 @@ The variable `package-load-list' controls which packages to load." | |||
| 1064 | (describe-package-1 package))))) | 1066 | (describe-package-1 package))))) |
| 1065 | 1067 | ||
| 1066 | (defun describe-package-1 (package) | 1068 | (defun describe-package-1 (package) |
| 1067 | (let ((desc (cdr (assq package package-alist))) | 1069 | (let ((package-name (symbol-name package)) |
| 1068 | reqs version installable) | 1070 | (built-in (assq package package--builtins)) |
| 1071 | desc pkg-dir reqs version installable) | ||
| 1069 | (prin1 package) | 1072 | (prin1 package) |
| 1070 | (princ " is ") | 1073 | (princ " is ") |
| 1071 | (cond | 1074 | (if (setq desc (cdr (assq package package-alist))) |
| 1072 | (desc | 1075 | ;; This package is loaded (i.e. in `package-alist'). |
| 1073 | ;; This package is loaded (i.e. in `package-alist'). | 1076 | (progn |
| 1074 | (let (pkg-dir) | 1077 | (setq version (package-version-join (package-desc-vers desc))) |
| 1075 | (setq version (package-version-join (package-desc-vers desc))) | 1078 | (cond (built-in |
| 1076 | (if (assq package package--builtins) | 1079 | (princ "a built-in package.\n\n")) |
| 1077 | (princ "a built-in package.\n\n") | 1080 | ((setq pkg-dir (package--dir package-name version)) |
| 1078 | (setq pkg-dir (package--dir (symbol-name package) version)) | 1081 | (insert "an installed package.\n\n")) |
| 1079 | (if pkg-dir | 1082 | (t ;; This normally does not happen. |
| 1080 | (progn | 1083 | (insert "a deleted package.\n\n") |
| 1081 | (insert "a package installed in `") | 1084 | (setq version nil)))) |
| 1082 | (help-insert-xref-button (file-name-as-directory pkg-dir) | 1085 | ;; This package is not installed. |
| 1083 | 'help-package-def pkg-dir) | 1086 | (setq desc (cdr (assq package package-archive-contents)) |
| 1084 | (insert "'.\n\n")) | ||
| 1085 | ;; This normally does not happen. | ||
| 1086 | (insert "a deleted package.\n\n") | ||
| 1087 | (setq version nil))))) | ||
| 1088 | (t | ||
| 1089 | ;; An uninstalled package. | ||
| 1090 | (setq desc (cdr (assq package package-archive-contents)) | ||
| 1091 | version (package-version-join (package-desc-vers desc)) | 1087 | version (package-version-join (package-desc-vers desc)) |
| 1092 | installable t) | 1088 | installable t) |
| 1093 | (insert "an installable package.\n\n"))) | 1089 | (insert "an uninstalled package.\n\n")) |
| 1094 | (if version | 1090 | |
| 1095 | (insert " Version: " version "\n")) | 1091 | (insert " " (propertize "Status" 'face 'bold) ": ") |
| 1092 | (cond (pkg-dir | ||
| 1093 | (insert (propertize "Installed" 'face 'font-lock-comment-face)) | ||
| 1094 | (insert " in `") | ||
| 1095 | ;; Todo: Add button for uninstalling. | ||
| 1096 | (help-insert-xref-button (file-name-as-directory pkg-dir) | ||
| 1097 | 'help-package-def pkg-dir) | ||
| 1098 | (insert "'.")) | ||
| 1099 | (installable | ||
| 1100 | (insert "Available -- ") | ||
| 1101 | (let ((button-text (if (display-graphic-p) | ||
| 1102 | "Install" | ||
| 1103 | "[Install]")) | ||
| 1104 | (button-face (if (display-graphic-p) | ||
| 1105 | '(:box (:line-width 2 :color "dark grey") | ||
| 1106 | :background "light grey" | ||
| 1107 | :foreground "black") | ||
| 1108 | 'link))) | ||
| 1109 | (insert-text-button button-text | ||
| 1110 | 'face button-face | ||
| 1111 | 'follow-link t | ||
| 1112 | 'package-symbol package | ||
| 1113 | 'action 'package-install-button-action))) | ||
| 1114 | (built-in | ||
| 1115 | (insert (propertize "Built-in" 'face 'font-lock-builtin-face) ".")) | ||
| 1116 | (t (insert "Deleted."))) | ||
| 1117 | (insert "\n") | ||
| 1118 | (when version | ||
| 1119 | (insert " " (propertize "Version" 'face 'bold) ": " version "\n")) | ||
| 1096 | (setq reqs (package-desc-reqs desc)) | 1120 | (setq reqs (package-desc-reqs desc)) |
| 1097 | (when reqs | 1121 | (when reqs |
| 1098 | (insert " Requires: ") | 1122 | (insert " " (propertize "Requires" 'face 'bold) ": ") |
| 1099 | (let ((first t) | 1123 | (let ((first t) |
| 1100 | name vers text) | 1124 | name vers text) |
| 1101 | (dolist (req reqs) | 1125 | (dolist (req reqs) |
| @@ -1110,28 +1134,45 @@ The variable `package-load-list' controls which packages to load." | |||
| 1110 | (t (insert ", "))) | 1134 | (t (insert ", "))) |
| 1111 | (help-insert-xref-button text 'help-package name)) | 1135 | (help-insert-xref-button text 'help-package name)) |
| 1112 | (insert "\n"))) | 1136 | (insert "\n"))) |
| 1113 | (insert " Description: " (package-desc-doc desc) "\n") | 1137 | (insert " " (propertize "Summary" 'face 'bold) |
| 1114 | ;; Todo: button for uninstalling a package. | 1138 | ": " (package-desc-doc desc) "\n\n") |
| 1115 | (when installable | 1139 | |
| 1116 | (let ((button-text (if (display-graphic-p) | 1140 | ;; Insert the package commentary. |
| 1117 | "Install" | 1141 | ;; FIXME: We should try to be smarter about when to download. |
| 1118 | "[Install]")) | 1142 | (let ((readme (expand-file-name (concat package-name "-readme.txt") |
| 1119 | (button-face (if (display-graphic-p) | 1143 | package-user-dir))) |
| 1120 | '(:box (:line-width 2 :color "dark grey") | 1144 | ;; Try downloading the commentary. If that fails, try an |
| 1121 | :background "light grey" | 1145 | ;; existing readme file in `package-user-dir'. |
| 1122 | :foreground "black") | 1146 | (cond ((let ((buffer |
| 1123 | 'link))) | 1147 | (condition-case nil |
| 1124 | (insert "\n") | 1148 | (url-retrieve-synchronously |
| 1125 | (insert-text-button button-text | 1149 | (concat (package-archive-url package) |
| 1126 | 'face button-face | 1150 | package-name "-readme.txt")) |
| 1127 | 'follow-link t | 1151 | (error nil))) |
| 1128 | 'package-symbol package | 1152 | response) |
| 1129 | 'action (lambda (button) | 1153 | (when buffer |
| 1130 | (package-install | 1154 | (with-current-buffer buffer |
| 1131 | (button-get button 'package-symbol)) | 1155 | (setq response (url-http-parse-response)) |
| 1132 | (revert-buffer nil t) | 1156 | (if (or (< response 200) (>= response 300)) |
| 1133 | (goto-char (point-min)))) | 1157 | (setq response nil) |
| 1134 | (insert "\n"))))) | 1158 | (setq buffer-file-name |
| 1159 | (expand-file-name readme package-user-dir)) | ||
| 1160 | (delete-region (point-min) (1+ url-http-end-of-headers)) | ||
| 1161 | (save-buffer))) | ||
| 1162 | (when response | ||
| 1163 | (insert-buffer-substring buffer) | ||
| 1164 | (kill-buffer buffer) | ||
| 1165 | t)))) | ||
| 1166 | ((file-readable-p readme) | ||
| 1167 | (insert-file-contents readme) | ||
| 1168 | (goto-char (point-max))))))) | ||
| 1169 | |||
| 1170 | (defun package-install-button-action (button) | ||
| 1171 | (let ((package (button-get button 'package-symbol))) | ||
| 1172 | (when (y-or-n-p (format "Install package `%s'? " package)) | ||
| 1173 | (package-install package) | ||
| 1174 | (revert-buffer nil t) | ||
| 1175 | (goto-char (point-min))))) | ||
| 1135 | 1176 | ||
| 1136 | 1177 | ||
| 1137 | ;;;; Package menu mode. | 1178 | ;;;; Package menu mode. |
| @@ -1153,7 +1194,7 @@ The variable `package-load-list' controls which packages to load." | |||
| 1153 | (define-key map "~" 'package-menu-mark-obsolete-for-deletion) | 1194 | (define-key map "~" 'package-menu-mark-obsolete-for-deletion) |
| 1154 | (define-key map "x" 'package-menu-execute) | 1195 | (define-key map "x" 'package-menu-execute) |
| 1155 | (define-key map "h" 'package-menu-quick-help) | 1196 | (define-key map "h" 'package-menu-quick-help) |
| 1156 | (define-key map "?" 'package-menu-view-commentary) | 1197 | (define-key map "?" 'package-menu-describe-package) |
| 1157 | (define-key map [menu-bar package-menu] (cons "Package" menu-map)) | 1198 | (define-key map [menu-bar package-menu] (cons "Package" menu-map)) |
| 1158 | (define-key menu-map [mq] | 1199 | (define-key menu-map [mq] |
| 1159 | '(menu-item "Quit" quit-window | 1200 | '(menu-item "Quit" quit-window |
| @@ -1297,32 +1338,8 @@ available for download." | |||
| 1297 | (interactive) | 1338 | (interactive) |
| 1298 | (message "n-ext, i-nstall, d-elete, u-nmark, x-ecute, r-efresh, h-elp")) | 1339 | (message "n-ext, i-nstall, d-elete, u-nmark, x-ecute, r-efresh, h-elp")) |
| 1299 | 1340 | ||
| 1300 | (defun package-menu-view-commentary () | 1341 | (define-obsolete-function-alias |
| 1301 | "Display information about this package. | 1342 | 'package-menu-view-commentary 'package-menu-describe-package "24.1") |
| 1302 | For single-file packages, shows the commentary section from the header. | ||
| 1303 | For larger packages, shows the README file." | ||
| 1304 | (interactive) | ||
| 1305 | (let* ((pkg-name (package-menu-get-package)) | ||
| 1306 | (buffer (url-retrieve-synchronously | ||
| 1307 | (concat (package-archive-url pkg-name) | ||
| 1308 | pkg-name | ||
| 1309 | "-readme.txt"))) | ||
| 1310 | start-point ok) | ||
| 1311 | (with-current-buffer buffer | ||
| 1312 | ;; FIXME: it would be nice to work with any URL type. | ||
| 1313 | (setq start-point url-http-end-of-headers) | ||
| 1314 | (setq ok (eq (url-http-parse-response) 200))) | ||
| 1315 | (let ((new-buffer (get-buffer-create "*Package Info*"))) | ||
| 1316 | (with-current-buffer new-buffer | ||
| 1317 | (let ((buffer-read-only nil)) | ||
| 1318 | (erase-buffer) | ||
| 1319 | (insert "Package information for " pkg-name "\n\n") | ||
| 1320 | (if ok | ||
| 1321 | (insert-buffer-substring buffer start-point) | ||
| 1322 | (insert "This package lacks a README file or commentary.\n")) | ||
| 1323 | (goto-char (point-min)) | ||
| 1324 | (view-mode))) | ||
| 1325 | (display-buffer new-buffer t)))) | ||
| 1326 | 1343 | ||
| 1327 | ;; Return the name of the package on the current line. | 1344 | ;; Return the name of the package on the current line. |
| 1328 | (defun package-menu-get-package () | 1345 | (defun package-menu-get-package () |
| @@ -1426,7 +1443,7 @@ Emacs." | |||
| 1426 | (setq name (car elt) | 1443 | (setq name (car elt) |
| 1427 | desc (cdr elt) | 1444 | desc (cdr elt) |
| 1428 | hold (assq name package-load-list)) | 1445 | hold (assq name package-load-list)) |
| 1429 | (unless (eq name 'emacs) | 1446 | (unless (memq name '(emacs package)) |
| 1430 | (setq info-list | 1447 | (setq info-list |
| 1431 | (package-list-maybe-add | 1448 | (package-list-maybe-add |
| 1432 | name (package-desc-vers desc) | 1449 | name (package-desc-vers desc) |
diff --git a/lisp/help.el b/lisp/help.el index 9434201797e..1cba4088a19 100644 --- a/lisp/help.el +++ b/lisp/help.el | |||
| @@ -103,6 +103,7 @@ | |||
| 103 | (define-key map "m" 'describe-mode) | 103 | (define-key map "m" 'describe-mode) |
| 104 | (define-key map "n" 'view-emacs-news) | 104 | (define-key map "n" 'view-emacs-news) |
| 105 | (define-key map "p" 'finder-by-keyword) | 105 | (define-key map "p" 'finder-by-keyword) |
| 106 | (define-key map "P" 'describe-package) | ||
| 106 | (define-key map "r" 'info-emacs-manual) | 107 | (define-key map "r" 'info-emacs-manual) |
| 107 | (define-key map "s" 'describe-syntax) | 108 | (define-key map "s" 'describe-syntax) |
| 108 | (define-key map "t" 'help-with-tutorial) | 109 | (define-key map "t" 'help-with-tutorial) |
diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el index 98cb061cccb..2975fd1efe6 100644 --- a/lisp/menu-bar.el +++ b/lisp/menu-bar.el | |||
| @@ -1485,6 +1485,9 @@ mail status in mode line")) | |||
| 1485 | (define-key menu-bar-describe-menu [describe-current-display-table] | 1485 | (define-key menu-bar-describe-menu [describe-current-display-table] |
| 1486 | `(menu-item ,(purecopy "Describe Display Table") describe-current-display-table | 1486 | `(menu-item ,(purecopy "Describe Display Table") describe-current-display-table |
| 1487 | :help ,(purecopy "Describe the current display table"))) | 1487 | :help ,(purecopy "Describe the current display table"))) |
| 1488 | (define-key menu-bar-describe-menu [describe-package] | ||
| 1489 | `(menu-item ,(purecopy "Describe Package...") describe-package | ||
| 1490 | :help ,(purecopy "Display documentation of a Lisp package"))) | ||
| 1488 | (define-key menu-bar-describe-menu [describe-face] | 1491 | (define-key menu-bar-describe-menu [describe-face] |
| 1489 | `(menu-item ,(purecopy "Describe Face...") describe-face | 1492 | `(menu-item ,(purecopy "Describe Face...") describe-face |
| 1490 | :help ,(purecopy "Display the properties of a face"))) | 1493 | :help ,(purecopy "Display the properties of a face"))) |
| @@ -1616,11 +1619,11 @@ key, a click, or a menu-item"))) | |||
| 1616 | (define-key menu-bar-help-menu [sep2] | 1619 | (define-key menu-bar-help-menu [sep2] |
| 1617 | menu-bar-separator) | 1620 | menu-bar-separator) |
| 1618 | (define-key menu-bar-help-menu [external-packages] | 1621 | (define-key menu-bar-help-menu [external-packages] |
| 1619 | `(menu-item ,(purecopy "External Packages") menu-bar-help-extra-packages | 1622 | `(menu-item ,(purecopy "Finding Extra Packages") menu-bar-help-extra-packages |
| 1620 | :help ,(purecopy "Lisp packages distributed separately for use in Emacs"))) | 1623 | :help ,(purecopy "Lisp packages distributed separately for use in Emacs"))) |
| 1621 | (define-key menu-bar-help-menu [find-emacs-packages] | 1624 | (define-key menu-bar-help-menu [find-emacs-packages] |
| 1622 | `(menu-item ,(purecopy "Find Emacs Packages") finder-by-keyword | 1625 | `(menu-item ,(purecopy "Search Built-in Packages") finder-by-keyword |
| 1623 | :help ,(purecopy "Find packages and features by keyword"))) | 1626 | :help ,(purecopy "Find built-in packages and features by keyword"))) |
| 1624 | (define-key menu-bar-help-menu [more-manuals] | 1627 | (define-key menu-bar-help-menu [more-manuals] |
| 1625 | `(menu-item ,(purecopy "More Manuals") ,menu-bar-manuals-menu)) | 1628 | `(menu-item ,(purecopy "More Manuals") ,menu-bar-manuals-menu)) |
| 1626 | (define-key menu-bar-help-menu [emacs-manual] | 1629 | (define-key menu-bar-help-menu [emacs-manual] |