From cced75847f64f1387ab3b4fac79034463afe1d93 Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Sat, 19 Jun 2010 18:36:51 -0400 Subject: 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. --- lisp/emacs-lisp/package-x.el | 3 ++ lisp/emacs-lisp/package.el | 104 +++++++++++++++++++++++++++++++++---------- 2 files changed, 84 insertions(+), 23 deletions(-) (limited to 'lisp/emacs-lisp') 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 @@ ;;; Code: +(require 'package) +(defvar gnus-article-buffer) + ;; Note that this only works if you have the password, which you ;; probably don't :-). (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\")." :version "24.1") (defvar Info-directory-list) -(defvar gnus-article-buffer) (declare-function info-initialize "info" ()) (declare-function url-http-parse-response "url-http" ()) (declare-function lm-header "lisp-mnt" (header)) @@ -423,33 +422,35 @@ updates `package-alist' and `package-obsolete-alist'." "Extract the kind of download from an archive package description vector." (aref desc 3)) -(defun package-activate-1 (package pkg-vec) - (let* ((pkg-name (symbol-name package)) - (pkg-ver-str (package-version-join (package-desc-vers pkg-vec))) +(defun package--dir (name version-string) + (let* ((subdir (concat name "-" version-string)) (dir-list (cons package-user-dir package-directory-list)) - (pkg-dir)) + pkg-dir) (while dir-list - (let ((subdir (expand-file-name (concat pkg-name "-" pkg-ver-str) - (car dir-list)))) - (if (file-directory-p subdir) - (progn - (setq pkg-dir subdir) - (setq dir-list nil)) + (let ((subdir-full (expand-file-name subdir (car dir-list)))) + (if (file-directory-p subdir-full) + (setq pkg-dir subdir-full + dir-list nil) (setq dir-list (cdr dir-list))))) + pkg-dir)) + +(defun package-activate-1 (package pkg-vec) + (let* ((name (symbol-name package)) + (version-str (package-version-join (package-desc-vers pkg-vec))) + (pkg-dir (package--dir name version-str))) (unless pkg-dir (error "Internal error: could not find directory for %s-%s" - pkg-name pkg-ver-str)) + name version-str)) + ;; Add info node. (if (file-exists-p (expand-file-name "dir" pkg-dir)) (progn ;; FIXME: not the friendliest, but simple. (require 'info) (info-initialize) (setq Info-directory-list (cons pkg-dir Info-directory-list)))) + ;; Add to load path, add autoloads, and activate the package. (setq load-path (cons pkg-dir load-path)) - ;; Load the autoloads and activate the package. - (load (expand-file-name (concat (symbol-name package) "-autoloads") - pkg-dir) - nil t) + (load (expand-file-name (concat name "-autoloads") pkg-dir) nil t) (setq package-activated-list (cons package package-activated-list)) ;; Don't return nil. t)) @@ -474,8 +475,7 @@ Return nil if the package could not be activated." (let* ((pkg-desc (assq package package-alist)) (this-version (package-desc-vers (cdr pkg-desc))) (req-list (package-desc-reqs (cdr pkg-desc))) - ;; If the package was never activated, we want to do it - ;; now. + ;; If the package was never activated, do it now. (keep-going (or (not (memq package package-activated-list)) (package-version-compare this-version version '>)))) (while (and req-list keep-going) @@ -1037,7 +1037,70 @@ The variable `package-load-list' controls which packages to load." package-alist)) +;;;; Package description buffer. +;;;###autoload +(defun describe-package (package) + "Display the full documentation of PACKAGE (a symbol)." + (interactive + (let* ((packages (append (mapcar 'car package-alist) + (mapcar 'car package-archive-contents))) + (guess (function-called-at-point)) + val) + (unless (memq guess packages) + (setq guess nil)) + (setq packages (mapcar 'symbol-name packages)) + (setq val + (completing-read (if guess + (format "Describe package (default %s): " + guess) + "Describe package: ") + packages nil t nil nil guess)) + (list (if (equal val "") + guess + (intern val))))) + (if (or (null package) (null (symbolp package))) + (message "You did not specify a package") + (help-setup-xref (list #'describe-package package) + (called-interactively-p 'interactive)) + (with-help-window (help-buffer) + (with-current-buffer standard-output + (describe-package-1 package))))) + +(defun describe-package-1 (package) + (let ((desc (cdr (assq package package-alist))) + version) + (prin1 package) + (princ " is ") + (cond + (desc + ;; This package is loaded (i.e. in `package-alist'). + (let (pkg-dir) + (setq version (package-version-join (package-desc-vers desc))) + (if (assq package package--builtins) + (princ "a built-in package.\n\n") + (setq pkg-dir (package--dir (symbol-name package) version)) + (if pkg-dir + (progn + (insert "a package installed in `") + (help-insert-xref-button (file-name-as-directory pkg-dir) + 'help-package-def pkg-dir) + (insert "'.\n\n")) + ;; This normally does not happen. + (insert "a deleted package.\n\n") + (setq version nil))))) + (t + ;; An uninstalled package. + (setq desc (cdr (assq package package-archive-contents))) + (setq version (package-version-join (package-desc-vers desc))) + (insert "a package that is not installed.\n\n"))) + (if version + (insert " Version: " version "\n")) + (insert " Description: " (package-desc-doc desc) "\n"))) +;; To do: add buttons for installing, uninstalling, etc. + + + ;;;; Package menu mode. (defvar package-menu-mode-map @@ -1443,11 +1506,6 @@ The list is displayed in a buffer named `*Packages*'." (interactive) (package--list-packages)) -;; Make it appear on the menu. -(define-key-after menu-bar-options-menu [package] - '(menu-item "Manage Packages" package-list-packages - :help "Install or uninstall additional Emacs packages")) - (provide 'package) ;;; package.el ends here -- cgit v1.2.3 From 8adb4c33da6fb4c3dfeb664152b0076e6d62fef8 Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Sun, 20 Jun 2010 00:55:14 -0400 Subject: 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. --- lisp/ChangeLog | 10 +++++++ lisp/emacs-lisp/package.el | 74 +++++++++++++++++++++++++++++++++++++++------- lisp/help-mode.el | 5 ++++ 3 files changed, 78 insertions(+), 11 deletions(-) (limited to 'lisp/emacs-lisp') diff --git a/lisp/ChangeLog b/lisp/ChangeLog index f4d0d1ac2b1..a1776062cda 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,13 @@ +2010-06-20 Chong Yidong + + * 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. + + * help-mode.el (help-package): New button type. + 2010-06-19 Chong Yidong * 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." (defun describe-package-1 (package) (let ((desc (cdr (assq package package-alist))) - version) + reqs version installable) (prin1 package) (princ " is ") (cond @@ -1091,14 +1091,51 @@ The variable `package-load-list' controls which packages to load." (setq version nil))))) (t ;; An uninstalled package. - (setq desc (cdr (assq package package-archive-contents))) - (setq version (package-version-join (package-desc-vers desc))) - (insert "a package that is not installed.\n\n"))) + (setq desc (cdr (assq package package-archive-contents)) + version (package-version-join (package-desc-vers desc)) + installable t) + (insert "an installable package.\n\n"))) (if version (insert " Version: " version "\n")) - (insert " Description: " (package-desc-doc desc) "\n"))) -;; To do: add buttons for installing, uninstalling, etc. - + (setq reqs (package-desc-reqs desc)) + (when reqs + (insert " Requires: ") + (let ((first t) + name vers text) + (dolist (req reqs) + (setq name (car req) + vers (cadr req) + text (format "%s-%s" (symbol-name name) + (package-version-join vers))) + (cond (first (setq first nil)) + ((>= (+ 2 (current-column) (length text)) + (window-width)) + (insert ",\n ")) + (t (insert ", "))) + (help-insert-xref-button text 'help-package name)) + (insert "\n"))) + (insert " Description: " (package-desc-doc desc) "\n") + ;; Todo: button for uninstalling a package. + (when installable + (let ((button-text (if (display-graphic-p) + "Install" + "[Install]")) + (button-face (if (display-graphic-p) + '(:box (:line-width 2 :color "dark grey") + :background "light grey" + :foreground "black") + 'link))) + (insert "\n") + (insert-text-button button-text + 'face button-face + 'follow-link t + 'package-symbol package + 'action (lambda (button) + (package-install + (button-get button 'package-symbol)) + (revert-buffer nil t) + (goto-char (point-min)))) + (insert "\n"))))) ;;;; Package menu mode. @@ -1107,6 +1144,7 @@ The variable `package-load-list' controls which packages to load." (let ((map (make-keymap)) (menu-map (make-sparse-keymap "Package"))) (suppress-keymap map) + (define-key map "\C-m" 'package-menu-describe-package) (define-key map "q" 'quit-window) (define-key map "n" 'next-line) (define-key map "p" 'previous-line) @@ -1208,6 +1246,14 @@ available for download." (interactive) (package-list-packages-internal)) +(defun package-menu-describe-package () + "Describe the package in the current line." + (interactive) + (let ((name (package-menu-get-package))) + (if name + (describe-package (intern name)) + (message "No package on this line")))) + (defun package-menu-mark-internal (what) (unless (eobp) (let ((buffer-read-only nil)) @@ -1286,7 +1332,7 @@ For larger packages, shows the README file." (save-excursion (beginning-of-line) (if (looking-at ". \\([^ \t]*\\)") - (match-string 1)))) + (match-string-no-properties 1)))) ;; Return the version of the package on the current line. (defun package-menu-get-version () @@ -1342,14 +1388,20 @@ Emacs." (t ; obsolete, but also the default. 'font-lock-warning-face)))) (insert (propertize " " 'font-lock-face face)) - (insert (propertize (symbol-name package) 'font-lock-face face)) + (insert-text-button (symbol-name package) + 'face 'link + 'follow-link t + 'package-symbol package + 'action (lambda (button) + (describe-package + (button-get button 'package-symbol)))) (indent-to 20 1) (insert (propertize (package-version-join version) 'font-lock-face face)) - (indent-to 30 1) + (indent-to 32 1) (insert (propertize key 'font-lock-face face)) ;; FIXME: this 'when' is bogus... (when desc - (indent-to 41 1) + (indent-to 43 1) (insert (propertize desc 'font-lock-face face))) (insert "\n"))) 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...).") (message "Unable to find location in file")))) 'help-echo (purecopy "mouse-2, RET: find face's definition")) +(define-button-type 'help-package + :supertype 'help-xref + 'help-function 'describe-package + 'help-echo (purecopy "mouse-2, RET: Describe package")) + (define-button-type 'help-package-def :supertype 'help-xref 'help-function (lambda (file) (dired file)) -- cgit v1.2.3 From 15b72850c180c790baeb5440f9d6b563d604d2d7 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Sat, 26 Jun 2010 20:49:18 +0200 Subject: Update cl-loaddefs.el --- lisp/emacs-lisp/cl-loaddefs.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lisp/emacs-lisp') diff --git a/lisp/emacs-lisp/cl-loaddefs.el b/lisp/emacs-lisp/cl-loaddefs.el index bdae05e7774..7640a0b1575 100644 --- a/lisp/emacs-lisp/cl-loaddefs.el +++ b/lisp/emacs-lisp/cl-loaddefs.el @@ -282,7 +282,7 @@ Not documented ;;;;;; flet progv psetq do-all-symbols do-symbols dotimes dolist ;;;;;; do* do loop return-from return block etypecase typecase ecase ;;;;;; case load-time-value eval-when destructuring-bind function* -;;;;;; defmacro* defun* gentemp gensym) "cl-macs" "cl-macs.el" "273ba25f4a116c61a464dbe55f1f8c63") +;;;;;; defmacro* defun* gentemp gensym) "cl-macs" "cl-macs.el" "49b7d96626dd8ba5d39551909edbd4c7") ;;; Generated autoloads from cl-macs.el (autoload 'gensym "cl-macs" "\ -- cgit v1.2.3 From a354ac6a0cffe3c2425bc272c64041aac9d0e2dd Mon Sep 17 00:00:00 2001 From: Leo Liu Date: Tue, 29 Jun 2010 14:09:07 +0200 Subject: emacs-lisp/rx.el (rx): Doc fix. (Bug#6537) --- lisp/ChangeLog | 4 ++++ lisp/emacs-lisp/rx.el | 3 --- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'lisp/emacs-lisp') diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 5bda792cfc0..540ab2f0d99 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2010-06-29 Leo (tiny change) + + * emacs-lisp/rx.el (rx): Doc fix. (Bug#6537) + 2010-06-27 Oleksandr Gavenko (tiny change) * generic-x.el (bat-generic-mode): Fix regexp for command line diff --git a/lisp/emacs-lisp/rx.el b/lisp/emacs-lisp/rx.el index 5d04494ecb6..85fe3514b01 100644 --- a/lisp/emacs-lisp/rx.el +++ b/lisp/emacs-lisp/rx.el @@ -1053,9 +1053,6 @@ CHAR like `and', but makes the match accessible with `match-end', `match-beginning', and `match-string'. -`(group SEXP1 SEXP2 ...)' - another name for `submatch'. - `(or SEXP1 SEXP2 ...)' `(| SEXP1 SEXP2 ...)' matches anything that matches SEXP1 or SEXP2, etc. If all -- cgit v1.2.3 From dce3463576bc49f60793cc4b8dc33c04c88ed256 Mon Sep 17 00:00:00 2001 From: Aleksei Gusev Date: Sat, 10 Jul 2010 15:47:59 -0400 Subject: Add compilation regexps for cucumber and ruby. * lisp/progmodes/compile.el (compilation-error-regexp-alist-alist): Add regexps for cucumber and ruby. --- lisp/ChangeLog | 5 +++++ lisp/emacs-lisp/cl-loaddefs.el | 2 +- lisp/progmodes/compile.el | 13 ++++++++++++- 3 files changed, 18 insertions(+), 2 deletions(-) (limited to 'lisp/emacs-lisp') diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 01ecaab86b6..fc5e087529e 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2010-07-10 Aleksei Gusev (tiny change) + + * progmodes/compile.el (compilation-error-regexp-alist-alist): Add + regexps for cucumber and ruby. + 2010-07-08 Daiki Ueno * epa-file.el (epa-file-error, epa-file--find-file-not-found-function) diff --git a/lisp/emacs-lisp/cl-loaddefs.el b/lisp/emacs-lisp/cl-loaddefs.el index ff0fa599985..b14c879fcf7 100644 --- a/lisp/emacs-lisp/cl-loaddefs.el +++ b/lisp/emacs-lisp/cl-loaddefs.el @@ -282,7 +282,7 @@ Not documented ;;;;;; flet progv psetq do-all-symbols do-symbols dotimes dolist ;;;;;; do* do loop return-from return block etypecase typecase ecase ;;;;;; case load-time-value eval-when destructuring-bind function* -;;;;;; defmacro* defun* gentemp gensym) "cl-macs" "cl-macs.el" "49b7d96626dd8ba5d39551909edbd4c7") +;;;;;; defmacro* defun* gentemp gensym) "cl-macs" "cl-macs.el" "36cafd5054969b5bb0b1ce6a21605fed") ;;; Generated autoloads from cl-macs.el (autoload 'gensym "cl-macs" "\ diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el index 7000b4bbc8a..76bd02615e3 100644 --- a/lisp/progmodes/compile.el +++ b/lisp/progmodes/compile.el @@ -196,6 +196,10 @@ of[ \t]+\"?\\([a-zA-Z]?:?[^\":\n]+\\)\"?:" 3 2 nil (1)) "^\"\\([^,\" \n\t]+\\)\", line \\([0-9]+\\)\ \\(?:[(. pos]+\\([0-9]+\\))?\\)?[:.,; (-]\\( warning:\\|[-0-9 ]*(W)\\)?" 1 2 3 (4)) + (cucumber + "\\(?:^cucumber\\(?: -p [^[:space:]]+\\)?\\|#\\)\ +\\(?: \\)\\([^\(].*\\):\\([1-9][0-9]*\\)" 1 2) + (edg-1 "^\\([^ \n]+\\)(\\([0-9]+\\)): \\(?:error\\|warnin\\(g\\)\\|remar\\(k\\)\\)" 1 2 nil (3 . 4)) @@ -325,6 +329,13 @@ during global destruction\\.$\\)" 1 2) "\\(?:Parse\\|Fatal\\) error: \\(.*\\) in \\(.*\\) on line \\([0-9]+\\)" 2 3 nil nil) + (ruby + "^[\t ]*\\(?:from \\)?\ +\\([^\(\n][^[:space:]\n]*\\):\\([1-9][0-9]*\\)\\(:in `.*'\\)?.*$" 1 2) + + (ruby-Test::Unit + "[\t ]*\\[\\([^\(].*\\):\\([1-9][0-9]*\\)\\(\\]\\)?:$" 1 2) + (rxp "^\\(?:Error\\|Warnin\\(g\\)\\):.*\n.* line \\([0-9]+\\) char\ \\([0-9]+\\) of file://\\(.+\\)" @@ -2083,7 +2094,7 @@ and overlay is highlighted between MK and END-MK." pre-existing (let ((display-buffer-reuse-frames t) (pop-up-windows t)) - ;; Pop up a window. + ;; Pop up a window. (display-buffer (marker-buffer msg))))) (highlight-regexp (with-current-buffer (marker-buffer msg) ;; also do this while we change buffer -- cgit v1.2.3