aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChong Yidong2010-06-19 18:36:51 -0400
committerChong Yidong2010-06-19 18:36:51 -0400
commitcced75847f64f1387ab3b4fac79034463afe1d93 (patch)
treea9963de44384d75054a502e45b0d720a3d72b115
parentd4aaac0f37d3e6e386c826575be8294a7dd4d2a3 (diff)
downloademacs-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/ChangeLog14
-rw-r--r--lisp/emacs-lisp/package-x.el3
-rw-r--r--lisp/emacs-lisp/package.el104
-rw-r--r--lisp/help-mode.el5
-rw-r--r--lisp/menu-bar.el4
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 @@
12010-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
12010-06-19 Gustav HÃ¥llberg <gustav@gmail.com> (tiny change) 152010-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")))