(require 'riece-options)
(require 'riece-compat)
(require 'riece-misc)
+(require 'riece-addon-modules)
(defgroup riece-addon-list nil
"Add-on listing."
: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)
'((?+ . 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)))
(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)
(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)))
+ (if verbose
+ (message "Add-on %S is uninstalled" addon)))))
+
(defun riece-enable-addon (addon &optional verbose)
(let ((enabled (intern-soft (concat (symbol-name addon) "-enabled"))))
(if (null enabled)
(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 "
+ 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: