: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))
'((?+ . 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)))
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.
(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)
(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)
+ (let ((enable (intern-soft (concat (symbol-name addon) "-enable"))))
+ (if (or (null enable)
+ (not (fboundp enable)))
(if verbose
(message "Add-on %S doesn't support enable/disable" addon))
- (if (symbol-value enabled)
+ (if (get addon 'riece-addon-enabled)
(if verbose
(message "Add-on %S is already enabled" addon))
- (funcall (intern (concat (symbol-name addon) "-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)
+ (let ((disable (intern-soft (concat (symbol-name addon) "-disable"))))
+ (if (or (null disable)
+ (not (fboundp disable)))
(if verbose
(message "Add-on %S doesn't support enable/disable" addon))
- (if (symbol-value enabled)
+ (if (get addon 'riece-addon-enabled)
(progn
- (funcall (intern (concat (symbol-name addon) "-disable")))
+ (funcall disable)
+ (put addon 'riece-addon-enabled nil)
(if verbose
(message "Add-on %S disabled" addon)))
(if verbose
buffer-read-only
(pointer riece-addon-dependencies)
module-description-alist
- description enabled point)
+ description enable point)
(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)
(string-lessp (symbol-name (car entry1))
(symbol-name (car entry2))))))
(while pointer
- (setq enabled (intern-soft (concat (symbol-name (car (car pointer)))
- "-enabled")))
+ (setq enable (intern-soft (concat (symbol-name (car (car pointer)))
+ "-enable")))
(setq point (point))
- (insert (format "%c %S: %s\n"
- (if (not (get (car (car pointer))
- 'riece-addon-insinuated))
+ (insert (format "%c %-15S %s\n"
+ (if (not (featurep (car (car pointer))))
?
- (if (null enabled)
- ?!
- (if (symbol-value enabled)
- ?+
- ?-)))
+ (if (not (get (car (car pointer))
+ 'riece-addon-insinuated))
+ ??
+ (if (or (null enable)
+ (not (fboundp enable)))
+ ?!
+ (if (get (car (car pointer)) 'riece-addon-enabled)
+ ?+
+ ?-))))
(car (car pointer))
(cdr (car pointer))))
(put-text-property point (point) 'riece-addon (car (car pointer)))
(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 doesn't support enable/disable operation.
+ ? 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 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))
(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)))