X-Git-Url: https://cgit.sxemacs.org/?p=riece;a=blobdiff_plain;f=lisp%2Friece-addon.el;h=b2dfe75886ce7b68961a38b284d5a7c38e937cc5;hp=7649f8bd9d189558b4ed998cace32d6374abfec5;hb=ea26c9283b9a4aff978f21cfeb519a0daa7fc213;hpb=2d67acd4af1122a36fcc09b47a479b927ca03904 diff --git a/lisp/riece-addon.el b/lisp/riece-addon.el index 7649f8b..b2dfe75 100644 --- a/lisp/riece-addon.el +++ b/lisp/riece-addon.el @@ -24,17 +24,22 @@ ;;; Code: +(require 'font-lock) +(require 'riece-options) +(require 'riece-compat) +(require 'riece-misc) + (defgroup riece-addon-list nil - "Add-on management" - :tag "Addon" - :prefix "riece-" + "Add-on listing." + :tag "Addon list" + :prefix "riece-addon-list-" :group 'riece) (defgroup riece-addon-list-faces nil - "Faces for riece-addon-list-mode" + "Faces for riece-addon-list-mode." :tag "Faces" - :prefix "riece-addon-list" - :group 'riece-addon) + :prefix "riece-addon-list-" + :group 'riece-addon-list) (defface riece-addon-list-enabled-face '((((class color) (background dark)) @@ -86,14 +91,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-unsupported-face) (?? . riece-addon-list-unknown-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))) @@ -107,8 +112,8 @@ (define-key keymap "-" 'riece-command-disable-addon) (define-key keymap "n" 'next-line) (define-key keymap "p" 'previous-line) - (define-key keymap " " 'scroll-up-command) - (define-key keymap [delete] 'scroll-down-command) + (define-key keymap " " 'scroll-up) + (define-key keymap [delete] 'scroll-down) (define-key keymap "q" 'bury-buffer) keymap)) @@ -139,7 +144,7 @@ (setq addons (cdr addons))) dependencies)) -(defun riece-resolve-addons (addons) +(defun riece-resolve-addon-dependencies (addons) (let ((pointer addons) dependencies queue) ;; Uniquify, first. @@ -164,21 +169,35 @@ (let* ((entry (assq (car pointer) dependencies)) (count (1- (nth 1 entry)))) (if (zerop count) - (progn - (setq dependencies (delq entry dependencies) - queue (nconc queue (list entry)))) + (setq dependencies (delq entry dependencies) + queue (nconc queue (list entry))) (setcar (cdr entry) count))) (setq pointer (cdr pointer))) (setq queue (cdr queue))) (if dependencies - (error "Circular add-on dependency found")) + (error "Circular add-on dependency found: %S" dependency)) (nreverse addons))) +(defun riece-resolve-addons (addons) + (riece-resolve-addon-dependencies + (if (file-directory-p riece-addon-directory) + (append addons + (mapcar + (lambda (name) + (unless (file-directory-p + (expand-file-name name riece-addon-directory)) + (intern (file-name-sans-extension name)))) + (directory-files riece-addon-directory nil "\\`[^.]" t))) + addons))) + (defun riece-insinuate-addon (addon &optional verbose) - (require addon) ;implicit dependency - (funcall (intern (concat (symbol-name addon) "-insinuate"))) - (if verbose - (message "Add-on %S is insinuated" addon))) + (if (get addon 'riece-addon-insinuated) + (if verbose + (message "Add-on %S is alread 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-enable-addon (addon &optional verbose) (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled")))) @@ -187,7 +206,7 @@ (message "Add-on %S doesn't support enable/disable" addon)) (if (symbol-value enabled) (if verbose - (message "Can't enable add-on %S" addon)) + (message "Add-on %S is already enabled" addon)) (funcall (intern (concat (symbol-name addon) "-enable"))) (if verbose (message "Add-on %S enabled" addon)))))) @@ -203,7 +222,7 @@ (if verbose (message "Add-on %S disabled" addon))) (if verbose - (message "Can't disable add-on %S" addon)))))) + (message "Add-on %S is already enabled" addon)))))) (put 'riece-addon-list-mode 'font-lock-defaults '(riece-addon-list-font-lock-keywords t)) @@ -214,14 +233,17 @@ All normal editing commands are turned off." (kill-all-local-variables) (buffer-disable-undo) (setq major-mode 'riece-addon-list-mode - mode-name "AddOns" + mode-name "AddOns" mode-line-buffer-identification - (riece-mode-line-buffer-identification '("Riece: ")) + (riece-mode-line-buffer-identification '("Riece: %12b")) truncate-lines t buffer-read-only t) (use-local-map riece-addon-list-mode-map) (make-local-variable 'font-lock-defaults) (setq font-lock-defaults '(riece-addon-list-font-lock-keywords t)) + ;; In XEmacs, auto-initialization of font-lock is not effective + ;; if buffer-file-name is not set. + (font-lock-set-defaults) (run-hooks 'riece-addon-list-mode-hook)) (defun riece-command-list-addons () @@ -230,7 +252,10 @@ All normal editing commands are turned off." (riece-addon-list-mode) (let ((inhibit-read-only t) buffer-read-only - (pointer riece-addons) + (pointer (sort (copy-sequence riece-addons) + (lambda (symbol1 symbol2) + (string-lessp (symbol-name symbol1) + (symbol-name symbol2))))) enabled description point) (erase-buffer) (riece-kill-all-overlays) @@ -244,7 +269,7 @@ All normal editing commands are turned off." (if (not (featurep (car pointer))) ?? (if (null enabled) - ?= + ?! (if (symbol-value enabled) ?+ ?-))) @@ -259,7 +284,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 doesn't support enable/disable operation. ? The add-on status is unknown. ") (insert (substitute-command-keys " @@ -277,18 +302,18 @@ Useful keys: (list (or (if (eq major-mode 'riece-addon-list-mode) (get-text-property (point) 'riece-addon)) - (completing-read "Add-on: " - (mapcar (lambda (addon) - (list (symbol-name addon))) - riece-addons) - (lambda (pointer) - (let ((enabled - (intern-soft (concat (symbol-name - (car pointer)) - "-enabled")))) - (and enabled - (null (symbol-value enabled))))) - t)))) + (intern-soft + (completing-read "Add-on: " + (mapcar (lambda (addon) + (list (symbol-name addon))) + riece-addons) + (lambda (pointer) + (let ((enabled + (intern-soft (concat (car pointer) + "-enabled")))) + (and enabled + (null (symbol-value enabled))))) + t))))) (riece-enable-addon addon t) (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled")))) (if (and (eq major-mode 'riece-addon-list-mode) @@ -308,18 +333,18 @@ Useful keys: (list (or (if (eq major-mode 'riece-addon-list-mode) (get-text-property (point) 'riece-addon)) - (completing-read "Add-on: " - (mapcar (lambda (addon) - (list (symbol-name addon))) - riece-addons) - (lambda (pointer) - (let ((enabled - (intern-soft (concat (symbol-name - (car pointer)) - "-enabled")))) - (and enabled - (symbol-value enabled)))) - t)))) + (intern-soft + (completing-read "Add-on: " + (mapcar (lambda (addon) + (list (symbol-name addon))) + riece-addons) + (lambda (pointer) + (let ((enabled + (intern-soft (concat (car pointer) + "-enabled")))) + (and enabled + (symbol-value enabled)))) + t))))) (riece-disable-addon addon t) (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled")))) (if (and (eq major-mode 'riece-addon-list-mode) @@ -333,7 +358,7 @@ Useful keys: (delete-char 1) (insert "-") (put-text-property point (point) 'riece-addon addon)))))) - + (provide 'riece-addon) ;;; riece-addon.el ends here