(make-coding-system): Create -with-esc variant coding system.
[bpt/emacs.git] / lisp / cus-edit.el
index 20ce781..b6c60a4 100644 (file)
 
 (defgroup customize '((widgets custom-group))
   "Customization of the Customization support."
-  :link '(custom-manual "(custom)Top")
+  :link '(custom-manual "(elisp)Customization")
   :link '(url-link :tag "Development Page" 
                   "http://www.dina.kvl.dk/~abraham/custom/")
   :prefix "custom-"
@@ -659,7 +659,8 @@ groups after non-groups, if nil do not order groups at all."
   (interactive)
   (let ((children custom-options))
     (mapcar (lambda (child)
-             (when (memq (widget-get child :custom-state) '(modified set))
+             (when (memq (widget-get child :custom-state)
+                         '(modified set changed rogue))
                (widget-apply child :custom-save)))
            children))
   (custom-save-all))
@@ -686,27 +687,33 @@ when the action is chosen.")
   "Reset all modified group members to their current value."
   (interactive)
   (let ((children custom-options))
-    (mapcar (lambda (child)
-             (when (eq (widget-get child :custom-state) 'modified)
-               (widget-apply child :custom-reset-current)))
+    (mapcar (lambda (widget)
+             (and (default-boundp (widget-value widget))
+                  (if (memq (widget-get widget :custom-state) 
+                            '(modified changed))
+                      (widget-apply widget :custom-reset-current))))
            children)))
 
 (defun Custom-reset-saved (&rest ignore)
   "Reset all modified or set group members to their saved value."
   (interactive)
   (let ((children custom-options))
-    (mapcar (lambda (child)
-             (when (eq (widget-get child :custom-state) 'modified)
-               (widget-apply child :custom-reset-saved)))
+    (mapcar (lambda (widget)
+             (and (get (widget-value widget) 'saved-value)
+                  (if (memq (widget-get widget :custom-state)
+                            '(modified set changed rogue))
+                      (widget-apply widget :custom-reset-saved))))
            children)))
 
 (defun Custom-reset-standard (&rest ignore)
   "Reset all modified, set, or saved group members to their standard settings."
   (interactive)
   (let ((children custom-options))
-    (mapcar (lambda (child)
-             (when (eq (widget-get child :custom-state) 'modified)
-               (widget-apply child :custom-reset-standard)))
+    (mapcar (lambda (widget)
+             (and (get (widget-value widget) 'standard-value)
+                  (if (memq (widget-get widget :custom-state)
+                            '(modified set changed saved rogue))
+                      (widget-apply widget :custom-reset-standard))))
            children)))
 
 ;;; The Customize Commands
@@ -868,21 +875,57 @@ are shown; the contents of those subgroups are initially hidden."
 (defun customize-option (symbol)
   "Customize SYMBOL, which must be a user option variable."
   (interactive (custom-variable-prompt))
+  ;; If we don't have SYMBOL's real definition loaded,
+  ;; try to load it.
+  (unless (get symbol 'custom-type)
+    (let ((loaddefs-file (locate-library "loaddefs.el" t))
+         file)
+      ;; See if it is autoloaded from some library.
+      (when loaddefs-file
+       (with-temp-buffer
+         (insert-file-contents loaddefs-file)
+         (when (re-search-forward (concat "^(defvar " (symbol-name symbol))
+                                  nil t)
+           (search-backward "\n;;; Generated autoloads from ")
+           (goto-char (match-end 0))
+           (setq file (buffer-substring (point)
+                                        (progn (end-of-line) (point)))))))
+      ;; If it is, load that library.
+      (when file
+       (when (string-match "\\.el\\'" file)
+         (setq file (substring file 0 (match-beginning 0))))
+       (load file))))
+  (unless (get symbol 'custom-type)
+    (error "Variable %s cannot be customized" symbol))
   (custom-buffer-create (list (list symbol 'custom-variable))
                        (format "*Customize Option: %s*"
                                (custom-unlispify-tag-name symbol))))
 
+(defvar customize-changed-options-previous-release "20.2"
+  "Version for `customize-changed-options' to refer back to by default.")
+
 ;;;###autoload
 (defun customize-changed-options (since-version)
-  "Customize all user option variables whose default values changed recently.
-This means, in other words, variables and groups defined with a `:version' 
-option."
+  "Customize all user option variables changed in Emacs itself.
+This includes new user option variables and faces, and new
+customization groups, as well as older options and faces whose default
+values have changed since the previous major Emacs release.
+
+With argument SINCE-VERSION (a string), customize all user option
+variables that were added (or their meanings were changed) since that
+version."
+
   (interactive "sCustomize options changed, since version (default all versions): ")
   (if (equal since-version "")
       (setq since-version nil))
-  (let ((found nil))
+  (unless since-version
+    (setq since-version customize-changed-options-previous-release))
+  (let ((found nil)
+       (versions nil))
     (mapatoms (lambda (symbol)
                (and (or (boundp symbol)
+                        ;; For variables not yet loaded.
+                        (get symbol 'standard-value)
                         ;; For groups the previous test fails, this one
                         ;; could be used to determine if symbol is a
                         ;; group. Is there a better way for this?
@@ -890,7 +933,11 @@ option."
                     (let ((version (get symbol 'custom-version)))
                       (and version
                            (or (null since-version)
-                               (customize-version-lessp since-version version))))
+                               (customize-version-lessp since-version version))
+                           (if (member version versions) 
+                               t
+                             ;;; Collect all versions that we use.
+                             (push version versions))))
                     (setq found
                           ;; We have to set the right thing here,
                           ;; depending if we have a group or a
@@ -899,11 +946,32 @@ option."
                               (cons (list symbol 'custom-group) found)
                             (cons (list symbol 'custom-variable) found))))))
     (if (not found)
-       (error "No user options have changed defaults in recent Emacs versions")
-      (custom-buffer-create (custom-sort-items found t nil)
+       (error "No user option defaults have been changed since Emacs %s"
+              since-version)
+      (let ((flist nil))
+       (while versions
+         (push (copy-sequence 
+                (cdr (assoc (car versions)  custom-versions-load-alist)))
+               flist)
+         (setq versions (cdr versions)))
+       (put 'custom-versions-load-alist 'custom-loads 
+            ;; Get all the files that correspond to element from the
+            ;; VERSIONS list. This could use some simplification.
+            (apply 'nconc flist)))
+      ;; Because we set all the files needed to be loaded as a
+      ;; `custom-loads' property to `custom-versions-load-alist' this
+      ;; call will actually load them.
+      (custom-load-symbol 'custom-versions-load-alist)
+      ;; Clean up
+      (put 'custom-versions-load-alist 'custom-loads nil)
+      (custom-buffer-create (custom-sort-items found t 'first)
                            "*Customize Changed Options*"))))
 
 (defun customize-version-lessp (version1 version2)
+  ;; In case someone made a mistake and left out the quotes
+  ;; in the :version value.
+  (if (numberp version2)
+      (setq version2 (prin1-to-string version2)))
   (let (major1 major2 minor1 minor2)
     (string-match "\\([0-9]+\\)[.]\\([0-9]+\\)" version1)
     (setq major1 (read (match-string 1 version1)))
@@ -1183,7 +1251,7 @@ Reset all values in this buffer to their standard settings."
                (length (length options)))
            (mapcar (lambda (entry)
                        (prog2
-                           (message "Creating customization items %2d%%..."
+                           (message "Creating customization items ...%2d%%"
                                     (/ (* 100.0 count) length))
                            (widget-create (nth 1 entry)
                                         :tag (custom-unlispify-tag-name
@@ -1196,7 +1264,7 @@ Reset all values in this buffer to their standard settings."
                      options))))
   (unless (eq (preceding-char) ?\n)
     (widget-insert "\n"))
-  (message "Creating customization items %2d%%...done" 100)
+  (message "Creating customization items ...%2d%%done" 100)
   (unless (eq custom-buffer-style 'tree)
     (mapcar 'custom-magic-reset custom-options))
   (message "Creating customization setup...")
@@ -1451,8 +1519,8 @@ The list should be sorted most significant first.")
   "If non-nil, show textual description of the state.
 If `long', show a full-line description, not just one word."
   :type '(choice (const :tag "no" nil)
-                (const short)
-                (const long))
+                (const long)
+                (other :tag "short" short))
   :group 'custom-buffer)
 
 (defcustom custom-magic-show-hidden '(option face)
@@ -3269,7 +3337,7 @@ The format is suitable for use with `easy-menu-define'."
     ["Reset to Current" Custom-reset-current t]
     ["Reset to Saved" Custom-reset-saved t]
     ["Reset to Standard Settings" Custom-reset-standard t]
-    ["Info" (Info-goto-node "(custom)The Customization Buffer") t]))
+    ["Info" (Info-goto-node "(emacs)Easy Customization") t]))
 
 (defun Custom-goto-parent ()
   "Go to the parent group listed at the top of this buffer.