comparison lisp/package-ui.el @ 375:a300bb07d72d r21-2b3

Import from CVS: tag r21-2b3
author cvs
date Mon, 13 Aug 2007 11:04:51 +0200
parents 6240c7796c7a
children d883f39b8495
comparison
equal deleted inserted replaced
374:4ebeb1a5388b 375:a300bb07d72d
28 28
29 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 29 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
30 ;; User-changeable variables: 30 ;; User-changeable variables:
31 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 31 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32 32
33 (defvar pui-up-to-date-package-face nil 33 (defgroup pui nil
34 "The face to use for packages that are up-to-date.") 34 "Conventient interface to the package system."
35 35 :group 'package-tools
36 (defvar pui-selected-package-face (get-face 'bold) 36 :tag "Package User interface"
37 "The face to use for selected packages. 37 :prefix "pui-")
38 Set this to `nil' to use the `default' face.") 38
39 39 (defcustom pui-package-install-dest-dir nil
40 (defvar pui-outdated-package-face (get-face 'red) 40 "*If non-nil (Automatic) path to package tree to install packages in.
41 "The face to use for outdated packages. 41 Otherwise, use old path for installed packages and make a guess for
42 Set this to `nil' to use the `default' face.") 42 new ones."
43 43 :group 'pui
44 (defvar pui-uninstalled-package-face (get-face 'italic) 44 :tag "Install Location"
45 "The face to use for uninstalled packages. 45 :type '(choice (const :tag "Automatic" nil)
46 Set this to `nil' to use the `default' face.") 46 (directory)))
47 47
48 (defvar pui-list-verbose t 48 (defcustom pui-list-verbose t
49 "If non-nil, display verbose info in the package list buffer.") 49 "*If non-nil, display verbose info in the package list buffer."
50 :group 'pui
51 :tag "Verbose Listing"
52 :type 'boolean)
53
54 (defcustom pui-up-to-date-package-face nil
55 "*The face to use for packages that are up-to-date."
56 :group 'pui
57 :type 'face)
58
59 (defcustom pui-selected-package-face 'bold
60 "*The face to use for selected packages.
61 Set this to `nil' to use the `default' face."
62 :group 'pui
63 :type 'face)
64
65 (defcustom pui-outdated-package-face 'red
66 "*The face to use for outdated packages.
67 Set this to `nil' to use the `default' face."
68 :group 'pui
69 :type 'face)
70
71 (defcustom pui-uninstalled-package-face 'italic
72 "*The face to use for uninstalled packages.
73 Set this to `nil' to use the `default' face."
74 :group 'pui
75 :type 'face)
76
77
78
50 79
51 (defvar pui-info-buffer "*Packages*" 80 (defvar pui-info-buffer "*Packages*"
52 "Buffer to use for displaying package information.") 81 "Buffer to use for displaying package information.")
53 82
54 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 83 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
69 (define-key m "v" 'pui-toggle-verbosity-redisplay) 98 (define-key m "v" 'pui-toggle-verbosity-redisplay)
70 (define-key m "d" 'pui-toggle-verbosity-redisplay) 99 (define-key m "d" 'pui-toggle-verbosity-redisplay)
71 (define-key m [return] 'pui-toggle-package-key) 100 (define-key m [return] 'pui-toggle-package-key)
72 (define-key m "x" 'pui-install-selected-packages) 101 (define-key m "x" 'pui-install-selected-packages)
73 (define-key m "I" 'pui-install-selected-packages) 102 (define-key m "I" 'pui-install-selected-packages)
103 (define-key m "r" 'pui-add-required-packages)
74 (define-key m "n" 'next-line) 104 (define-key m "n" 'next-line)
75 (define-key m "+" 'next-line) 105 (define-key m "+" 'next-line)
76 (define-key m "p" 'previous-line) 106 (define-key m "p" 'previous-line)
77 (define-key m "-" 'previous-line) 107 (define-key m "-" 'previous-line)
78 m) 108 m)
80 110
81 (defvar pui-package-keymap 111 (defvar pui-package-keymap
82 (let ((m (make-sparse-keymap))) 112 (let ((m (make-sparse-keymap)))
83 (set-keymap-name m 'pui-package-keymap) 113 (set-keymap-name m 'pui-package-keymap)
84 (define-key m 'button2 'pui-toggle-package-event) 114 (define-key m 'button2 'pui-toggle-package-event)
85 (define-key m 'button3 'pui-toggle-package-event) 115 ;; We use a popup menu
116 ;; (define-key m 'button3 'pui-toggle-package-event)
86 m) 117 m)
87 "Keymap to use over package names/descriptions.") 118 "Keymap to use over package names/descriptions.")
88 119
89 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 120 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
90 ;; End of variables 121 ;; End of variables
207 (setq sym-char "+") 238 (setq sym-char "+")
208 ) 239 )
209 (progn 240 (progn
210 (setq disp (pui-package-symbol-char pkg-sym version)) 241 (setq disp (pui-package-symbol-char pkg-sym version))
211 (setq sym-char (car disp)) 242 (setq sym-char (car disp))
212 (if (cdr disp) 243 (if (car (cdr disp))
213 (set-extent-face extent (car (cdr disp))) 244 (set-extent-face extent (get-face (car (cdr disp))))
214 (set-extent-face extent (get-face 'default))) 245 (set-extent-face extent (get-face 'default)))
215 )) 246 ))
216 (save-excursion 247 (save-excursion
217 (goto-char (extent-start-position extent)) 248 (goto-char (extent-start-position extent))
218 (delete-char 1) 249 (delete-char 1)
299 (erase-buffer package-admin-temp-buffer) 330 (erase-buffer package-admin-temp-buffer)
300 ) 331 )
301 (message "Installing selected packages ...") (sit-for 0) 332 (message "Installing selected packages ...") (sit-for 0)
302 (if (catch 'done 333 (if (catch 'done
303 (mapcar (lambda (pkg) 334 (mapcar (lambda (pkg)
304 (if (not (package-get-all pkg nil)) 335 (if (not (package-get pkg
336 pui-package-install-dest-dir))
305 (throw 'done nil))) 337 (throw 'done nil)))
306 pui-selected-packages) 338 pui-selected-packages)
307 t) 339 t)
308 (progn 340 (progn
309 (pui-list-packages) 341 (pui-list-packages)
313 (clear-message) 345 (clear-message)
314 ) 346 )
315 ) 347 )
316 (error "No packages have been selected!")) 348 (error "No packages have been selected!"))
317 )) 349 ))
350
351 (defun pui-add-required-packages ()
352 "Select packages required by those already selected for installation."
353 (interactive)
354 (let ((tmpbuf "*Required-Packages*") do-select)
355 (if pui-selected-packages
356 (let ((dependencies (package-get-dependencies pui-selected-packages)))
357 ;; Don't change window config when asking the user if he really
358 ;; wants to add the packages. We do this to avoid messing up
359 ;; the window configuration if errors occur (we don't want to
360 ;; display random buffers in addition to the error buffer, if
361 ;; errors occur, which would normally be caused by display-buffer).
362 (save-window-excursion
363 (with-output-to-temp-buffer tmpbuf
364 (display-completion-list (sort
365 (mapcar #'(lambda (pkg)
366 (symbol-name pkg))
367 dependencies)
368 'string<)
369 :activate-callback nil
370 :help-string "Required packages:\n"
371 :completion-string t))
372 (setq tmpbuf (get-buffer-create tmpbuf))
373 (display-buffer tmpbuf)
374 (setq do-select (y-or-n-p "Select these packages? "))
375 (kill-buffer tmpbuf))
376 (if do-select
377 (progn
378 (setq pui-selected-packages
379 (union pui-selected-packages dependencies))
380 (map-extents #'(lambda (extent maparg)
381 (pui-update-package-display extent))
382 nil nil nil nil nil 'pui)
383 (message "added dependencies"))
384 (clear-message)))
385 (error "No packages have been selected!"))))
318 386
319 (defun pui-help-echo (extent &optional force-update) 387 (defun pui-help-echo (extent &optional force-update)
320 "Display additional package info in the modeline. 388 "Display additional package info in the modeline.
321 EXTENT determines the package to display (the package information is 389 EXTENT determines the package to display (the package information is
322 attached to the extent as properties)." 390 attached to the extent as properties)."
369 available. 437 available.
370 438
371 Useful keys: 439 Useful keys:
372 440
373 `\\[pui-toggle-package-key]' to select/unselect the current package for installation. 441 `\\[pui-toggle-package-key]' to select/unselect the current package for installation.
442 `\\[pui-add-required-packages]' to add any packages required by those selected.
374 `\\[pui-install-selected-packages]' to install selected packages. 443 `\\[pui-install-selected-packages]' to install selected packages.
375 `\\[pui-display-info]' to display additional information about the package in the modeline. 444 `\\[pui-display-info]' to display additional information about the package in the modeline.
376 `\\[pui-list-packages]' to refresh the package list. 445 `\\[pui-list-packages]' to refresh the package list.
377 `\\[pui-toggle-verbosity-redisplay]' to toggle between a verbose and non-verbose display. 446 `\\[pui-toggle-verbosity-redisplay]' to toggle between a verbose and non-verbose display.
378 `\\[pui-quit]' to kill this buffer. 447 `\\[pui-quit]' to kill this buffer.
379 ") 448 ")
380 )) 449 ))
450
451 (defvar pui-menu
452 '("Packages"
453 ["Select" pui-toggle-package-key t]
454 ["Info" pui-display-info t]
455 "---"
456 ["Add Required" pui-add-required-packages t]
457 ["Install Selected" pui-install-selected-packages t]
458 "---"
459 ["Verbose" pui-toggle-verbosity-redisplay
460 :active t :style toggle :selected pui-list-verbose]
461 ["Refresh" pui-list-packages t]
462 ["Help" pui-help t]
463 ["Quit" pui-quit t]))
464
381 465
382 ;;;###autoload 466 ;;;###autoload
383 (defun pui-list-packages () 467 (defun pui-list-packages ()
384 "List all packages and package information. 468 "List all packages and package information.
385 The package name, version, and description are displayed. From the displayed 469 The package name, version, and description are displayed. From the displayed
386 buffer, the user can see which packages are installed, which are not, and 470 buffer, the user can see which packages are installed, which are not, and
387 which are out-of-date (a newer version is available). The user can then 471 which are out-of-date (a newer version is available). The user can then
388 select packages for installation via the keyboard or mouse." 472 select packages for installation via the keyboard or mouse."
389 (interactive) 473 (interactive)
474 (package-get-require-base)
390 (let ( (outbuf (get-buffer-create pui-info-buffer)) 475 (let ( (outbuf (get-buffer-create pui-info-buffer))
391 (sep-string "===============================================================================\n") 476 (sep-string "===============================================================================\n")
392 start ) 477 start )
393 (message "Creating package list ...") (sit-for 0) 478 (message "Creating package list ...") (sit-for 0)
394 (set-buffer outbuf) 479 (set-buffer outbuf)
450 (forward-line -1) 535 (forward-line -1)
451 (end-of-line) 536 (end-of-line)
452 (point))) 537 (point)))
453 ) 538 )
454 (setq extent (make-extent b e)) 539 (setq extent (make-extent b e))
455 (if (cdr disp) 540 (if (car (cdr disp))
456 (set-extent-face extent (car (cdr disp))) 541 (set-extent-face extent (get-face (car (cdr disp))))
457 (set-extent-face extent (get-face 'default))) 542 (set-extent-face extent (get-face 'default)))
458 (set-extent-property extent 'highlight t) 543 (set-extent-property extent 'highlight t)
459 (set-extent-property extent 'pui t) 544 (set-extent-property extent 'pui t)
460 (set-extent-property extent 'pui-package pkg-sym) 545 (set-extent-property extent 'pui-package pkg-sym)
461 (set-extent-property extent 'pui-info info) 546 (set-extent-property extent 'pui-info info)
472 (setq buffer-read-only t) 557 (setq buffer-read-only t)
473 (pop-to-buffer outbuf) 558 (pop-to-buffer outbuf)
474 (delete-other-windows) 559 (delete-other-windows)
475 (goto-char start) 560 (goto-char start)
476 (setq pui-selected-packages nil) ; Reset list 561 (setq pui-selected-packages nil) ; Reset list
562 (when (featurep 'menubar)
563 (set-buffer-menubar current-menubar)
564 (add-submenu '() pui-menu)
565 (setq mode-popup-menu pui-menu))
477 (clear-message) 566 (clear-message)
478 ; (message (substitute-command-keys "Press `\\[pui-help]' for help.")) 567 ; (message (substitute-command-keys "Press `\\[pui-help]' for help."))
479 )) 568 ))
480 569
570
481 (provide 'package-ui) 571 (provide 'package-ui)
482 572
483 ;;; package-ui.el ends here 573 ;;; package-ui.el ends here