Prevent an args-out-of-range error during login/out
[riece] / lisp / riece-addon.el
index f91cc1d..f7dab98 100644 (file)
@@ -1,4 +1,4 @@
-;;; riece-addon.el --- add-on management
+;;; riece-addon.el --- add-on management -*- lexical-binding: t -*-
 ;; Copyright (C) 1998-2004 Daiki Ueno
 
 ;; Author: Daiki Ueno <ueno@unixuser.org>
@@ -19,8 +19,8 @@
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Code:
 
@@ -29,6 +29,7 @@
 (require 'riece-compat)
 (require 'riece-misc)
 (require 'riece-addon-modules)
+(require 'riece-mcat)
 
 (defgroup riece-addon-list nil
   "Add-on listing."
@@ -93,7 +94,7 @@
     (?? . riece-addon-list-uninstalled-face)
     (?  . riece-addon-list-unloaded-face))
   "An alist mapping marks on riece-addon-list-buffer to faces."
-  :type 'list
+  :type '(repeat (cons character symbol))
   :group 'riece-addon-list)
 
 (defcustom riece-addon-list-font-lock-keywords
   :type '(repeat (list string))
   :group 'riece-addon-list)
 
+(eval-when-compile
+  (autoload 'riece-command-save-variables "riece-commands"))
+
 (defvar riece-addon-list-mode-map
   (let ((keymap (make-sparse-keymap)))
     (define-key keymap "+" 'riece-command-enable-addon)
     (define-key keymap " " 'scroll-up)
     (define-key keymap [delete] 'scroll-down)
     (define-key keymap "q" 'bury-buffer)
+    (define-key keymap "s" 'riece-command-save-variables)
     keymap))
 
 (defun riece-load-and-build-addon-dependencies (addons)
 (defun riece-insinuate-addon-1 (addon verbose)
   (if (get addon 'riece-addon-insinuated)
       (if verbose
-         (message "Add-on %S is already insinuated" addon))
+         (message (riece-mcat "Add-on %S is already insinuated") addon))
     (require addon)
     (funcall (intern (concat (symbol-name addon) "-insinuate")))
     (put addon 'riece-addon-insinuated t)
     (if verbose
-       (message "Add-on %S is insinuated" addon))
+       (message (riece-mcat "Add-on %S is insinuated") addon))
     (unless (get addon 'riece-addon-default-disabled)
       (riece-enable-addon addon t))))
 
     (setq addons (nreverse addons))
     (if (and (> (length addons) 1)
             (eq verbose 'ask)
-            (not (y-or-n-p (format "%s will be insinuated.  Continue? "
+            (not (y-or-n-p (format (riece-mcat
+                                    "%s will be insinuated.  Continue? ")
                                    (mapconcat #'symbol-name addons ", ")))))
        (error "Insinuate operation was cancelled"))
     (while 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))
+         (message (riece-mcat "Add-on %S is not insinuated") addon))
     (let ((entry (assq addon riece-addon-dependencies))
          (uninstall (intern-soft (concat (symbol-name addon) "-uninstall"))))
       (if entry
                  (riece-resolve-addons
                   (delq addon (mapcar #'car riece-addon-dependencies))))))
       (if verbose
-         (message "Add-on %S is uninstalled" addon)))))
+         (message (riece-mcat "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))
   (if (get addon 'riece-addon-enabled)
       (if verbose
-         (message "Add-on %S is already enabled" addon))
+         (message (riece-mcat "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)))))
+         (message (riece-mcat "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))
   (if (not (get addon 'riece-addon-enabled))
       (if verbose
-         (message "Add-on %S is already disabled" addon))
+         (message (riece-mcat "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)))))
+         (message (riece-mcat "Add-on %S disabled") addon)))))
 
 (put 'riece-addon-list-mode 'font-lock-defaults
      '(riece-addon-list-font-lock-keywords t))
@@ -321,7 +327,7 @@ All normal editing commands are turned off."
        buffer-read-only
        (pointer riece-addon-dependencies)
        module-description-alist
-       description point)
+       description point longest)
     (while pointer
       (setq description (intern-soft (concat (symbol-name (car (car pointer)))
                                             "-description"))
@@ -329,8 +335,8 @@ All normal editing commands are turned off."
            (cons (cons (car (car pointer))
                        (if (and description
                                 (boundp description))
-                           (symbol-value description)
-                         "(no description)"))
+                           (riece-mcat (symbol-value description))
+                         (riece-mcat "(no description)")))
                  module-description-alist)
            pointer (cdr pointer)))
     (setq pointer riece-addon-modules)
@@ -338,17 +344,25 @@ All normal editing commands are turned off."
       (unless (assq (car (car pointer))
                    module-description-alist)
        (setq module-description-alist
-             (cons (car pointer) module-description-alist)))
+             (cons (cons (car (car pointer)) (riece-mcat (cdr (car pointer))))
+                   module-description-alist)))
       (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 point (point))
-      (insert (format "%c %-15S %s\n"
+      (insert (format (format "%%c %%-%dS %%s\n" (length longest))
                      (if (not (featurep (car (car pointer))))
                          ? 
                        (if (not (get (car (car pointer))
@@ -361,15 +375,15 @@ All normal editing commands are turned off."
                      (cdr (car pointer))))
       (put-text-property point (point) 'riece-addon (car (car pointer)))
       (setq pointer (cdr pointer)))
-    (insert "
+    (insert (riece-mcat "
 Symbols in the leftmost column:
 
    +     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 "
+"))
+    (insert (substitute-command-keys (riece-mcat "
 Useful keys:
 
    `\\[riece-command-enable-addon]' to enable the current add-on.
@@ -377,7 +391,8 @@ Useful keys:
    `\\[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.
-"))
+   `\\[riece-command-save-variables]' to save the current setting.
+")))
     (goto-char (point-min))
     (pop-to-buffer (current-buffer))
     (delete-other-windows)))
@@ -396,7 +411,7 @@ Useful keys:
     (or (if (eq major-mode 'riece-addon-list-mode)
            (get-text-property (point) 'riece-addon))
        (intern-soft
-        (completing-read "Add-on: "
+        (completing-read (riece-mcat "Add-on: ")
                          (mapcar (lambda (dependency)
                                    (list (symbol-name (car dependency))))
                                  riece-addon-dependencies)
@@ -407,6 +422,7 @@ Useful keys:
                              (and enabled
                                   (null (symbol-value enabled)))))
                          t)))))
+  (riece-command-insinuate-addon addon)
   (riece-enable-addon addon t)
   (when (eq major-mode 'riece-addon-list-mode)
     (riece-command-list-addons)
@@ -418,7 +434,7 @@ Useful keys:
     (or (if (eq major-mode 'riece-addon-list-mode)
            (get-text-property (point) 'riece-addon))
        (intern-soft
-        (completing-read "Add-on: "
+        (completing-read (riece-mcat "Add-on: ")
                          (mapcar (lambda (dependency)
                                    (list (symbol-name (car dependency))))
                                  riece-addon-dependencies)
@@ -440,12 +456,13 @@ Useful keys:
     (or (if (eq major-mode 'riece-addon-list-mode)
            (get-text-property (point) 'riece-addon))
        (intern-soft
-        (completing-read "Add-on: "
+        (completing-read (riece-mcat "Add-on: ")
                          (mapcar (lambda (dependency)
                                    (list (symbol-name (car dependency))))
                                  riece-addon-modules)
                          (lambda (pointer)
-                           (not (get (car pointer) 'riece-addon-insinuated)))
+                           (not (get (intern-soft (car pointer))
+                                     'riece-addon-insinuated)))
                          t)))))
   (riece-insinuate-addon addon 'ask)
   (when (eq major-mode 'riece-addon-list-mode)
@@ -458,12 +475,13 @@ Useful keys:
     (or (if (eq major-mode 'riece-addon-list-mode)
            (get-text-property (point) 'riece-addon))
        (intern-soft
-        (completing-read "Add-on: "
+        (completing-read (riece-mcat "Add-on: ")
                          (mapcar (lambda (dependency)
                                    (list (symbol-name (car dependency))))
                                  riece-addon-dependencies)
                          (lambda (pointer)
-                           (get (car pointer) 'riece-addon-insinuated))
+                           (get (intern-soft (car pointer))
+                                'riece-addon-insinuated))
                          t)))))
   (riece-uninstall-addon addon t)
   (when (eq major-mode 'riece-addon-list-mode)
@@ -476,18 +494,19 @@ Useful keys:
     (or (if (eq major-mode 'riece-addon-list-mode)
            (get-text-property (point) 'riece-addon))
        (intern-soft
-        (completing-read "Add-on: "
+        (completing-read (riece-mcat "Add-on: ")
                          (mapcar (lambda (dependency)
                                    (list (symbol-name (car dependency))))
                                  riece-addon-dependencies)
                          (lambda (pointer)
-                           (get (car pointer) 'riece-addon-insinuated))
+                           (get (intern-soft (car pointer))
+                                'riece-addon-insinuated))
                          t)))))
   (riece-uninstall-addon addon t)
   (if (get addon 'riece-addon-not-unloadable)
-      (message "Add-on %S is not allowed to unload" addon)
+      (message (riece-mcat "Add-on %S is not allowed to unload") addon)
     (unload-feature addon)
-    (message "Add-on %S is unloaded" addon))
+    (message (riece-mcat "Add-on %S is unloaded") addon))
   (when (eq major-mode 'riece-addon-list-mode)
     (riece-command-list-addons)
     (riece-addon-list-set-point addon)))