(defgroup reftex): Update home page url-link.
[bpt/emacs.git] / lisp / custom.el
index cd97b42..e69e233 100644 (file)
@@ -210,11 +210,11 @@ The following keywords are meaningful:
        `custom-initialize-reset'.
 :set   VALUE should be a function to set the value of the symbol.
        It takes two arguments, the symbol to set and the value to
-       give it.  The default choice of function is `custom-set-default'.
+       give it.  The default choice of function is `set-default'.
 :get   VALUE should be a function to extract the value of symbol.
        The function takes one argument, a symbol, and should return
        the current value for that symbol.  The default choice of function
-       is `custom-default-value'.
+       is `default-value'.
 :require
        VALUE should be a feature symbol.  If you save a value
        for this option, then when your `.emacs' file loads the value,
@@ -272,11 +272,14 @@ The following common keywords are also meaningful.
         first introduced, or its default value was changed, in Emacs
         version VERSION.
 :package-version
-        VALUE should be a list with the form (PACKAGE VERSION)
+        VALUE should be a list with the form (PACKAGE VERSION)
         specifying that the variable was first introduced, or its
         default value was changed, in PACKAGE version VERSION.  This
         keyword takes priority over :version.  The PACKAGE and VERSION
         must appear in the alist `customize-package-emacs-version-alist'.
+        Since PACKAGE must be unique and the user might see it in an
+        error message, a good choice is the official name of the
+        package, such as MH-E or Gnus.
 :tag LABEL
         Use LABEL, a string, instead of the item's name, to label the item
         in customization menus and buffers.
@@ -555,9 +558,10 @@ LOAD should be either a library file name, or a feature name."
     (unless (member load loads)
       (put symbol 'custom-loads (cons (purecopy load) loads)))))
 
-(defun custom-autoload (symbol load)
-  "Mark SYMBOL as autoloaded custom variable and add dependency LOAD."
-  (put symbol 'custom-autoload t)
+(defun custom-autoload (symbol load &optional noset)
+  "Mark SYMBOL as autoloaded custom variable and add dependency LOAD.
+If NOSET is non-nil, don't bother autoloading LOAD when setting the variable."
+  (put symbol 'custom-autoload (if noset 'noset t))
   (custom-add-load symbol load))
 
 ;; This test is also in the C code of `user-variable-p'.
@@ -696,10 +700,10 @@ Return non-nil iff the `customized-value' property actually changed."
         (customized (get symbol 'customized-value))
         (old (or (get symbol 'saved-value) (get symbol 'standard-value))))
     ;; Mark default value as set iff different from old value.
-    (if (or (null old)
-           (not (equal value (condition-case nil
-                                 (eval (car old))
-                               (error nil)))))
+    (if (not (and old
+                  (equal value (condition-case nil
+                                   (eval (car old))
+                                 (error nil)))))
        (progn (put symbol 'customized-value (list (custom-quote value)))
               (custom-push-theme 'theme-value symbol 'user 'set
                                  (custom-quote value)))
@@ -822,11 +826,11 @@ See `custom-known-themes' for a list of known themes."
        ;; theme is later disabled.
        (if (null old)
            (if (and (eq prop 'theme-value)
-                    (boundp symbol)
-                    (or (null (get symbol 'standard-value))
-                        (not (equal (eval (car (get symbol 'standard-value)))
-                                    (symbol-value symbol)))))
-               (setq old (list (list 'changed (symbol-value symbol))))
+                    (boundp symbol))
+               (let ((sv (get symbol 'standard-value)))
+                 (unless (and sv
+                               (equal (eval (car sv)) (symbol-value symbol)))
+                    (setq old (list (list 'changed (symbol-value symbol))))))
              (if (and (facep symbol)
                       (not (face-spec-match-p symbol (get symbol 'face-defface-spec))))
                  (setq old (list (list 'changed (list
@@ -870,6 +874,18 @@ COMMENT is a comment string about SYMBOL.
 EXP itself is saved unevaluated as SYMBOL property `saved-value' and
 in SYMBOL's list property `theme-value' \(using `custom-push-theme')."
   (custom-check-theme theme)
+  ;; Process all the needed autoloads before anything else, so that the
+  ;; subsequent code has all the info it needs (e.g. which var corresponds
+  ;; to a minor mode), regardless of the ordering of the variables.
+  (dolist (entry args)
+    (let* ((symbol (indirect-variable (nth 0 entry))))
+      (unless (or (get symbol 'standard-value)
+                  (memq (get symbol 'custom-autoload) '(nil noset)))
+        ;; This symbol needs to be autoloaded, even just for a `set'.
+        (custom-load-symbol symbol))))
+  ;; Move minor modes and variables with explicit requires to the end.
   (setq args
        (sort args
              (lambda (a1 a2)
@@ -919,6 +935,8 @@ in SYMBOL's list property `theme-value' \(using `custom-push-theme')."
            (setq args (cdr args))
            (and (or now (default-boundp symbol))
                 (put symbol 'variable-comment comment)))
+        ;; I believe this is dead-code, because the `sort' code above would
+        ;; have burped before we could get here.  --Stef
        ;; Old format, a plist of SYMBOL VALUE pairs.
        (message "Warning: old format `custom-set-variables'")
        (ding)