diff options
| author | Chong Yidong | 2010-06-19 18:36:51 -0400 |
|---|---|---|
| committer | Chong Yidong | 2010-06-19 18:36:51 -0400 |
| commit | cced75847f64f1387ab3b4fac79034463afe1d93 (patch) | |
| tree | a9963de44384d75054a502e45b0d720a3d72b115 | |
| parent | d4aaac0f37d3e6e386c826575be8294a7dd4d2a3 (diff) | |
| download | emacs-cced75847f64f1387ab3b4fac79034463afe1d93.tar.gz emacs-cced75847f64f1387ab3b4fac79034463afe1d93.zip | |
Add preliminary describe-package functionality, and some cleanup.
* help-mode.el (help-package-def): New button type.
* menu-bar.el: Move package-list-packages binding here from
package.el.
* emacs-lisp/package.el: Move package-list-packages binding to
menu-bar.el.
(describe-package, describe-package-1, package--dir): New funs.
(package-activate-1): Use package--dir.
* emacs-lisp/package-x.el (gnus-article-buffer): Require package.
| -rw-r--r-- | lisp/ChangeLog | 14 | ||||
| -rw-r--r-- | lisp/emacs-lisp/package-x.el | 3 | ||||
| -rw-r--r-- | lisp/emacs-lisp/package.el | 104 | ||||
| -rw-r--r-- | lisp/help-mode.el | 5 | ||||
| -rw-r--r-- | lisp/menu-bar.el | 4 |
5 files changed, 107 insertions, 23 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index f0e152d3ffe..f4d0d1ac2b1 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,17 @@ | |||
| 1 | 2010-06-19 Chong Yidong <cyd@stupidchicken.com> | ||
| 2 | |||
| 3 | * emacs-lisp/package.el: Move package-list-packages binding to | ||
| 4 | menu-bar.el. | ||
| 5 | (describe-package, describe-package-1, package--dir): New funs. | ||
| 6 | (package-activate-1): Use package--dir. | ||
| 7 | |||
| 8 | * emacs-lisp/package-x.el (gnus-article-buffer): Require package. | ||
| 9 | |||
| 10 | * help-mode.el (help-package-def): New button type. | ||
| 11 | |||
| 12 | * menu-bar.el: Move package-list-packages binding here from | ||
| 13 | package.el. | ||
| 14 | |||
| 1 | 2010-06-19 Gustav HÃ¥llberg <gustav@gmail.com> (tiny change) | 15 | 2010-06-19 Gustav HÃ¥llberg <gustav@gmail.com> (tiny change) |
| 2 | 16 | ||
| 3 | * descr-text.el (describe-char): Avoid trailing whitespace. (Bug#6423) | 17 | * descr-text.el (describe-char): Avoid trailing whitespace. (Bug#6423) |
diff --git a/lisp/emacs-lisp/package-x.el b/lisp/emacs-lisp/package-x.el index c2d85aa574a..21bd7960d89 100644 --- a/lisp/emacs-lisp/package-x.el +++ b/lisp/emacs-lisp/package-x.el | |||
| @@ -31,6 +31,9 @@ | |||
| 31 | 31 | ||
| 32 | ;;; Code: | 32 | ;;; Code: |
| 33 | 33 | ||
| 34 | (require 'package) | ||
| 35 | (defvar gnus-article-buffer) | ||
| 36 | |||
| 34 | ;; Note that this only works if you have the password, which you | 37 | ;; Note that this only works if you have the password, which you |
| 35 | ;; probably don't :-). | 38 | ;; probably don't :-). |
| 36 | (defvar package-archive-upload-base nil | 39 | (defvar package-archive-upload-base nil |
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 54a2ba610ca..2a93535718c 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el | |||
| @@ -211,7 +211,6 @@ If VERSION is nil, the package is not loaded (it is \"disabled\")." | |||
| 211 | :version "24.1") | 211 | :version "24.1") |
| 212 | 212 | ||
| 213 | (defvar Info-directory-list) | 213 | (defvar Info-directory-list) |
| 214 | (defvar gnus-article-buffer) | ||
| 215 | (declare-function info-initialize "info" ()) | 214 | (declare-function info-initialize "info" ()) |
| 216 | (declare-function url-http-parse-response "url-http" ()) | 215 | (declare-function url-http-parse-response "url-http" ()) |
| 217 | (declare-function lm-header "lisp-mnt" (header)) | 216 | (declare-function lm-header "lisp-mnt" (header)) |
| @@ -423,33 +422,35 @@ updates `package-alist' and `package-obsolete-alist'." | |||
| 423 | "Extract the kind of download from an archive package description vector." | 422 | "Extract the kind of download from an archive package description vector." |
| 424 | (aref desc 3)) | 423 | (aref desc 3)) |
| 425 | 424 | ||
| 426 | (defun package-activate-1 (package pkg-vec) | 425 | (defun package--dir (name version-string) |
| 427 | (let* ((pkg-name (symbol-name package)) | 426 | (let* ((subdir (concat name "-" version-string)) |
| 428 | (pkg-ver-str (package-version-join (package-desc-vers pkg-vec))) | ||
| 429 | (dir-list (cons package-user-dir package-directory-list)) | 427 | (dir-list (cons package-user-dir package-directory-list)) |
| 430 | (pkg-dir)) | 428 | pkg-dir) |
| 431 | (while dir-list | 429 | (while dir-list |
| 432 | (let ((subdir (expand-file-name (concat pkg-name "-" pkg-ver-str) | 430 | (let ((subdir-full (expand-file-name subdir (car dir-list)))) |
| 433 | (car dir-list)))) | 431 | (if (file-directory-p subdir-full) |
| 434 | (if (file-directory-p subdir) | 432 | (setq pkg-dir subdir-full |
| 435 | (progn | 433 | dir-list nil) |
| 436 | (setq pkg-dir subdir) | ||
| 437 | (setq dir-list nil)) | ||
| 438 | (setq dir-list (cdr dir-list))))) | 434 | (setq dir-list (cdr dir-list))))) |
| 435 | pkg-dir)) | ||
| 436 | |||
| 437 | (defun package-activate-1 (package pkg-vec) | ||
| 438 | (let* ((name (symbol-name package)) | ||
| 439 | (version-str (package-version-join (package-desc-vers pkg-vec))) | ||
| 440 | (pkg-dir (package--dir name version-str))) | ||
| 439 | (unless pkg-dir | 441 | (unless pkg-dir |
| 440 | (error "Internal error: could not find directory for %s-%s" | 442 | (error "Internal error: could not find directory for %s-%s" |
| 441 | pkg-name pkg-ver-str)) | 443 | name version-str)) |
| 444 | ;; Add info node. | ||
| 442 | (if (file-exists-p (expand-file-name "dir" pkg-dir)) | 445 | (if (file-exists-p (expand-file-name "dir" pkg-dir)) |
| 443 | (progn | 446 | (progn |
| 444 | ;; FIXME: not the friendliest, but simple. | 447 | ;; FIXME: not the friendliest, but simple. |
| 445 | (require 'info) | 448 | (require 'info) |
| 446 | (info-initialize) | 449 | (info-initialize) |
| 447 | (setq Info-directory-list (cons pkg-dir Info-directory-list)))) | 450 | (setq Info-directory-list (cons pkg-dir Info-directory-list)))) |
| 451 | ;; Add to load path, add autoloads, and activate the package. | ||
| 448 | (setq load-path (cons pkg-dir load-path)) | 452 | (setq load-path (cons pkg-dir load-path)) |
| 449 | ;; Load the autoloads and activate the package. | 453 | (load (expand-file-name (concat name "-autoloads") pkg-dir) nil t) |
| 450 | (load (expand-file-name (concat (symbol-name package) "-autoloads") | ||
| 451 | pkg-dir) | ||
| 452 | nil t) | ||
| 453 | (setq package-activated-list (cons package package-activated-list)) | 454 | (setq package-activated-list (cons package package-activated-list)) |
| 454 | ;; Don't return nil. | 455 | ;; Don't return nil. |
| 455 | t)) | 456 | t)) |
| @@ -474,8 +475,7 @@ Return nil if the package could not be activated." | |||
| 474 | (let* ((pkg-desc (assq package package-alist)) | 475 | (let* ((pkg-desc (assq package package-alist)) |
| 475 | (this-version (package-desc-vers (cdr pkg-desc))) | 476 | (this-version (package-desc-vers (cdr pkg-desc))) |
| 476 | (req-list (package-desc-reqs (cdr pkg-desc))) | 477 | (req-list (package-desc-reqs (cdr pkg-desc))) |
| 477 | ;; If the package was never activated, we want to do it | 478 | ;; If the package was never activated, do it now. |
| 478 | ;; now. | ||
| 479 | (keep-going (or (not (memq package package-activated-list)) | 479 | (keep-going (or (not (memq package package-activated-list)) |
| 480 | (package-version-compare this-version version '>)))) | 480 | (package-version-compare this-version version '>)))) |
| 481 | (while (and req-list keep-going) | 481 | (while (and req-list keep-going) |
| @@ -1037,7 +1037,70 @@ The variable `package-load-list' controls which packages to load." | |||
| 1037 | package-alist)) | 1037 | package-alist)) |
| 1038 | 1038 | ||
| 1039 | 1039 | ||
| 1040 | ;;;; Package description buffer. | ||
| 1040 | 1041 | ||
| 1042 | ;;;###autoload | ||
| 1043 | (defun describe-package (package) | ||
| 1044 | "Display the full documentation of PACKAGE (a symbol)." | ||
| 1045 | (interactive | ||
| 1046 | (let* ((packages (append (mapcar 'car package-alist) | ||
| 1047 | (mapcar 'car package-archive-contents))) | ||
| 1048 | (guess (function-called-at-point)) | ||
| 1049 | val) | ||
| 1050 | (unless (memq guess packages) | ||
| 1051 | (setq guess nil)) | ||
| 1052 | (setq packages (mapcar 'symbol-name packages)) | ||
| 1053 | (setq val | ||
| 1054 | (completing-read (if guess | ||
| 1055 | (format "Describe package (default %s): " | ||
| 1056 | guess) | ||
| 1057 | "Describe package: ") | ||
| 1058 | packages nil t nil nil guess)) | ||
| 1059 | (list (if (equal val "") | ||
| 1060 | guess | ||
| 1061 | (intern val))))) | ||
| 1062 | (if (or (null package) (null (symbolp package))) | ||
| 1063 | (message "You did not specify a package") | ||
| 1064 | (help-setup-xref (list #'describe-package package) | ||
| 1065 | (called-interactively-p 'interactive)) | ||
| 1066 | (with-help-window (help-buffer) | ||
| 1067 | (with-current-buffer standard-output | ||
| 1068 | (describe-package-1 package))))) | ||
| 1069 | |||
| 1070 | (defun describe-package-1 (package) | ||
| 1071 | (let ((desc (cdr (assq package package-alist))) | ||
| 1072 | version) | ||
| 1073 | (prin1 package) | ||
| 1074 | (princ " is ") | ||
| 1075 | (cond | ||
| 1076 | (desc | ||
| 1077 | ;; This package is loaded (i.e. in `package-alist'). | ||
| 1078 | (let (pkg-dir) | ||
| 1079 | (setq version (package-version-join (package-desc-vers desc))) | ||
| 1080 | (if (assq package package--builtins) | ||
| 1081 | (princ "a built-in package.\n\n") | ||
| 1082 | (setq pkg-dir (package--dir (symbol-name package) version)) | ||
| 1083 | (if pkg-dir | ||
| 1084 | (progn | ||
| 1085 | (insert "a package installed in `") | ||
| 1086 | (help-insert-xref-button (file-name-as-directory pkg-dir) | ||
| 1087 | 'help-package-def pkg-dir) | ||
| 1088 | (insert "'.\n\n")) | ||
| 1089 | ;; This normally does not happen. | ||
| 1090 | (insert "a deleted package.\n\n") | ||
| 1091 | (setq version nil))))) | ||
| 1092 | (t | ||
| 1093 | ;; An uninstalled package. | ||
| 1094 | (setq desc (cdr (assq package package-archive-contents))) | ||
| 1095 | (setq version (package-version-join (package-desc-vers desc))) | ||
| 1096 | (insert "a package that is not installed.\n\n"))) | ||
| 1097 | (if version | ||
| 1098 | (insert " Version: " version "\n")) | ||
| 1099 | (insert " Description: " (package-desc-doc desc) "\n"))) | ||
| 1100 | ;; To do: add buttons for installing, uninstalling, etc. | ||
| 1101 | |||
| 1102 | |||
| 1103 | |||
| 1041 | ;;;; Package menu mode. | 1104 | ;;;; Package menu mode. |
| 1042 | 1105 | ||
| 1043 | (defvar package-menu-mode-map | 1106 | (defvar package-menu-mode-map |
| @@ -1443,11 +1506,6 @@ The list is displayed in a buffer named `*Packages*'." | |||
| 1443 | (interactive) | 1506 | (interactive) |
| 1444 | (package--list-packages)) | 1507 | (package--list-packages)) |
| 1445 | 1508 | ||
| 1446 | ;; Make it appear on the menu. | ||
| 1447 | (define-key-after menu-bar-options-menu [package] | ||
| 1448 | '(menu-item "Manage Packages" package-list-packages | ||
| 1449 | :help "Install or uninstall additional Emacs packages")) | ||
| 1450 | |||
| 1451 | (provide 'package) | 1509 | (provide 'package) |
| 1452 | 1510 | ||
| 1453 | ;;; package.el ends here | 1511 | ;;; package.el ends here |
diff --git a/lisp/help-mode.el b/lisp/help-mode.el index c478bf6d16c..b04a289b4ae 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-def | ||
| 248 | :supertype 'help-xref | ||
| 249 | 'help-function (lambda (file) (dired file)) | ||
| 250 | 'help-echo (purecopy "mouse-2, RET: visit package directory")) | ||
| 251 | |||
| 247 | 252 | ||
| 248 | ;;;###autoload | 253 | ;;;###autoload |
| 249 | (defun help-mode () | 254 | (defun help-mode () |
diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el index 2d5b6d51aa6..903bea36044 100644 --- a/lisp/menu-bar.el +++ b/lisp/menu-bar.el | |||
| @@ -703,6 +703,10 @@ by \"Save Options\" in Custom buffers.") | |||
| 703 | (when need-save | 703 | (when need-save |
| 704 | (custom-save-all)))) | 704 | (custom-save-all)))) |
| 705 | 705 | ||
| 706 | (define-key menu-bar-options-menu [package] | ||
| 707 | '(menu-item "Manage Emacs Packages" package-list-packages | ||
| 708 | :help "Install or uninstall additional Emacs packages")) | ||
| 709 | |||
| 706 | (define-key menu-bar-options-menu [save] | 710 | (define-key menu-bar-options-menu [save] |
| 707 | `(menu-item ,(purecopy "Save Options") menu-bar-options-save | 711 | `(menu-item ,(purecopy "Save Options") menu-bar-options-save |
| 708 | :help ,(purecopy "Save options set from the menu above"))) | 712 | :help ,(purecopy "Save options set from the menu above"))) |