X-Git-Url: http://cgit.sxemacs.org/?p=riece;a=blobdiff_plain;f=lisp%2Friece-addon.el;h=766c7b544a66d03c55f4b96f26b2ac051bd09873;hp=c1280ef80b6d50949ba148c64dc7e001b8e24095;hb=26067c8bc103b0afc65fa5359127186c1be1fa84;hpb=c49ff9276f90e081f670d97cd68e37c00a590e78 diff --git a/lisp/riece-addon.el b/lisp/riece-addon.el index c1280ef..766c7b5 100644 --- a/lisp/riece-addon.el +++ b/lisp/riece-addon.el @@ -28,6 +28,7 @@ (require 'riece-options) (require 'riece-compat) (require 'riece-misc) +(require 'riece-addon-modules) (defgroup riece-addon-list nil "Add-on listing." @@ -68,12 +69,12 @@ :group 'riece-addon-list-faces) (defvar riece-addon-list-unsupported-face 'riece-addon-list-unsupported-face) -(defface riece-addon-list-unknown-face +(defface riece-addon-list-uninstalled-face '((t (:foreground "red"))) - "Face used for displaying the unknown addon." + "Face used for displaying the uninstalled addon." :group 'riece-addon-list-faces) -(defvar riece-addon-list-unknown-face 'riece-addon-list-unknown-face) +(defvar riece-addon-list-uninstalled-face 'riece-addon-list-uninstalled-face) (defface riece-addon-list-description-face '((((class color) @@ -92,13 +93,13 @@ '((?+ . riece-addon-list-enabled-face) (?- . riece-addon-list-disabled-face) (?! . riece-addon-list-unsupported-face) - (?? . riece-addon-list-unknown-face)) + (? . riece-addon-list-uninstalled-face)) "An alist mapping marks on riece-addon-list-buffer to faces." :type 'list :group 'riece-addon-list) (defcustom riece-addon-list-font-lock-keywords - '(("^\\([-+!?] [^:]+\\): \\(.*\\)" + '(("^\\([-+! ] [^:]+\\): \\(.*\\)" (1 (cdr (assq (aref (match-string 1) 0) riece-addon-list-mark-face-alist))) (2 riece-addon-list-description-face))) @@ -110,6 +111,8 @@ (let ((keymap (make-sparse-keymap))) (define-key keymap "+" 'riece-command-enable-addon) (define-key keymap "-" 'riece-command-disable-addon) + (define-key keymap "I" 'riece-command-insinuate-addon) + (define-key keymap "D" 'riece-command-uninstall-addon) (define-key keymap "n" 'next-line) (define-key keymap "p" 'previous-line) (define-key keymap " " 'scroll-up) @@ -190,19 +193,50 @@ (setq pointer (cdr pointer))) (delq nil addons)) ;; Build & resolve dependencies. - (riece-resolve-addon-dependencies + (riece-sort-addon-dependencies (riece-load-and-build-addon-dependencies addons))) (defun riece-insinuate-addon (addon &optional verbose) + (unless (assq addon riece-addon-dependencies) + (setq riece-addons (cons addon riece-addons) + riece-addon-dependencies (riece-resolve-addons + (copy-sequence riece-addons)))) (if (get addon 'riece-addon-insinuated) (if verbose - (message "Add-on %S is alread insinuated" addon)) + (message "Add-on %S is already insinuated" addon)) (funcall (intern (concat (symbol-name addon) "-insinuate"))) (put addon 'riece-addon-insinuated t) (if verbose (message "Add-on %S is insinuated" addon)))) +(defun riece-uninstall-addon (addon &optional verbose) + (if (not (get addon 'riece-addon-insinuated)) + (if verbose + (message "Add-on %S is not insinuated" addon)) + (let ((entry (assq addon riece-addon-dependencies)) + (enabled (intern-soft (concat (symbol-name addon) "-enabled")))) + (if entry + (if (cdr entry) + (if (= (length (cdr entry)) 1) + (error "%S depends %S" (car (cdr entry)) addon) + (error "%s depends %S" (mapconcat #'identity (cdr entry) ",") + addon)) + (if (and enabled + (symbol-value enabled)) + (riece-disable-addon addon verbose)) + (funcall (or (intern-soft (concat (symbol-name addon) + "-uninstall")) + #'ignore)) + (setq riece-addon-dependencies + (delq entry riece-addon-dependencies)) + (put addon 'riece-addon-insinuated nil) + (setq riece-addons (delq addon riece-addons)))) + (if verbose + (message "Add-on %S is uninstalled" addon))))) + (defun riece-enable-addon (addon &optional verbose) + (unless (get addon 'riece-addon-insinuated) + (error "Add-on %S is not insinuated" addon)) (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled")))) (if (null enabled) (if verbose @@ -215,6 +249,8 @@ (message "Add-on %S enabled" addon)))))) (defun riece-disable-addon (addon &optional verbose) + (unless (get addon 'riece-addon-insinuated) + (error "Add-on %S is not insinuated" addon)) (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled")))) (if (null enabled) (if verbose @@ -255,31 +291,48 @@ All normal editing commands are turned off." (riece-addon-list-mode) (let ((inhibit-read-only t) buffer-read-only - (pointer (sort (copy-sequence riece-addon-dependencies) - (lambda (dependency1 dependency2) - (string-lessp (symbol-name (car dependency1)) - (symbol-name (car dependency2)))))) - enabled description point) + (pointer riece-addon-dependencies) + module-description-alist + description enabled point) + (while pointer + + (setq description (intern-soft (concat (symbol-name (car (car pointer))) + "-description")) + module-description-alist + (cons (cons (car (car pointer)) + (if description + (symbol-value description) + "(no description)")) + module-description-alist) + pointer (cdr pointer))) + (setq pointer riece-addon-modules) + (while pointer + (unless (assq (car (car pointer)) + module-description-alist) + (setq module-description-alist + (cons (car pointer) module-description-alist))) + (setq pointer (cdr pointer))) (erase-buffer) (riece-kill-all-overlays) + (setq pointer (sort module-description-alist + (lambda (entry1 entry2) + (string-lessp (symbol-name (car entry1)) + (symbol-name (car entry2)))))) (while pointer (setq enabled (intern-soft (concat (symbol-name (car (car pointer))) - "-enabled")) - description (intern-soft (concat (symbol-name (car (car pointer))) - "-description"))) + "-enabled"))) (setq point (point)) (insert (format "%c %S: %s\n" - (if (not (featurep (car (car pointer)))) - ?? + (if (not (get (car (car pointer)) + 'riece-addon-insinuated)) + ? (if (null enabled) ?! (if (symbol-value enabled) ?+ ?-))) (car (car pointer)) - (if description - (symbol-value description) - "(no description)"))) + (cdr (car pointer)))) (put-text-property point (point) 'riece-addon (car (car pointer))) (setq pointer (cdr pointer))) (insert " @@ -288,7 +341,7 @@ Symbols in the leftmost column: + The add-on is enabled. - The add-on is disabled. ! The add-on doesn't support enable/disable operation. - ? The add-on status is unknown. + The add-on is not insinuated. ") (insert (substitute-command-keys " Useful keys: @@ -354,6 +407,50 @@ Useful keys: (if point (goto-char point))))) +(defun riece-command-insinuate-addon (addon) + (interactive + (list + (or (if (eq major-mode 'riece-addon-list-mode) + (get-text-property (point) 'riece-addon)) + (intern-soft + (completing-read "Add-on: " + (mapcar (lambda (dependency) + (list (symbol-name (car dependency)))) + riece-addon-modules) + (lambda (pointer) + (get (car pointer) 'riece-addon-insinuated)) + t))))) + (riece-insinuate-addon addon t) + (when (eq major-mode 'riece-addon-list-mode) + (riece-command-list-addons) + (let ((point (point-min))) + (while (and (not (eq (get-text-property point 'riece-addon) addon)) + (setq point (next-single-property-change point + 'riece-addon)))) + (if point + (goto-char point))))) + +(defun riece-command-uninstall-addon (addon) + (interactive + (list + (or (if (eq major-mode 'riece-addon-list-mode) + (get-text-property (point) 'riece-addon)) + (intern-soft + (completing-read "Add-on: " + (mapcar (lambda (dependency) + (list (symbol-name (car dependency)))) + riece-addon-dependencies) + nil t))))) + (riece-uninstall-addon addon t) + (when (eq major-mode 'riece-addon-list-mode) + (riece-command-list-addons) + (let ((point (point-min))) + (while (and (not (eq (get-text-property point 'riece-addon) addon)) + (setq point (next-single-property-change point + 'riece-addon)))) + (if point + (goto-char point))))) + (provide 'riece-addon) ;;; riece-addon.el ends here