Mercurial > hg > xemacs-beta
comparison lisp/package-ui.el @ 384:bbff43aa5eb7 r21-2-7
Import from CVS: tag r21-2-7
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:08:24 +0200 |
parents | d883f39b8495 |
children | 7d59cb494b73 |
comparison
equal
deleted
inserted
replaced
383:6a50c6a581a5 | 384:bbff43aa5eb7 |
---|---|
60 "*The face to use for selected packages. | 60 "*The face to use for selected packages. |
61 Set this to `nil' to use the `default' face." | 61 Set this to `nil' to use the `default' face." |
62 :group 'pui | 62 :group 'pui |
63 :type 'face) | 63 :type 'face) |
64 | 64 |
65 (defcustom pui-deleted-package-face 'blue | |
66 "*The face to use for packages marked for removal. | |
67 Set this to `nil' to use the `default' face." | |
68 :group 'pui | |
69 :type 'face) | |
70 | |
65 (defcustom pui-outdated-package-face 'red | 71 (defcustom pui-outdated-package-face 'red |
66 "*The face to use for outdated packages. | 72 "*The face to use for outdated packages. |
67 Set this to `nil' to use the `default' face." | 73 Set this to `nil' to use the `default' face." |
68 :group 'pui | 74 :group 'pui |
69 :type 'face) | 75 :type 'face) |
85 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 91 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
86 | 92 |
87 (defvar pui-selected-packages nil | 93 (defvar pui-selected-packages nil |
88 "The list of user-selected packages to install.") | 94 "The list of user-selected packages to install.") |
89 | 95 |
96 (defvar pui-deleted-packages nil | |
97 "The list of user-selected packages to remove.") | |
98 | |
99 (defvar pui-actual-package "") | |
100 | |
90 (defvar pui-display-keymap | 101 (defvar pui-display-keymap |
91 (let ((m (make-keymap))) | 102 (let ((m (make-keymap))) |
92 (suppress-keymap m) | 103 (suppress-keymap m) |
93 (set-keymap-name m 'pui-display-keymap) | 104 (set-keymap-name m 'pui-display-keymap) |
94 (define-key m "q" 'pui-quit) | 105 (define-key m "q" 'pui-quit) |
95 (define-key m "g" 'pui-list-packages) | 106 (define-key m "g" 'pui-list-packages) |
96 (define-key m " " 'pui-display-info) | 107 (define-key m "i" 'pui-display-info) |
97 (define-key m "?" 'pui-help) | 108 (define-key m "?" 'describe-mode) |
98 (define-key m "v" 'pui-toggle-verbosity-redisplay) | 109 (define-key m "v" 'pui-toggle-verbosity-redisplay) |
99 (define-key m "d" 'pui-toggle-verbosity-redisplay) | 110 (define-key m "d" 'pui-toggle-package-delete-key) |
111 (define-key m "D" 'pui-toggle-package-delete-key) | |
100 (define-key m [return] 'pui-toggle-package-key) | 112 (define-key m [return] 'pui-toggle-package-key) |
101 (define-key m "x" 'pui-install-selected-packages) | 113 (define-key m "x" 'pui-install-selected-packages) |
102 (define-key m "I" 'pui-install-selected-packages) | 114 (define-key m "I" 'pui-install-selected-packages) |
103 (define-key m "r" 'pui-add-required-packages) | 115 (define-key m "r" 'pui-add-required-packages) |
104 (define-key m "n" 'next-line) | 116 (define-key m "n" 'next-line) |
105 (define-key m "+" 'next-line) | 117 (define-key m "+" 'pui-toggle-package-key) |
106 (define-key m "p" 'previous-line) | 118 (define-key m "p" 'previous-line) |
107 (define-key m "-" 'previous-line) | 119 (define-key m " " 'scroll-up-command) |
120 (define-key m [delete] 'scroll-down-command) | |
108 m) | 121 m) |
109 "Keymap to use in the `pui-info-buffer' buffer") | 122 "Keymap to use in the `pui-info-buffer' buffer") |
110 | 123 |
111 (defvar pui-package-keymap | 124 (defvar pui-package-keymap |
112 (let ((m (make-sparse-keymap))) | 125 (let ((m (make-sparse-keymap))) |
113 (set-keymap-name m 'pui-package-keymap) | 126 (set-keymap-name m 'pui-package-keymap) |
114 (define-key m 'button2 'pui-toggle-package-event) | 127 (define-key m 'button2 'pui-toggle-package-event) |
115 ;; We use a popup menu | 128 ;; We use a popup menu |
116 ;; (define-key m 'button3 'pui-toggle-package-event) | 129 (define-key m 'button3 'pui-popup-context-sensitive) |
117 m) | 130 m) |
118 "Keymap to use over package names/descriptions.") | 131 "Keymap to use over package names/descriptions.") |
119 | 132 |
120 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 133 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
121 ;; End of variables | 134 ;; End of variables |
156 (setq paths (cdr paths)) | 169 (setq paths (cdr paths)) |
157 ) | 170 ) |
158 (insert "\nThese are the places that will be searched for package binaries.\n") | 171 (insert "\nThese are the places that will be searched for package binaries.\n") |
159 (goto-char (point-min)) | 172 (goto-char (point-min)) |
160 )) | 173 )) |
174 | |
175 ;;;###autoload | |
176 (defun package-ui-add-site (site) | |
177 "Add site to package-get-remote and possibly offer to update package list." | |
178 (let ((had-none (null package-get-remote))) | |
179 (push site package-get-remote) | |
180 (when (and had-none package-get-was-current | |
181 (y-or-n-p "Update Package list?")) | |
182 (setq package-get-was-current nil) | |
183 (package-get-require-base t) | |
184 (if (get-buffer pui-info-buffer) | |
185 (save-window-excursion | |
186 (pui-list-packages)))) | |
187 (set-menubar-dirty-flag))) | |
188 | |
161 | 189 |
162 ;;;###autoload | 190 ;;;###autoload |
163 (defun pui-add-install-directory (dir) | 191 (defun pui-add-install-directory (dir) |
164 "Add a new package binary directory to the head of `package-get-remote'. | 192 "Add a new package binary directory to the head of `package-get-remote'. |
165 Note that no provision is made for saving any changes made by this function. | 193 Note that no provision is made for saving any changes made by this function. |
196 | 224 |
197 (defun pui-quit () | 225 (defun pui-quit () |
198 (interactive) | 226 (interactive) |
199 (kill-buffer nil)) | 227 (kill-buffer nil)) |
200 | 228 |
201 (defun pui-help () | |
202 (interactive) | |
203 (let ( (help-buffer (get-buffer-create "*Help*")) ) | |
204 (display-buffer help-buffer t) | |
205 (save-window-excursion | |
206 (set-buffer help-buffer) | |
207 (buffer-disable-undo help-buffer) | |
208 (erase-buffer help-buffer) | |
209 (insert (pui-help-string)) | |
210 ) | |
211 )) | |
212 | |
213 (defun pui-package-symbol-char (pkg-sym version) | 229 (defun pui-package-symbol-char (pkg-sym version) |
214 (progn | 230 (progn |
215 (if (package-get-info-find-package packages-package-list pkg-sym) | 231 (if (package-get-info-find-package packages-package-list pkg-sym) |
216 (let ((installed (package-get-key pkg-sym :version))) | 232 (let ((installed (package-get-key pkg-sym :version))) |
217 (if (>= (if (stringp installed) | 233 (if (>= (if (stringp installed) |
234 (if (not pkg-sym) | 250 (if (not pkg-sym) |
235 (setq pkg-sym (extent-property extent 'pui-package))) | 251 (setq pkg-sym (extent-property extent 'pui-package))) |
236 (if (not version) | 252 (if (not version) |
237 (setq version (package-get-info-prop (extent-property extent 'pui-info) | 253 (setq version (package-get-info-prop (extent-property extent 'pui-info) |
238 'version))) | 254 'version))) |
239 (if (member pkg-sym pui-selected-packages) | 255 (cond ((member pkg-sym pui-selected-packages) |
240 (progn | 256 (if pui-selected-package-face |
241 (if pui-selected-package-face | 257 (set-extent-face extent (get-face pui-selected-package-face)) |
242 (set-extent-face extent (get-face pui-selected-package-face)) | 258 (set-extent-face extent (get-face 'default))) |
243 (set-extent-face extent (get-face 'default))) | 259 (setq sym-char "+")) |
244 (setq sym-char "+") | 260 ((member pkg-sym pui-deleted-packages) |
245 ) | 261 (if pui-deleted-package-face |
246 (progn | 262 (set-extent-face extent (get-face pui-deleted-package-face)) |
247 (setq disp (pui-package-symbol-char pkg-sym version)) | 263 (set-extent-face extent (get-face 'default))) |
248 (setq sym-char (car disp)) | 264 (setq sym-char "D")) |
249 (if (car (cdr disp)) | 265 (t |
250 (set-extent-face extent (get-face (car (cdr disp)))) | 266 (setq disp (pui-package-symbol-char pkg-sym version)) |
251 (set-extent-face extent (get-face 'default))) | 267 (setq sym-char (car disp)) |
252 )) | 268 (if (car (cdr disp)) |
269 (set-extent-face extent (get-face (car (cdr disp)))) | |
270 (set-extent-face extent (get-face 'default))))) | |
253 (save-excursion | 271 (save-excursion |
254 (goto-char (extent-start-position extent)) | 272 (goto-char (extent-start-position extent)) |
255 (delete-char 1) | 273 (delete-char 1) |
256 (insert sym-char) | 274 (insert sym-char) |
257 (set-buffer-modified-p nil) | 275 (set-buffer-modified-p nil) |
263 (setq pkg-sym (extent-property extent 'pui-package)) | 281 (setq pkg-sym (extent-property extent 'pui-package)) |
264 (if (member pkg-sym pui-selected-packages) | 282 (if (member pkg-sym pui-selected-packages) |
265 (setq pui-selected-packages | 283 (setq pui-selected-packages |
266 (delete pkg-sym pui-selected-packages)) | 284 (delete pkg-sym pui-selected-packages)) |
267 (setq pui-selected-packages | 285 (setq pui-selected-packages |
268 (cons pkg-sym pui-selected-packages))) | 286 (cons pkg-sym pui-selected-packages)) |
287 (setq pui-deleted-packages | |
288 (delete pkg-sym pui-deleted-packages))) | |
269 (pui-update-package-display extent pkg-sym) | 289 (pui-update-package-display extent pkg-sym) |
270 )) | 290 )) |
271 | 291 |
272 (defun pui-toggle-package-key () | 292 (defun pui-toggle-package-key () |
273 "Select/unselect package for installation, using the keyboard." | 293 "Select/unselect package for installation, using the keyboard." |
279 (forward-line 1) | 299 (forward-line 1) |
280 ) | 300 ) |
281 (error "No package under cursor!")) | 301 (error "No package under cursor!")) |
282 )) | 302 )) |
283 | 303 |
304 (defun pui-toggle-package-delete (extent) | |
305 (let (pkg-sym) | |
306 (setq pkg-sym (extent-property extent 'pui-package)) | |
307 (if (member pkg-sym pui-deleted-packages) | |
308 (setq pui-deleted-packages | |
309 (delete pkg-sym pui-deleted-packages)) | |
310 (setq pui-deleted-packages | |
311 (cons pkg-sym pui-deleted-packages)) | |
312 (setq pui-seleted-packages | |
313 (delete pkg-sym pui-selected-packages))) | |
314 (pui-update-package-display extent pkg-sym) | |
315 )) | |
316 | |
317 | |
318 (defun pui-toggle-package-delete-key () | |
319 "Select/unselect package for removal, using the keyboard." | |
320 (interactive) | |
321 (let (extent) | |
322 (if (setq extent (extent-at (point) (current-buffer) 'pui)) | |
323 (progn | |
324 (pui-toggle-package-delete extent) | |
325 (forward-line 1) | |
326 ) | |
327 (error "No package under cursor!")) | |
328 )) | |
329 | |
330 (defun pui-current-package () | |
331 (let ((extent (extent-at (point) (current-buffer) 'pui))) | |
332 (if extent | |
333 (extent-property extent 'pui-package)))) | |
334 | |
284 (defun pui-toggle-package-event (event) | 335 (defun pui-toggle-package-event (event) |
285 "Select/unselect package for installation, using the mouse." | 336 "Select/unselect package for installation, using the mouse." |
286 (interactive "e") | 337 (interactive "e") |
287 (let* ( (ep (event-point event)) | 338 (let* ( (ep (event-point event)) |
288 (buffer (window-buffer (event-window event))) | 339 (buffer (window-buffer (event-window event))) |
300 )) | 351 )) |
301 | 352 |
302 (defun pui-install-selected-packages () | 353 (defun pui-install-selected-packages () |
303 "Install selected packages." | 354 "Install selected packages." |
304 (interactive) | 355 (interactive) |
356 (let ( (tmpbuf "*Packages-To-Remove*") do-delete) | |
357 (when pui-deleted-packages | |
358 (save-window-excursion | |
359 (with-output-to-temp-buffer tmpbuf | |
360 (display-completion-list (sort | |
361 (mapcar '(lambda (pkg) | |
362 (symbol-name pkg) | |
363 ) | |
364 pui-deleted-packages) | |
365 'string<) | |
366 :activate-callback nil | |
367 :help-string "Packages selected for removal:\n" | |
368 :completion-string t | |
369 )) | |
370 (setq tmpbuf (get-buffer-create tmpbuf)) | |
371 (display-buffer tmpbuf) | |
372 (setq do-delete (yes-or-no-p "Remove these packages? ")) | |
373 (kill-buffer tmpbuf)) | |
374 (when do-delete | |
375 (message "Deleting selected packages ...") (sit-for 0) | |
376 (when (catch 'done | |
377 (mapcar (lambda (pkg) | |
378 (if (not | |
379 (package-admin-delete-binary-package | |
380 pkg (package-admin-get-install-dir pkg nil))) | |
381 (throw 'done nil))) | |
382 pui-deleted-packages) | |
383 t) | |
384 (message "Packages deleted") | |
385 )))) | |
386 | |
305 (let ( (tmpbuf "*Packages-To-Install*") do-install) | 387 (let ( (tmpbuf "*Packages-To-Install*") do-install) |
306 (if pui-selected-packages | 388 (if pui-selected-packages |
307 (progn | 389 (progn |
308 ;; Don't change window config when asking the user if he really | 390 ;; Don't change window config when asking the user if he really |
309 ;; wants to install the packages. We do this to avoid messing up | 391 ;; wants to install the packages. We do this to avoid messing up |
349 )) | 431 )) |
350 ) | 432 ) |
351 (clear-message) | 433 (clear-message) |
352 ) | 434 ) |
353 ) | 435 ) |
354 (error "No packages have been selected!")) | 436 (if pui-deleted-packages |
437 (pui-list-packages) | |
438 (error "No packages have been selected!"))) | |
355 )) | 439 )) |
356 | 440 |
357 (defun pui-add-required-packages () | 441 (defun pui-add-required-packages () |
358 "Select packages required by those already selected for installation." | 442 "Select packages required by those already selected for installation." |
359 (interactive) | 443 (interactive) |
432 (format "%-6s: %-8s %11s: %s" | 516 (format "%-6s: %-8s %11s: %s" |
433 inst-ver auth-ver date maintainer)) | 517 inst-ver auth-ver date maintainer)) |
434 )) | 518 )) |
435 )) | 519 )) |
436 | 520 |
437 (defun pui-display-info (&optional no-error) | 521 (defun pui-display-info (&optional no-error event) |
438 "Display additional package info in the modeline. | 522 "Display additional package info in the modeline. |
439 Designed to be called interactively (from a keypress)." | 523 Designed to be called interactively (from a keypress)." |
440 (interactive) | 524 (interactive) |
441 (let (extent) | 525 (let (extent) |
442 (save-excursion | 526 (save-excursion |
443 (beginning-of-line) | 527 (beginning-of-line) |
444 (if (setq extent (extent-at (point) (current-buffer) 'pui)) | 528 (if (setq extent (extent-at (point) (current-buffer) 'pui)) |
445 (message (pui-help-echo extent t)) | 529 (message (pui-help-echo extent t)) |
446 (if no-error | 530 (if no-error |
447 (clear-message nil) | 531 (clear-message nil) |
448 (error "No package under cursor!"))) | 532 (error "No package under cursor!"))) |
449 ))) | 533 ))) |
450 | 534 |
451 (defun pui-help-string () | 535 ;;; "Why is there no standard function to do this?" |
452 "Return the help string for the package-info buffer. | 536 (defun pui-popup-context-sensitive (event) |
453 This is not a defconst because of the call to substitute-command-keys." | 537 (interactive "e") |
454 (save-excursion | 538 (save-excursion |
455 (set-buffer (get-buffer pui-info-buffer)) | 539 (set-buffer (event-buffer event)) |
456 (substitute-command-keys | 540 (goto-char (event-point event)) |
457 "Symbols in the leftmost column: | 541 (popup-menu pui-menu event) |
458 | 542 ;; I agreee with dired.el this is seriously bogus. |
459 + The package is marked for installation. | 543 (while (popup-menu-up-p) |
460 - The package has not been installed. | 544 (dispatch-event (next-event))))) |
461 * The currently installed package is old, and a newer version is | |
462 available. | |
463 | |
464 Useful keys: | |
465 | |
466 `\\[pui-toggle-package-key]' to select/unselect the current package for installation. | |
467 `\\[pui-add-required-packages]' to add any packages required by those selected. | |
468 `\\[pui-install-selected-packages]' to install selected packages. | |
469 `\\[pui-display-info]' to display additional information about the package in the modeline. | |
470 `\\[pui-list-packages]' to refresh the package list. | |
471 `\\[pui-toggle-verbosity-redisplay]' to toggle between a verbose and non-verbose display. | |
472 `\\[pui-quit]' to kill this buffer. | |
473 ") | |
474 )) | |
475 | 545 |
476 (defvar pui-menu | 546 (defvar pui-menu |
477 '("Packages" | 547 '("Packages" |
478 ["Select" pui-toggle-package-key t] | 548 ["Toggle install " pui-toggle-package-key :active (pui-current-package) :suffix (format "`%s'" (or (pui-current-package) "..."))] |
479 ["Info" pui-display-info t] | 549 ["Toggle delete " pui-toggle-package-delete-key :active (pui-current-package) :suffix (format "`%s'" (or (pui-current-package) "..."))] |
550 ["Info on" pui-display-info :active (pui-current-package) :suffix (format "`%s'" (or (pui-current-package) "..."))] | |
480 "---" | 551 "---" |
481 ["Add Required" pui-add-required-packages t] | 552 ["Add Required" pui-add-required-packages t] |
482 ["Install Selected" pui-install-selected-packages t] | 553 ["Install/Remove Selected" pui-install-selected-packages t] |
483 "---" | 554 "---" |
484 ["Verbose" pui-toggle-verbosity-redisplay | 555 ["Verbose" pui-toggle-verbosity-redisplay |
485 :active t :style toggle :selected pui-list-verbose] | 556 :active t :style toggle :selected pui-list-verbose] |
486 ["Refresh" pui-list-packages t] | 557 ["Refresh" pui-list-packages t] |
487 ["Help" pui-help t] | 558 ["Help" pui-help t] |
488 ["Quit" pui-quit t])) | 559 ["Quit" pui-quit t])) |
489 | 560 |
561 | |
562 (defun list-packages-mode () | |
563 "Symbols in the leftmost column: | |
564 | |
565 + The package is marked for installation. | |
566 - The package has not been installed. | |
567 D The package has been marked for deletion. | |
568 * The currently installed package is old, and a newer version is | |
569 available. | |
570 | |
571 Useful keys: | |
572 | |
573 `\\[pui-toggle-package-key]' to select/unselect the current package for installation. | |
574 `\\[pui-toggle-package-delete-key]' to select/unselect the current package for removal. | |
575 `\\[pui-add-required-packages]' to add any packages required by those selected. | |
576 `\\[pui-install-selected-packages]' to install/delete selected packages. | |
577 `\\[pui-display-info]' to display additional information about the package in the modeline. | |
578 `\\[pui-list-packages]' to refresh the package list. | |
579 `\\[pui-toggle-verbosity-redisplay]' to toggle between a verbose and non-verbose display. | |
580 `\\[pui-quit]' to kill this buffer. | |
581 " | |
582 (error "You cannot enter this mode directly. Use `pui-list-packages'")) | |
583 | |
584 (put 'list-packages-mode 'mode-class 'special) | |
490 | 585 |
491 ;;;###autoload | 586 ;;;###autoload |
492 (defun pui-list-packages () | 587 (defun pui-list-packages () |
493 "List all packages and package information. | 588 "List all packages and package information. |
494 The package name, version, and description are displayed. From the displayed | 589 The package name, version, and description are displayed. From the displayed |
503 (message "Creating package list ...") (sit-for 0) | 598 (message "Creating package list ...") (sit-for 0) |
504 (set-buffer outbuf) | 599 (set-buffer outbuf) |
505 (setq buffer-read-only nil) | 600 (setq buffer-read-only nil) |
506 (buffer-disable-undo outbuf) | 601 (buffer-disable-undo outbuf) |
507 (erase-buffer outbuf) | 602 (erase-buffer outbuf) |
603 (kill-all-local-variables) | |
508 (use-local-map pui-display-keymap) | 604 (use-local-map pui-display-keymap) |
605 (setq major-mode 'list-packages-mode) | |
606 (setq mode-name "Packages") | |
607 (setq truncate-lines t) | |
608 | |
609 (unless package-get-remote | |
610 (insert " | |
611 Warning: No download sites specified. Package index may be out of date. | |
612 If you intend to install packages, specify download sites first. | |
613 | |
614 ")) | |
615 | |
509 (if pui-list-verbose | 616 (if pui-list-verbose |
510 (insert " Latest Installed | 617 (insert " Latest Installed |
511 Package name Vers. Vers. Description | 618 Package name Vers. Vers. Description |
512 ") | 619 ") |
513 (insert " Latest | 620 (insert " Latest |
575 '(lambda (a b) | 682 '(lambda (a b) |
576 (string< (symbol-name (car a)) | 683 (string< (symbol-name (car a)) |
577 (symbol-name (car b))) | 684 (symbol-name (car b))) |
578 ))) | 685 ))) |
579 (insert sep-string) | 686 (insert sep-string) |
580 (insert (pui-help-string)) | 687 (insert (documentation 'list-packages-mode)) |
581 (set-buffer-modified-p nil) | 688 (set-buffer-modified-p nil) |
582 (setq buffer-read-only t) | 689 (setq buffer-read-only t) |
583 (pop-to-buffer outbuf) | 690 (pop-to-buffer outbuf) |
584 (delete-other-windows) | 691 (delete-other-windows) |
585 (goto-char start) | 692 (goto-char start) |
586 (setq pui-selected-packages nil) ; Reset list | 693 (setq pui-selected-packages nil) ; Reset list |
694 (setq pui-deleted-packages nil) ; Reset list | |
587 (when (featurep 'menubar) | 695 (when (featurep 'menubar) |
588 (set-buffer-menubar current-menubar) | 696 (set-buffer-menubar current-menubar) |
589 (add-submenu '() pui-menu) | 697 (add-submenu '() pui-menu) |
590 (setq mode-popup-menu pui-menu)) | 698 (setq mode-popup-menu pui-menu)) |
591 (clear-message) | 699 (clear-message) |
592 ; (message (substitute-command-keys "Press `\\[pui-help]' for help.")) | 700 ; (message (substitute-command-keys "Press `\\[pui-help]' for help.")) |
593 )) | 701 )) |
594 | 702 |
703 ;;;###autoload | |
704 (defalias 'list-packages 'pui-list-packages) | |
595 | 705 |
596 (provide 'package-ui) | 706 (provide 'package-ui) |
597 | 707 |
598 ;;; package-ui.el ends here | 708 ;;; package-ui.el ends here |