]> code.delx.au - gnu-emacs/blobdiff - lisp/custom.el
(ange-ftp-file-name-sans-versions): Don't return
[gnu-emacs] / lisp / custom.el
index 5db6caa655fac87cd3102aac8bf47d43d5d6a5a9..fd90be477b25c889a9b07d5569326c95a5173084 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, faces
-;; Version: 1.97
+;; Version: 1.9900
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;; This file is part of GNU Emacs.
@@ -56,15 +56,17 @@ the car of that and used as the default binding for symbol.
 Otherwise, VALUE will be evaluated and used as the default binding for
 symbol."
   (unless (default-boundp symbol)
-    ;; Use the saved value if it exists, otherwise the factory setting.
+    ;; Use the saved value if it exists, otherwise the standard setting.
     (set-default symbol (if (get symbol 'saved-value)
                            (eval (car (get symbol 'saved-value)))
                          (eval value)))))
 
 (defun custom-initialize-set (symbol value)
-  "Initialize SYMBOL with VALUE.
-Like `custom-initialize-default', but use the function specified by
-`:set' to initialize SYMBOL."
+  "Initialize SYMBOL based on VALUE.
+If the symbol doesn't have a default binding already,
+then set it using its `:set' function (or `set-default' if it has none).
+The value is either the value in the symbol's `saved-value' property,
+if any, or VALUE."
   (unless (default-boundp symbol)
     (funcall (or (get symbol 'custom-set) 'set-default)
             symbol 
@@ -73,9 +75,12 @@ Like `custom-initialize-default', but use the function specified by
               (eval value)))))
 
 (defun custom-initialize-reset (symbol value)
-  "Initialize SYMBOL with VALUE.
-Like `custom-initialize-set', but use the function specified by
-`:get' to reinitialize SYMBOL if it is already bound."
+  "Initialize SYMBOL based on VALUE.
+Set the symbol, using its `:set' function (or `set-default' if it has none).
+The value is either the symbol's current value
+ \(as obtained using the `:get' function), if any,
+or the value in the symbol's `saved-value' property if any,
+or (last of all) VALUE."
     (funcall (or (get symbol 'custom-set) 'set-default)
             symbol 
             (cond ((default-boundp symbol)
@@ -89,7 +94,8 @@ Like `custom-initialize-set', but use the function specified by
 (defun custom-initialize-changed (symbol value)
   "Initialize SYMBOL with VALUE.
 Like `custom-initialize-reset', but only use the `:set' function if the 
-not using the factory setting.  Otherwise, use the `set-default'."
+not using the standard setting.
+For the standard setting, use the `set-default'."
   (cond ((default-boundp symbol)
         (funcall (or (get symbol 'custom-set) 'set-default)
                  symbol
@@ -102,17 +108,19 @@ not using the factory setting.  Otherwise, use the `set-default'."
        (t
         (set-default symbol (eval value)))))
 
-(defun custom-declare-variable (symbol value doc &rest args)
-  "Like `defcustom', but SYMBOL and VALUE are evaluated as normal arguments."
-  ;; Remember the factory setting.
-  (put symbol 'factory-value (list value))
+(defun custom-declare-variable (symbol default doc &rest args)
+  "Like `defcustom', but SYMBOL and DEFAULT are evaluated as normal arguments.
+DEFAULT should be an expression to evaluate to compute the default value,
+not the default value itself."
+  ;; Remember the standard setting.
+  (put symbol 'standard-value (list default))
   ;; Maybe this option was rogue in an earlier version.  It no longer is.
   (when (get symbol 'force-value)
     ;; It no longer is.    
     (put symbol 'force-value nil))
   (when doc
     (put symbol 'variable-documentation doc))
-  (let ((initialize 'custom-initialize-set)
+  (let ((initialize 'custom-initialize-reset)
        (requests nil))
     (while args 
       (let ((arg (car args)))
@@ -147,7 +155,8 @@ not using the factory setting.  Otherwise, use the `set-default'."
                                        'custom-variable))))))
     (put symbol 'custom-requests requests)
     ;; Do the actual initialization.
-    (funcall initialize symbol value))
+    (funcall initialize symbol default))
+  (setq current-load-list (cons symbol current-load-list))
   (run-hooks 'custom-define-hook)
   symbol)
 
@@ -161,31 +170,40 @@ The remaining arguments should have the form
 
    [KEYWORD VALUE]... 
 
-The following KEYWORD's are defined:
+The following keywords are meaningful:
 
 :type  VALUE should be a widget type for editing the symbols value.
        The default is `sexp'.
 :options VALUE should be a list of valid members of the widget type.
 :group  VALUE should be a customization group.  
         Add SYMBOL to that group.
-:initialize VALUE should be a function used to initialize the
+:initialize
+       VALUE should be a function used to initialize the
        variable.  It takes two arguments, the symbol and value
        given in the `defcustom' call.  The default is
        `custom-initialize-default' 
 :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 is `set-default'.
+       give it.  The default choice of function is `custom-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 is
-       `default-value'. 
-:require VALUE should be a feature symbol.  Each feature will be
-       required after initialization, of the the user have saved this
-       option.
+       the current value for that symbol.  The default choice of function
+       is `custom-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,
+       it does (require VALUE) first.
 
 Read the section about customization in the Emacs Lisp manual for more
 information."
-  `(custom-declare-variable (quote ,symbol) (quote ,value) ,doc ,@args))
+  ;; It is better not to use backquote in this file,
+  ;; because that makes a bootstrapping problem
+  ;; if you need to recompile all the Lisp files using interpreted code.
+  (nconc (list 'custom-declare-variable
+              (list 'quote symbol)
+              (list 'quote value)
+              doc)
+        args))
 
 ;;; The `defface' Macro.
 
@@ -235,7 +253,10 @@ following REQ are defined:
 
 Read the section about customization in the Emacs Lisp manual for more
 information."
-  `(custom-declare-face (quote ,face) ,spec ,doc ,@args))
+  ;; It is better not to use backquote in this file,
+  ;; because that makes a bootstrapping problem
+  ;; if you need to recompile all the Lisp files using interpreted code.
+  (nconc (list 'custom-declare-face (list 'quote face) spec doc) args))
 
 ;;; The `defgroup' Macro.
 
@@ -272,8 +293,8 @@ SYMBOL does not need to be quoted.
 Third arg DOC is the group documentation.
 
 MEMBERS should be an alist of the form ((NAME WIDGET)...) where
-NAME is a symbol and WIDGET is a widget is a widget for editing that
-symbol.  Useful widgets are `custom-variable' for editing variables,
+NAME is a symbol and WIDGET is a widget for editing that symbol.
+Useful widgets are `custom-variable' for editing variables,
 `custom-face' for edit faces, and `custom-group' for editing groups.
 
 The remaining arguments should have the form
@@ -287,7 +308,10 @@ The following KEYWORD's are defined:
 
 Read the section about customization in the Emacs Lisp manual for more
 information."
-  `(custom-declare-group (quote ,symbol) ,members ,doc ,@args))
+  ;; It is better not to use backquote in this file,
+  ;; because that makes a bootstrapping problem
+  ;; if you need to recompile all the Lisp files using interpreted code.
+  (nconc (list 'custom-declare-group (list 'quote symbol) members doc) args))
 
 (defun custom-add-to-group (group option widget)
   "To existing GROUP add a new OPTION of type WIDGET.
@@ -320,6 +344,8 @@ Third argument TYPE is the custom option type."
 Fourth argument TYPE is the custom option type."
   (cond ((eq keyword :group)
         (custom-add-to-group value symbol type))
+       ((eq keyword :version)
+        (custom-add-version symbol value))
        ((eq keyword :link)
         (custom-add-link symbol value))
        ((eq keyword :load)
@@ -344,6 +370,10 @@ For other types variables, the effect is undefined."
     (unless (member widget links)
       (put symbol 'custom-links (cons widget links)))))
 
+(defun custom-add-version (symbol version)
+  "To the custom option SYMBOL add the version VERSION."
+  (put symbol 'custom-version version))
+
 (defun custom-add-load (symbol load)
   "To the custom option SYMBOL add the dependency LOAD.
 LOAD should be either a library file name, or a feature name."
@@ -353,6 +383,14 @@ LOAD should be either a library file name, or a feature name."
 
 ;;; Initializing.
 
+(defvar custom-local-buffer nil
+  "Non-nil, in a Customization buffer, means customize a specific buffer.
+If this variable is non-nil, it should be a buffer,
+and it means customize the local bindings of that buffer.
+This variable is a permanent local, and it normally has a local binding
+in every Customization buffer.")
+(put 'custom-local-buffer 'permanent-local t)
+
 (defun custom-set-variables (&rest args)
   "Initialize variables according to user preferences.  
 
@@ -370,7 +408,7 @@ the default value for the SYMBOL."
                 (value (nth 1 entry))
                 (now (nth 2 entry))
                 (requests (nth 3 entry))
-                (set (or (get symbol 'custom-set) 'set-default)))
+                (set (or (get symbol 'custom-set) 'custom-set-default)))
            (put symbol 'saved-value (list value))
            (cond (now 
                   ;; Rogue variable, set it now.
@@ -392,8 +430,23 @@ the default value for the SYMBOL."
          (put symbol 'saved-value (list value)))
        (setq args (cdr (cdr args)))))))
 
+(defun custom-set-default (variable value)
+  "Default :set function for a customizable variable.
+Normally, this sets the default value of VARIABLE to VALUE,
+but if `custom-local-buffer' is non-nil,
+this sets the local binding in that buffer instead."
+  (if custom-local-buffer
+      (with-current-buffer custom-local-buffer
+       (set variable value))
+    (set-default variable value)))
+
 ;;; The End.
 
+;; Process the defcustoms for variables loaded before this file.
+(while custom-declare-variable-list
+  (apply 'custom-declare-variable (car custom-declare-variable-list))
+  (setq custom-declare-variable-list (cdr custom-declare-variable-list)))
+
 (provide 'custom)
 
 ;; custom.el ends here