X-Git-Url: https://cgit.sxemacs.org/?p=riece;a=blobdiff_plain;f=lisp%2Friece-addon.el;h=154ad2e3fb62c78aaa88eb2997be337971bbf15f;hp=e2a6f215adb18bd78a8e57df1b0d169cbf35654c;hb=465b68048344cb9660459ea4a64abc1a2591c094;hpb=1124773d005a5fa88997b150f68afbc8b8c53ffe diff --git a/lisp/riece-addon.el b/lisp/riece-addon.el index e2a6f21..154ad2e 100644 --- a/lisp/riece-addon.el +++ b/lisp/riece-addon.el @@ -60,15 +60,6 @@ :group 'riece-addon-list-faces) (defvar riece-addon-list-disabled-face 'riece-addon-list-disabled-face) -(defface riece-addon-list-unsupported-face - '((((class color) (background dark)) - (:foreground "PaleTurquoise")) - (t - ())) - "Face used for displaying the unsupported addon." - :group 'riece-addon-list-faces) -(defvar riece-addon-list-unsupported-face 'riece-addon-list-unsupported-face) - (defface riece-addon-list-uninstalled-face '((t (:italic t))) @@ -76,6 +67,13 @@ :group 'riece-addon-list-faces) (defvar riece-addon-list-uninstalled-face 'riece-addon-list-uninstalled-face) +(defface riece-addon-list-unloaded-face + '((t + (:italic t :inverse-video t))) + "Face used for displaying the unloaded addon." + :group 'riece-addon-list-faces) +(defvar riece-addon-list-unloaded-face 'riece-addon-list-unloaded-face) + (defface riece-addon-list-description-face '((((class color) (background dark)) @@ -92,14 +90,14 @@ (defcustom riece-addon-list-mark-face-alist '((?+ . riece-addon-list-enabled-face) (?- . riece-addon-list-disabled-face) - (?! . riece-addon-list-unsupported-face) - (? . riece-addon-list-uninstalled-face)) + (?? . riece-addon-list-uninstalled-face) + (? . riece-addon-list-unloaded-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 - '(("^\\([-+! ] [^:]+\\): \\(.*\\)" + '(("^\\([-+? ] \\S-+\\)\\s-+\\(.*\\)" (1 (cdr (assq (aref (match-string 1) 0) riece-addon-list-mark-face-alist))) (2 riece-addon-list-description-face))) @@ -126,10 +124,13 @@ dependencies) (while addons (require (car addons)) ;error will be reported here - (let* ((requires - (funcall (or (intern-soft - (concat (symbol-name (car addons)) "-requires")) - #'ignore))) + (let* ((requires-function + (intern-soft + (concat (symbol-name (car addons)) "-requires"))) + (requires + (if (and requires-function + (fboundp requires-function)) + (funcall requires-function))) (pointer requires) entry) ;; Increment succs' pred count. @@ -201,6 +202,7 @@ (if (get addon 'riece-addon-insinuated) (if verbose (message "Add-on %S is already insinuated" addon)) + (require addon) (funcall (intern (concat (symbol-name addon) "-insinuate"))) (put addon 'riece-addon-insinuated t) (if verbose @@ -211,22 +213,34 @@ (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)))) - (let ((pointer riece-addon-dependencies)) + riece-save-variables-are-dirty t + riece-addon-dependencies + (riece-resolve-addons + (cons addon (mapcar #'car riece-addon-dependencies))))) + (let ((pointer riece-addon-dependencies) + addons) (while pointer (unless (get (car (car pointer)) 'riece-addon-insinuated) - (riece-insinuate-addon-1 (car (car pointer)) verbose)) + (setq addons (cons (car (car pointer)) addons))) (if (eq (car (car pointer)) addon) (setq pointer nil) - (setq pointer (cdr pointer)))))) + (setq pointer (cdr pointer)))) + (setq addons (nreverse addons)) + (if (and (> (length addons) 1) + (eq verbose 'ask) + (not (y-or-n-p (format "%s will be insinuated. Continue? " + (mapconcat #'symbol-name addons ", "))))) + (error "Insinuate operation was cancelled")) + (while addons + (riece-insinuate-addon-1 (car addons) verbose) + (setq addons (cdr addons))))) (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")))) + (uninstall (intern-soft (concat (symbol-name addon) "-uninstall")))) (if entry (if (cdr entry) (if (= (length (cdr entry)) 1) @@ -234,49 +248,48 @@ (error "%s depend on %S" (mapconcat #'symbol-name (cdr entry) ", ") addon)) - (if (and enabled - (symbol-value enabled)) - (riece-disable-addon addon verbose)) - (funcall (or (intern-soft (concat (symbol-name addon) - "-uninstall")) - #'ignore)) + (riece-disable-addon addon verbose) + (if (and uninstall + (fboundp uninstall)) + (funcall uninstall)) (setq riece-addon-dependencies (delq entry riece-addon-dependencies)) - (remprop addon 'riece-addon-insinuated) + (put addon 'riece-addon-insinuated nil) (setq riece-addons (delq addon riece-addons) - riece-addon-dependencies (riece-resolve-addons - (copy-sequence riece-addons))))) + riece-save-variables-are-dirty t + riece-addon-dependencies + (riece-resolve-addons + (delq addon (mapcar #'car riece-addon-dependencies)))))) (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 - (message "Add-on %S doesn't support enable/disable" addon)) - (if (symbol-value enabled) - (if verbose - (message "Add-on %S is already enabled" addon)) - (funcall (intern (concat (symbol-name addon) "-enable"))) - (if verbose - (message "Add-on %S enabled" addon)))))) + (if (get addon 'riece-addon-enabled) + (if verbose + (message "Add-on %S is already enabled" addon)) + (let ((enable (intern-soft (concat (symbol-name addon) "-enable")))) + (if (and enable + (fboundp enable)) + (funcall enable)) + (put addon 'riece-addon-enabled t) + (if verbose + (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 - (message "Add-on %S doesn't support enable/disable" addon)) - (if (symbol-value enabled) - (progn - (funcall (intern (concat (symbol-name addon) "-disable"))) - (if verbose - (message "Add-on %S disabled" addon))) - (if verbose - (message "Add-on %S is already enabled" addon)))))) + (if (not (get addon 'riece-addon-enabled)) + (if verbose + (message "Add-on %S is already disabled" addon)) + (let ((disable (intern-soft (concat (symbol-name addon) "-disable")))) + (if (and disable + (fboundp disable)) + (funcall disable)) + (put addon 'riece-addon-enabled nil) + (if verbose + (message "Add-on %S disabled" addon))))) (put 'riece-addon-list-mode 'font-lock-defaults '(riece-addon-list-font-lock-keywords t)) @@ -308,14 +321,14 @@ All normal editing commands are turned off." buffer-read-only (pointer riece-addon-dependencies) module-description-alist - description enabled point) + description point longest) (while pointer - (setq description (intern-soft (concat (symbol-name (car (car pointer))) "-description")) module-description-alist (cons (cons (car (car pointer)) - (if description + (if (and description + (boundp description)) (symbol-value description) "(no description)")) module-description-alist) @@ -329,21 +342,26 @@ All normal editing commands are turned off." (setq pointer (cdr pointer))) (erase-buffer) (riece-kill-all-overlays) + (setq pointer module-description-alist + longest "") + (while pointer + (if (> (length (symbol-name (car (car pointer)))) + (length longest)) + (setq longest (symbol-name (car (car pointer))))) + (setq pointer (cdr pointer))) (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"))) (setq point (point)) - (insert (format "%c %S: %s\n" - (if (not (get (car (car pointer)) - 'riece-addon-insinuated)) + (insert (format (format "%%c %%-%dS %%s\n" (length longest)) + (if (not (featurep (car (car pointer)))) ? - (if (null enabled) - ?! - (if (symbol-value enabled) + (if (not (get (car (car pointer)) + 'riece-addon-insinuated)) + ?? + (if (get (car (car pointer)) 'riece-addon-enabled) ?+ ?-))) (car (car pointer)) @@ -353,16 +371,19 @@ All normal editing commands are turned off." (insert " 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 is not insinuated. + + The add-on is enabled. + - The add-on is disabled. + ? The add-on is not insinuated. + The add-on is not loaded. ") (insert (substitute-command-keys " Useful keys: - `\\[riece-command-enable-addon]' to enable the current add-on. - `\\[riece-command-disable-addon]' to disable the current add-on. + `\\[riece-command-enable-addon]' to enable the current add-on. + `\\[riece-command-disable-addon]' to disable the current add-on. + `\\[riece-command-insinuate-addon]' to insinuate the current add-on. + `\\[riece-command-uninstall-addon]' to uninstall the current add-on. + `\\[riece-command-unload-addon]' to unload the current add-on. ")) (goto-char (point-min)) (pop-to-buffer (current-buffer)) @@ -433,7 +454,7 @@ Useful keys: (lambda (pointer) (not (get (car pointer) 'riece-addon-insinuated))) t))))) - (riece-insinuate-addon addon t) + (riece-insinuate-addon addon 'ask) (when (eq major-mode 'riece-addon-list-mode) (riece-command-list-addons) (riece-addon-list-set-point addon)))