]> code.delx.au - gnu-emacs/blobdiff - lisp/cus-edit.el
(font-lock-extra-managed-props, font-lock-keywords, font-lock-maximum-size,
[gnu-emacs] / lisp / cus-edit.el
index 82a5e887bedcdf5c720b7dc9c170c7e1d7aa3dad..9827ab7d5949052cf757cfcb897f40ce4abb0bec 100644 (file)
@@ -1,7 +1,7 @@
 ;;; cus-edit.el --- tools for customizing Emacs and Lisp packages
 ;;
 ;;; cus-edit.el --- tools for customizing Emacs and Lisp packages
 ;;
-;; Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;;           Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004,
+;;   2005 Free Software Foundation, Inc.
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Maintainer: FSF
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Maintainer: FSF
@@ -21,8 +21,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
 
 ;; 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.
 
 ;;; Commentary:
 ;;
 
 ;;; Commentary:
 ;;
 (require 'cus-face)
 (require 'wid-edit)
 (eval-when-compile
 (require 'cus-face)
 (require 'wid-edit)
 (eval-when-compile
-  (defvar custom-versions-load-alist)) ; from cus-load
+  (defvar custom-versions-load-alist)  ; from cus-load
+  (defvar recentf-exclude))            ; from recentf.el
 
 (condition-case nil
     (require 'cus-load)
 
 (condition-case nil
     (require 'cus-load)
   :group 'development)
 
 (defgroup minibuffer nil
   :group 'development)
 
 (defgroup minibuffer nil
-  "Controling the behaviour of the minibuffer."
+  "Controling the behavior of the minibuffer."
   :link '(custom-manual "(emacs)Minibuffer")
   :group 'environment)
 
   :link '(custom-manual "(emacs)Minibuffer")
   :group 'environment)
 
@@ -669,7 +670,7 @@ If `last', order groups after non-groups."
   :type 'boolean
   :group 'custom-browse)
 
   :type 'boolean
   :group 'custom-browse)
 
-(defcustom custom-buffer-sort-alphabetically nil
+(defcustom custom-buffer-sort-alphabetically t
   "If non-nil, sort members of each customization group alphabetically."
   :type 'boolean
   :group 'custom-buffer)
   "If non-nil, sort members of each customization group alphabetically."
   :type 'boolean
   :group 'custom-buffer)
@@ -1021,9 +1022,12 @@ then prompt for the MODE to customize."
 (defun customize-option (symbol)
   "Customize SYMBOL, which must be a user option variable."
   (interactive (custom-variable-prompt))
 (defun customize-option (symbol)
   "Customize SYMBOL, which must be a user option variable."
   (interactive (custom-variable-prompt))
-  (custom-buffer-create (list (list symbol 'custom-variable))
-                       (format "*Customize Option: %s*"
-                               (custom-unlispify-tag-name symbol))))
+  (let ((basevar (indirect-variable symbol)))
+    (custom-buffer-create (list (list basevar 'custom-variable))
+                         (format "*Customize Option: %s*"
+                                 (custom-unlispify-tag-name basevar)))
+    (unless (eq symbol basevar)
+      (message "`%s' is an alias for `%s'" symbol basevar))))
 
 ;;;###autoload
 (defalias 'customize-variable-other-window 'customize-option-other-window)
 
 ;;;###autoload
 (defalias 'customize-variable-other-window 'customize-option-other-window)
@@ -1033,9 +1037,12 @@ then prompt for the MODE to customize."
   "Customize SYMBOL, which must be a user option variable.
 Show the buffer in another window, but don't select it."
   (interactive (custom-variable-prompt))
   "Customize SYMBOL, which must be a user option variable.
 Show the buffer in another window, but don't select it."
   (interactive (custom-variable-prompt))
-  (custom-buffer-create-other-window
-   (list (list symbol 'custom-variable))
-   (format "*Customize Option: %s*" (custom-unlispify-tag-name symbol))))
+  (let ((basevar (indirect-variable symbol)))
+    (custom-buffer-create-other-window
+     (list (list basevar 'custom-variable))
+     (format "*Customize Option: %s*" (custom-unlispify-tag-name basevar)))
+    (unless (eq symbol basevar)
+      (message "`%s' is an alias for `%s'" symbol basevar))))
 
 (defvar customize-changed-options-previous-release "20.2"
   "Version for `customize-changed-options' to refer back to by default.")
 
 (defvar customize-changed-options-previous-release "20.2"
   "Version for `customize-changed-options' to refer back to by default.")
@@ -1116,7 +1123,8 @@ version."
 ;;;###autoload
 (defun customize-face (&optional face)
   "Customize FACE, which should be a face name or nil.
 ;;;###autoload
 (defun customize-face (&optional face)
   "Customize FACE, which should be a face name or nil.
-If FACE is nil, customize all faces.
+If FACE is nil, customize all faces.  If FACE is actually a
+face-alias, customize the face it is aliased to.
 
 Interactively, when point is on text which has a face specified,
 suggest to customize that face, if it's customizable."
 
 Interactively, when point is on text which has a face specified,
 suggest to customize that face, if it's customizable."
@@ -1133,6 +1141,9 @@ suggest to customize that face, if it's customizable."
                                     face)
                             t nil)
                            "*Customize Faces*")
                                     face)
                             t nil)
                            "*Customize Faces*")
+    ;; If FACE is actually an alias, customize the face it is aliased to.
+    (if (get face 'face-alias)
+        (setq face (get face 'face-alias)))
     (unless (facep face)
       (error "Invalid face %S" face))
     (custom-buffer-create (list (list face 'custom-face))
     (unless (facep face)
       (error "Invalid face %S" face))
     (custom-buffer-create (list (list face 'custom-face))
@@ -1142,6 +1153,7 @@ suggest to customize that face, if it's customizable."
 ;;;###autoload
 (defun customize-face-other-window (&optional face)
   "Show customization buffer for face FACE in other window.
 ;;;###autoload
 (defun customize-face-other-window (&optional face)
   "Show customization buffer for face FACE in other window.
+If FACE is actually a face-alias, customize the face it is aliased to.
 
 Interactively, when point is on text which has a face specified,
 suggest to customize that face, if it's customizable."
 
 Interactively, when point is on text which has a face specified,
 suggest to customize that face, if it's customizable."
@@ -1159,6 +1171,8 @@ suggest to customize that face, if it's customizable."
                face)
        t nil)
        "*Customize Faces*")
                face)
        t nil)
        "*Customize Faces*")
+    (if (get face 'face-alias)
+        (setq face (get face 'face-alias)))
     (unless (facep face)
       (error "Invalid face %S" face))
     (custom-buffer-create-other-window
     (unless (facep face)
       (error "Invalid face %S" face))
     (custom-buffer-create-other-window
@@ -1636,50 +1650,62 @@ item in another window.\n\n"))
   :group 'custom-faces
   :group 'custom-buffer)
 
   :group 'custom-faces
   :group 'custom-buffer)
 
-(defface custom-invalid-face '((((class color))
-                               (:foreground "yellow1" :background "red1"))
-                              (t
-                               (:weight bold :slant italic :underline t)))
+(defface custom-invalid '((((class color))
+                          (:foreground "yellow1" :background "red1"))
+                         (t
+                          (:weight bold :slant italic :underline t)))
   "Face used when the customize item is invalid."
   :group 'custom-magic-faces)
   "Face used when the customize item is invalid."
   :group 'custom-magic-faces)
+;; backward-compatibility alias
+(put 'custom-invalid-face 'face-alias 'custom-invalid)
 
 
-(defface custom-rogue-face '((((class color))
-                             (:foreground "pink" :background "black"))
-                            (t
-                             (:underline t)))
+(defface custom-rogue '((((class color))
+                        (:foreground "pink" :background "black"))
+                       (t
+                        (:underline t)))
   "Face used when the customize item is not defined for customization."
   :group 'custom-magic-faces)
   "Face used when the customize item is not defined for customization."
   :group 'custom-magic-faces)
+;; backward-compatibility alias
+(put 'custom-rogue-face 'face-alias 'custom-rogue)
 
 
-(defface custom-modified-face '((((min-colors 88) (class color))
-                                (:foreground "white" :background "blue1"))
-                               (((class color))
-                                (:foreground "white" :background "blue"))
-                               (t
-                                (:slant italic :bold)))
-  "Face used when the customize item has been modified."
-  :group 'custom-magic-faces)
-
-(defface custom-set-face '((((min-colors 88) (class color))
-                           (:foreground "blue1" :background "white"))
+(defface custom-modified '((((min-colors 88) (class color))
+                           (:foreground "white" :background "blue1"))
                           (((class color))
                           (((class color))
-                           (:foreground "blue" :background "white"))
+                           (:foreground "white" :background "blue"))
                           (t
                           (t
-                           (:slant italic)))
+                           (:slant italic :bold)))
+  "Face used when the customize item has been modified."
+  :group 'custom-magic-faces)
+;; backward-compatibility alias
+(put 'custom-modified-face 'face-alias 'custom-modified)
+
+(defface custom-set '((((min-colors 88) (class color))
+                      (:foreground "blue1" :background "white"))
+                     (((class color))
+                      (:foreground "blue" :background "white"))
+                     (t
+                      (:slant italic)))
   "Face used when the customize item has been set."
   :group 'custom-magic-faces)
   "Face used when the customize item has been set."
   :group 'custom-magic-faces)
-
-(defface custom-changed-face '((((min-colors 88) (class color))
-                               (:foreground "white" :background "blue1"))
-                              (((class color))
-                               (:foreground "white" :background "blue"))
-                              (t
-                               (:slant italic)))
+;; backward-compatibility alias
+(put 'custom-set-face 'face-alias 'custom-set)
+
+(defface custom-changed '((((min-colors 88) (class color))
+                          (:foreground "white" :background "blue1"))
+                         (((class color))
+                          (:foreground "white" :background "blue"))
+                         (t
+                          (:slant italic)))
   "Face used when the customize item has been changed."
   :group 'custom-magic-faces)
   "Face used when the customize item has been changed."
   :group 'custom-magic-faces)
+;; backward-compatibility alias
+(put 'custom-changed-face 'face-alias 'custom-changed)
 
 
-(defface custom-saved-face '((t (:underline t)))
+(defface custom-saved '((t (:underline t)))
   "Face used when the customize item has been saved."
   :group 'custom-magic-faces)
   "Face used when the customize item has been saved."
   :group 'custom-magic-faces)
+;; backward-compatibility alias
+(put 'custom-saved-face 'face-alias 'custom-saved)
 
 (defconst custom-magic-alist
   '((nil "#" underline "\
 
 (defconst custom-magic-alist
   '((nil "#" underline "\
@@ -1689,21 +1715,21 @@ UNKNOWN, you should not see this.")
     (hidden "-" default "\
 HIDDEN, invoke \"Show\" in the previous line to show." "\
 group now hidden, invoke \"Show\", above, to show contents.")
     (hidden "-" default "\
 HIDDEN, invoke \"Show\" in the previous line to show." "\
 group now hidden, invoke \"Show\", above, to show contents.")
-    (invalid "x" custom-invalid-face "\
+    (invalid "x" custom-invalid "\
 INVALID, the displayed value cannot be set.")
 INVALID, the displayed value cannot be set.")
-    (modified "*" custom-modified-face "\
+    (modified "*" custom-modified "\
 EDITED, shown value does not take effect until you set or save it." "\
 something in this group has been edited but not set.")
 EDITED, shown value does not take effect until you set or save it." "\
 something in this group has been edited but not set.")
-    (set "+" custom-set-face "\
+    (set "+" custom-set "\
 SET for current session only." "\
 something in this group has been set but not saved.")
 SET for current session only." "\
 something in this group has been set but not saved.")
-    (changed ":" custom-changed-face "\
+    (changed ":" custom-changed "\
 CHANGED outside Customize; operating on it here may be unreliable." "\
 something in this group has been changed outside customize.")
 CHANGED outside Customize; operating on it here may be unreliable." "\
 something in this group has been changed outside customize.")
-    (saved "!" custom-saved-face "\
+    (saved "!" custom-saved "\
 SAVED and set." "\
 something in this group has been set and saved.")
 SAVED and set." "\
 something in this group has been set and saved.")
-    (rogue "@" custom-rogue-face "\
+    (rogue "@" custom-rogue "\
 NO CUSTOMIZATION DATA; you should not see this." "\
 something in this group is not prepared for customization.")
     (standard " " nil "\
 NO CUSTOMIZATION DATA; you should not see this." "\
 something in this group is not prepared for customization.")
     (standard " " nil "\
@@ -1830,7 +1856,7 @@ and `face'."
               (insert " (lisp)"))
              ((eq form 'mismatch)
               (insert " (mismatch)")))
               (insert " (lisp)"))
              ((eq form 'mismatch)
               (insert " (mismatch)")))
-       (put-text-property start (point) 'face 'custom-state-face))
+       (put-text-property start (point) 'face 'custom-state))
       (insert "\n"))
     (when (and (eq category 'group)
               (not (and (eq custom-buffer-style 'links)
       (insert "\n"))
     (when (and (eq category 'group)
               (not (and (eq custom-buffer-style 'links)
@@ -1864,7 +1890,7 @@ and `face'."
 
 ;;; The `custom' Widget.
 
 
 ;;; The `custom' Widget.
 
-(defface custom-button-face
+(defface custom-button
   '((((type x w32 mac) (class color))          ; Like default modeline
      (:box (:line-width 2 :style released-button)
           :background "lightgrey" :foreground "black"))
   '((((type x w32 mac) (class color))          ; Like default modeline
      (:box (:line-width 2 :style released-button)
           :background "lightgrey" :foreground "black"))
@@ -1873,8 +1899,10 @@ and `face'."
   "Face used for buttons in customization buffers."
   :version "21.1"
   :group 'custom-faces)
   "Face used for buttons in customization buffers."
   :version "21.1"
   :group 'custom-faces)
+;; backward-compatibility alias
+(put 'custom-button-face 'face-alias 'custom-button)
 
 
-(defface custom-button-pressed-face
+(defface custom-button-pressed
   '((((type x w32 mac) (class color))
      (:box (:line-width 2 :style pressed-button)
           :background "lightgrey" :foreground "black"))
   '((((type x w32 mac) (class color))
      (:box (:line-width 2 :style pressed-button)
           :background "lightgrey" :foreground "black"))
@@ -1883,20 +1911,26 @@ and `face'."
   "Face used for buttons in customization buffers."
   :version "21.1"
   :group 'custom-faces)
   "Face used for buttons in customization buffers."
   :version "21.1"
   :group 'custom-faces)
+;; backward-compatibility alias
+(put 'custom-button-pressed-face 'face-alias 'custom-button-pressed)
 
 
-(defface custom-documentation-face nil
+(defface custom-documentation nil
   "Face used for documentation strings in customization buffers."
   :group 'custom-faces)
   "Face used for documentation strings in customization buffers."
   :group 'custom-faces)
-
-(defface custom-state-face '((((class color)
-                              (background dark))
-                             (:foreground "lime green"))
-                            (((class color)
-                              (background light))
-                             (:foreground "dark green"))
-                            (t nil))
+;; backward-compatibility alias
+(put 'custom-documentation-face 'face-alias 'custom-documentation)
+
+(defface custom-state '((((class color)
+                         (background dark))
+                        (:foreground "lime green"))
+                       (((class color)
+                         (background light))
+                        (:foreground "dark green"))
+                       (t nil))
   "Face used for State descriptions in the customize buffer."
   :group 'custom-faces)
   "Face used for State descriptions in the customize buffer."
   :group 'custom-faces)
+;; backward-compatibility alias
+(put 'custom-state-face 'face-alias 'custom-state)
 
 (define-widget 'custom 'default
   "Customize a user option."
 
 (define-widget 'custom 'default
   "Customize a user option."
@@ -2092,20 +2126,22 @@ If INITIAL-STRING is non-nil, use that rather than \"Parent groups:\"."
 ;;; The `custom-comment' Widget.
 
 ;; like the editable field
 ;;; The `custom-comment' Widget.
 
 ;; like the editable field
-(defface custom-comment-face '((((class grayscale color)
-                                (background light))
-                               (:background "gray85"))
-                              (((class grayscale color)
-                                (background dark))
-                               (:background "dim gray"))
-                              (t
-                               (:slant italic)))
+(defface custom-comment '((((class grayscale color)
+                           (background light))
+                          (:background "gray85"))
+                         (((class grayscale color)
+                           (background dark))
+                          (:background "dim gray"))
+                         (t
+                          (:slant italic)))
   "Face used for comments on variables or faces"
   :version "21.1"
   :group 'custom-faces)
   "Face used for comments on variables or faces"
   :version "21.1"
   :group 'custom-faces)
+;; backward-compatibility alias
+(put 'custom-comment-face 'face-alias 'custom-comment)
 
 ;; like font-lock-comment-face
 
 ;; like font-lock-comment-face
-(defface custom-comment-tag-face
+(defface custom-comment-tag
   '((((class color) (background dark)) (:foreground "gray80"))
     (((class color) (background light)) (:foreground "blue4"))
     (((class grayscale) (background light))
   '((((class color) (background dark)) (:foreground "gray80"))
     (((class color) (background light)) (:foreground "blue4"))
     (((class grayscale) (background light))
@@ -2115,6 +2151,8 @@ If INITIAL-STRING is non-nil, use that rather than \"Parent groups:\"."
     (t (:weight bold)))
   "Face used for variables or faces comment tags"
   :group 'custom-faces)
     (t (:weight bold)))
   "Face used for variables or faces comment tags"
   :group 'custom-faces)
+;; backward-compatibility alias
+(put 'custom-comment-tag-face 'face-alias 'custom-comment-tag)
 
 (define-widget 'custom-comment 'string
   "User comment."
 
 (define-widget 'custom-comment 'string
   "User comment."
@@ -2154,7 +2192,7 @@ If INITIAL-STRING is non-nil, use that rather than \"Parent groups:\"."
 
 ;; When this was underlined blue, users confused it with a
 ;; Mosaic-style hyperlink...
 
 ;; When this was underlined blue, users confused it with a
 ;; Mosaic-style hyperlink...
-(defface custom-variable-tag-face
+(defface custom-variable-tag
   `((((class color)
       (background dark))
      (:foreground "light blue" :weight bold :height 1.2 :inherit variable-pitch))
   `((((class color)
       (background dark))
      (:foreground "light blue" :weight bold :height 1.2 :inherit variable-pitch))
@@ -2163,14 +2201,18 @@ If INITIAL-STRING is non-nil, use that rather than \"Parent groups:\"."
      (:foreground "blue1" :weight bold :height 1.2 :inherit variable-pitch))
     (((class color)
       (background light))
      (:foreground "blue1" :weight bold :height 1.2 :inherit variable-pitch))
     (((class color)
       (background light))
-     (:foreground "blue" :weight bold :height 1.2 :inherit variable-pitch))    
+     (:foreground "blue" :weight bold :height 1.2 :inherit variable-pitch))
     (t (:weight bold)))
   "Face used for unpushable variable tags."
   :group 'custom-faces)
     (t (:weight bold)))
   "Face used for unpushable variable tags."
   :group 'custom-faces)
+;; backward-compatibility alias
+(put 'custom-variable-tag-face 'face-alias 'custom-variable-tag)
 
 
-(defface custom-variable-button-face '((t (:underline t :weight bold)))
+(defface custom-variable-button '((t (:underline t :weight bold)))
   "Face used for pushable variable tags."
   :group 'custom-faces)
   "Face used for pushable variable tags."
   :group 'custom-faces)
+;; backward-compatibility alias
+(put 'custom-variable-button-face 'face-alias 'custom-variable-button)
 
 (defcustom custom-variable-default-form 'edit
   "Default form of displaying variable values."
 
 (defcustom custom-variable-default-form 'edit
   "Default form of displaying variable values."
@@ -2874,10 +2916,12 @@ Only match frames that support the specified face attributes.")
 
 ;;; The `custom-face' Widget.
 
 
 ;;; The `custom-face' Widget.
 
-(defface custom-face-tag-face
+(defface custom-face-tag
   `((t (:weight bold :height 1.2 :inherit variable-pitch)))
   "Face used for face tags."
   :group 'custom-faces)
   `((t (:weight bold :height 1.2 :inherit variable-pitch)))
   "Face used for face tags."
   :group 'custom-faces)
+;; backward-compatibility alias
+(put 'custom-face-tag-face 'face-alias 'custom-face-tag)
 
 (defcustom custom-face-default-form 'selected
   "Default form of displaying face definition."
 
 (defcustom custom-face-default-form 'selected
   "Default form of displaying face definition."
@@ -3396,12 +3440,11 @@ restoring it to the state of a face that has never been customized."
   ;; Fixme: make it do so in Emacs.
   "Face used for group tags.
 The first member is used for level 1 groups, the second for level 2,
   ;; Fixme: make it do so in Emacs.
   "Face used for group tags.
 The first member is used for level 1 groups, the second for level 2,
-and so forth.  The remaining group tags are shown with
-`custom-group-tag-face'."
+and so forth.  The remaining group tags are shown with `custom-group-tag'."
   :type '(repeat face)
   :group 'custom-faces)
 
   :type '(repeat face)
   :group 'custom-faces)
 
-(defface custom-group-tag-face-1
+(defface custom-group-tag-1
   `((((class color)
       (background dark))
      (:foreground "pink" :weight bold :height 1.2 :inherit variable-pitch))
   `((((class color)
       (background dark))
      (:foreground "pink" :weight bold :height 1.2 :inherit variable-pitch))
@@ -3414,8 +3457,10 @@ and so forth.  The remaining group tags are shown with
     (t (:weight bold)))
   "Face used for group tags."
   :group 'custom-faces)
     (t (:weight bold)))
   "Face used for group tags."
   :group 'custom-faces)
+;; backward-compatibility alias
+(put 'custom-group-tag-face-1 'face-alias 'custom-group-tag-1)
 
 
-(defface custom-group-tag-face
+(defface custom-group-tag
   `((((class color)
       (background dark))
      (:foreground "light blue" :weight bold :height 1.2))
   `((((class color)
       (background dark))
      (:foreground "light blue" :weight bold :height 1.2))
@@ -3428,6 +3473,8 @@ and so forth.  The remaining group tags are shown with
     (t (:weight bold)))
   "Face used for low level group tags."
   :group 'custom-faces)
     (t (:weight bold)))
   "Face used for low level group tags."
   :group 'custom-faces)
+;; backward-compatibility alias
+(put 'custom-group-tag-face 'face-alias 'custom-group-tag)
 
 (define-widget 'custom-group 'custom
   "Customize group."
 
 (define-widget 'custom-group 'custom
   "Customize group."
@@ -3448,7 +3495,7 @@ and so forth.  The remaining group tags are shown with
 (defun custom-group-sample-face-get (widget)
   ;; Use :sample-face.
   (or (nth (1- (widget-get widget :custom-level)) custom-group-tag-faces)
 (defun custom-group-sample-face-get (widget)
   ;; Use :sample-face.
   (or (nth (1- (widget-get widget :custom-level)) custom-group-tag-faces)
-      'custom-group-tag-face))
+      'custom-group-tag))
 
 (define-widget 'custom-group-visibility 'visibility
   "An indicator and manipulator for hidden group contents."
 
 (define-widget 'custom-group-visibility 'visibility
   "An indicator and manipulator for hidden group contents."
@@ -3789,8 +3836,9 @@ Optional EVENT is the location for the menu."
            (setq magics (cdr magics)))))
       (widget-put widget :custom-state found)))
   (custom-magic-reset widget))
            (setq magics (cdr magics)))))
       (widget-put widget :custom-state found)))
   (custom-magic-reset widget))
+\f
+;;; Reading and writing the custom file.
 
 
-;;; The `custom-save-all' Function.
 ;;;###autoload
 (defcustom custom-file nil
   "File used for storing customization information.
 ;;;###autoload
 (defcustom custom-file nil
   "File used for storing customization information.
@@ -3851,12 +3899,33 @@ if only the first line of the docstring is shown."))
           (setq user-init-file default-init-file))
         user-init-file))))
 
           (setq user-init-file default-init-file))
         user-init-file))))
 
+;;;###autoload
+(defun custom-save-all ()
+  "Save all customizations in `custom-file'."
+  (let* ((filename (custom-file))
+        (recentf-exclude (if recentf-mode
+                             (cons (concat "\\`"
+                                           (regexp-quote (custom-file))
+                                           "\\'")
+                                   recentf-exclude)))
+        (old-buffer (find-buffer-visiting filename)))
+    (with-current-buffer (or old-buffer (find-file-noselect filename))
+      (let ((inhibit-read-only t))
+       (custom-save-variables)
+       (custom-save-faces))
+      (let ((file-precious-flag t))
+       (save-buffer))
+      (unless old-buffer
+       (kill-buffer (current-buffer))))))
+\f
+;; Editing the custom file contents in a buffer.
+
 (defun custom-save-delete (symbol)
 (defun custom-save-delete (symbol)
-  "Visit `custom-file' and delete all calls to SYMBOL from it.
+  "Delete all calls to SYMBOL from the contents of the current buffer.
 Leave point at the old location of the first such call,
 Leave point at the old location of the first such call,
-or (if there were none) at the end of the buffer."
-  (let ((default-major-mode 'emacs-lisp-mode))
-    (set-buffer (find-file-noselect (custom-file))))
+or (if there were none) at the end of the buffer.
+
+This function does not save the buffer."
   (goto-char (point-min))
   ;; Skip all whitespace and comments.
   (while (forward-comment 1))
   (goto-char (point-min))
   ;; Skip all whitespace and comments.
   (while (forward-comment 1))
@@ -4076,19 +4145,7 @@ or (if there were none) at the end of the buffer."
                  (put symbol 'customized-face-comment nil)))))
   ;; We really should update all custom buffers here.
   (custom-save-all))
                  (put symbol 'customized-face-comment nil)))))
   ;; We really should update all custom buffers here.
   (custom-save-all))
-
-;;;###autoload
-(defun custom-save-all ()
-  "Save all customizations in `custom-file'."
-  (let ((inhibit-read-only t))
-    (custom-save-variables)
-    (custom-save-faces)
-    (save-excursion
-      (let ((default-major-mode nil))
-       (set-buffer (find-file-noselect (custom-file))))
-      (let ((file-precious-flag t))
-       (save-buffer)))))
-
+\f
 ;;; The Customize Menu.
 
 ;;; Menu support
 ;;; The Customize Menu.
 
 ;;; Menu support
@@ -4182,6 +4239,7 @@ The format is suitable for use with `easy-menu-define'."
     (suppress-keymap map)
     (define-key map " " 'scroll-up)
     (define-key map "\177" 'scroll-down)
     (suppress-keymap map)
     (define-key map " " 'scroll-up)
     (define-key map "\177" 'scroll-down)
+    (define-key map "\C-c\C-c" 'Custom-set)
     (define-key map "\C-x\C-s" 'Custom-save)
     (define-key map "q" 'Custom-buffer-done)
     (define-key map "u" 'Custom-goto-parent)
     (define-key map "\C-x\C-s" 'Custom-save)
     (define-key map "q" 'Custom-buffer-done)
     (define-key map "u" 'Custom-goto-parent)
@@ -4211,7 +4269,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]
     ["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 "(emacs)Easy Customization") t]))
+    ["Info" (info "(emacs)Easy Customization") t]))
 
 (defun Custom-goto-parent ()
   "Go to the parent group listed at the top of this buffer.
 
 (defun Custom-goto-parent ()
   "Go to the parent group listed at the top of this buffer.
@@ -4261,13 +4319,12 @@ if that value is non-nil."
   (make-local-variable 'custom-options)
   (make-local-variable 'custom-local-buffer)
   (make-local-variable 'widget-documentation-face)
   (make-local-variable 'custom-options)
   (make-local-variable 'custom-local-buffer)
   (make-local-variable 'widget-documentation-face)
-  (setq widget-documentation-face 'custom-documentation-face)
+  (setq widget-documentation-face 'custom-documentation)
   (make-local-variable 'widget-button-face)
   (make-local-variable 'widget-button-face)
-  (setq widget-button-face 'custom-button-face)
-  (set (make-local-variable 'widget-button-pressed-face)
-       'custom-button-pressed-face)
+  (setq widget-button-face 'custom-button)
+  (set (make-local-variable 'widget-button-pressed-face) 'custom-button-pressed)
   (set (make-local-variable 'widget-mouse-face)
   (set (make-local-variable 'widget-mouse-face)
-       'custom-button-pressed-face)    ; buttons `depress' when moused
+       'custom-button-pressed)         ; buttons `depress' when moused
   ;; When possible, use relief for buttons, not bracketing.  This test
   ;; may not be optimal.
   (when custom-raised-buttons
   ;; When possible, use relief for buttons, not bracketing.  This test
   ;; may not be optimal.
   (when custom-raised-buttons