X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/1a578e9be2034298bb8ac29b7b84086a4ab290f4..c449997d16a02f72175c6bbe88e187fd4ccc28a4:/lisp/cus-edit.el diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el index 9dc8ef02a1..eb7fe0472a 100644 --- a/lisp/cus-edit.el +++ b/lisp/cus-edit.el @@ -1,6 +1,6 @@ -;;; 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 Free Software Foundation, Inc. +;; Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ;; ;; Author: Per Abrahamsen ;; Keywords: help, faces @@ -431,6 +431,7 @@ WIDGET is the widget to apply the filter entries of MENU on." (defcustom custom-unlispify-remove-prefixes nil "Non-nil means remove group prefixes from option names in buffer." :group 'custom-menu + :group 'custom-buffer :type 'boolean) (defun custom-unlispify-menu-entry (symbol &optional no-suffix) @@ -748,7 +749,7 @@ it as the third element in the list." ;;;###autoload (defun customize-set-value (var val &optional comment) - "Set VARIABLE to VALUE. VALUE is a Lisp object. + "Set VARIABLE to VALUE, and return VALUE. VALUE is a Lisp object. If VARIABLE has a `variable-interactive' property, that is used as if it were the arg to `interactive' (which see) to interactively read the value. @@ -761,15 +762,16 @@ If given a prefix (or a COMMENT argument), also prompt for a comment." "Set %s to value: " current-prefix-arg)) - (set var val) (cond ((string= comment "") (put var 'variable-comment nil)) (comment - (put var 'variable-comment comment)))) + (put var 'variable-comment comment))) + (set var val)) ;;;###autoload (defun customize-set-variable (variable value &optional comment) - "Set the default for VARIABLE to VALUE. VALUE is a Lisp object. + "Set the default for VARIABLE to VALUE, and return VALUE. +VALUE is a Lisp object. If VARIABLE has a `custom-set' property, that is used for setting VARIABLE, otherwise `set-default' is used. @@ -787,6 +789,7 @@ If given a prefix (or a COMMENT argument), also prompt for a comment." (interactive (custom-prompt-variable "Set variable: " "Set customized value for %s to: " current-prefix-arg)) + (custom-load-symbol variable) (funcall (or (get variable 'custom-set) 'set-default) variable value) (put variable 'customized-value (list (custom-quote value))) (cond ((string= comment "") @@ -794,11 +797,14 @@ If given a prefix (or a COMMENT argument), also prompt for a comment." (put variable 'customized-variable-comment nil)) (comment (put variable 'variable-comment comment) - (put variable 'customized-variable-comment comment)))) + (put variable 'customized-variable-comment comment))) + value) ;;;###autoload (defun customize-save-variable (var value &optional comment) "Set the default for VARIABLE to VALUE, and save it for future sessions. +Return VALUE. + If VARIABLE has a `custom-set' property, that is used for setting VARIABLE, otherwise `set-default' is used. @@ -812,7 +818,7 @@ If VARIABLE has a `custom-type' property, it must be a widget and the `:prompt-value' property of that widget will be used for reading the value. If given a prefix (or a COMMENT argument), also prompt for a comment." - (interactive (custom-prompt-variable "Set and ave variable: " + (interactive (custom-prompt-variable "Set and save variable: " "Set and save value for %s as: " current-prefix-arg)) (funcall (or (get var 'custom-set) 'set-default) var value) @@ -823,7 +829,8 @@ If given a prefix (or a COMMENT argument), also prompt for a comment." (comment (put var 'variable-comment comment) (put var 'saved-variable-comment comment))) - (custom-save-all)) + (custom-save-all) + value) ;;;###autoload (defun customize () @@ -1297,14 +1304,13 @@ Un-customize all values in this buffer. They get their standard settings." :tag "Finish" :help-echo (lambda (&rest ignore) - (concat (cond - ((eq custom-buffer-done-function - 'custom-bury-buffer) - "Bury") - ((eq custom-buffer-done-function 'kill-buffer) - "Kill") - (t "Finish with")) - " the buffer.")) + (cond + ((eq custom-buffer-done-function + 'custom-bury-buffer) + "Bury this buffer") + ((eq custom-buffer-done-function 'kill-buffer) + "Kill this buffer") + (t "Finish with this buffer"))) :action #'Custom-buffer-done) (widget-insert "\n\n") (message "Creating customization items...") @@ -1322,21 +1328,21 @@ Un-customize all values in this buffer. They get their standard settings." (let ((count 0) (length (length options))) (mapcar (lambda (entry) - (prog2 - (message "Creating customization items ...%2d%%" - (/ (* 100.0 count) length)) - (widget-create (nth 1 entry) + (prog2 + (message "Creating customization items ...%2d%%" + (/ (* 100.0 count) length)) + (widget-create (nth 1 entry) :tag (custom-unlispify-tag-name (nth 0 entry)) :value (nth 0 entry)) - (setq count (1+ count)) - (unless (eq (preceding-char) ?\n) - (widget-insert "\n")) - (widget-insert "\n"))) - options)))) + (setq count (1+ count)) + (unless (eq (preceding-char) ?\n) + (widget-insert "\n")) + (widget-insert "\n"))) + options)))) (unless (eq (preceding-char) ?\n) (widget-insert "\n")) - (message "Creating customization items ...%2d%%done" 100) + (message "Creating customization items ...done") (unless (eq custom-buffer-style 'tree) (mapc 'custom-magic-reset custom-options)) (message "Creating customization setup...") @@ -1486,7 +1492,7 @@ item in another window.\n\n")) (defface custom-invalid-face '((((class color)) (:foreground "yellow" :background "red")) (t - (:bold t :italic t :underline t))) + (:weight bold :slant italic :underline t))) "Face used when the customize item is invalid." :group 'custom-magic-faces) @@ -1500,21 +1506,21 @@ item in another window.\n\n")) (defface custom-modified-face '((((class color)) (:foreground "white" :background "blue")) (t - (:italic t :bold))) + (:slant italic :bold))) "Face used when the customize item has been modified." :group 'custom-magic-faces) (defface custom-set-face '((((class color)) (:foreground "blue" :background "white")) (t - (:italic t))) + (:slant italic))) "Face used when the customize item has been set." :group 'custom-magic-faces) (defface custom-changed-face '((((class color)) (:foreground "white" :background "blue")) (t - (:italic t))) + (:slant italic))) "Face used when the customize item has been changed." :group 'custom-magic-faces) @@ -1705,13 +1711,7 @@ and `face'." ;;; The `custom' Widget. (defface custom-button-face - '((((type x) (class color)) ; Like default modeline - (:box (:line-width 2 :style released-button) - :background "lightgrey" :foreground "black")) - (((type w32) (class color)) ; Like default modeline - (:box (:line-width 2 :style released-button) - :background "lightgrey" :foreground "black")) - (((type mac) (class color)) ; Like default modeline + '((((type x w32 mac) (class color)) ; Like default modeline (:box (:line-width 2 :style released-button) :background "lightgrey" :foreground "black")) (t @@ -1721,13 +1721,7 @@ and `face'." :group 'custom-faces) (defface custom-button-pressed-face - '((((type x) (class color)) - (:box (:line-width 2 :style pressed-button) - :background "lightgrey" :foreground "black")) - (((type w32) (class color)) - (:box (:line-width 2 :style pressed-button) - :background "lightgrey" :foreground "black")) - (((type mac) (class color)) + '((((type x w32 mac) (class color)) (:box (:line-width 2 :style pressed-button) :background "lightgrey" :foreground "black")) (t @@ -1828,6 +1822,7 @@ and `face'." (defvar custom-load-recursion nil "Hack to avoid recursive dependencies.") +;;;###autoload (defun custom-load-symbol (symbol) "Load all dependencies for SYMBOL." (unless custom-load-recursion @@ -1845,14 +1840,22 @@ and `face'." ((and (boundp 'preloaded-file-list) (member load preloaded-file-list))) ((assoc load load-history)) - ((assoc (locate-library load) load-history)) + ;; This was just (assoc (locate-library load) load-history) + ;; but has been optimized not to load locate-library + ;; if not necessary. + ((let (found (regexp (regexp-quote load))) + (dolist (loaded load-history) + (and (string-match regexp (car loaded)) + (eq (locate-library load) (car loaded)) + (setq found t))) + found)) + ;; Without this, we would load cus-edit recursively. + ;; We are still loading it when we call this, + ;; and it is not in load-history yet. + ((equal load "cus-edit")) (t (condition-case nil - ;; Without this, we would load cus-edit recursively. - ;; We are still loading it when we call this, - ;; and it is not in load-history yet. - (or (equal load "cus-edit") - (load-library load)) + (load-library load) (error nil)))))))) (defun custom-load-widget (widget) @@ -1963,7 +1966,7 @@ If INITIAL-STRING is non-nil, use that rather than \"Parent groups:\"." (background dark)) (:background "dim gray")) (t - (:italic t))) + (:slant italic))) "Face used for comments on variables or faces" :version "21.1" :group 'custom-faces) @@ -1973,10 +1976,10 @@ If INITIAL-STRING is non-nil, use that rather than \"Parent groups:\"." '((((class color) (background dark)) (:foreground "gray80")) (((class color) (background light)) (:foreground "blue4")) (((class grayscale) (background light)) - (:foreground "DimGray" :bold t :italic t)) + (:foreground "DimGray" :weight bold :slant italic)) (((class grayscale) (background dark)) - (:foreground "LightGray" :bold t :italic t)) - (t (:bold t))) + (:foreground "LightGray" :weight bold :slant italic)) + (t (:weight bold))) "Face used for variables or faces comment tags" :group 'custom-faces) @@ -2021,15 +2024,15 @@ If INITIAL-STRING is non-nil, use that rather than \"Parent groups:\"." (defface custom-variable-tag-face `((((class color) (background dark)) - (:foreground "light blue" :bold t :height 1.2 :inherit variable-pitch)) + (:foreground "light blue" :weight bold :height 1.2 :inherit variable-pitch)) (((class color) (background light)) - (:foreground "blue" :bold t :height 1.2 :inherit variable-pitch)) - (t (:bold t))) + (:foreground "blue" :weight bold :height 1.2 :inherit variable-pitch)) + (t (:weight bold))) "Face used for unpushable variable tags." :group 'custom-faces) -(defface custom-variable-button-face '((t (:underline t :bold t))) +(defface custom-variable-button-face '((t (:underline t :weight bold))) "Face used for pushable variable tags." :group 'custom-faces) @@ -2391,7 +2394,7 @@ Optional EVENT is the location for the menu." (error "Cannot set hidden variable")) ((setq val (widget-apply child :validate)) (goto-char (widget-get val :from)) - (error "%s" (widget-get val :error))) + (error "Saving %s: %s" symbol (widget-get val :error))) ((memq form '(lisp mismatch)) (when (equal comment "") (setq comment nil) @@ -2464,6 +2467,11 @@ restoring it to the state of a variable that has never been customized." :tag "Attributes" :extra-offset 12 :button-args '(:help-echo "Control whether this attribute has any effect.") + :value-to-internal 'custom-face-edit-fix-value + :match (lambda (widget value) + (widget-checklist-match widget + (custom-face-edit-fix-value widget value))) + :convert-widget 'custom-face-edit-convert-widget :args (mapcar (lambda (att) (list 'group :inline t @@ -2472,6 +2480,91 @@ restoring it to the state of a variable that has never been customized." (nth 1 att))) custom-face-attributes)) +(defun custom-face-edit-fix-value (widget value) + "Ignoring WIDGET, convert :bold and :italic in VALUE to new form." + (let (result) + (while value + (let ((key (car value)) + (val (car (cdr value)))) + (cond ((eq key :italic) + (push :slant result) + (push (if val 'italic 'normal) result)) + ((eq key :bold) + (push :weight result) + (push (if val 'bold 'normal) result)) + (t + (push key result) + (push val result)))) + (setq value (cdr (cdr value)))) + (setq result (nreverse result)) + result)) + +(defun custom-face-edit-convert-widget (widget) + "Convert :args as widget types in WIDGET." + (widget-put + widget + :args (mapcar (lambda (arg) + (widget-convert arg + :deactivate 'custom-face-edit-deactivate + :activate 'custom-face-edit-activate + :delete 'custom-face-edit-delete)) + (widget-get widget :args))) + widget) + +(defun custom-face-edit-deactivate (widget) + "Make face widget WIDGET inactive for user modifications." + (unless (widget-get widget :inactive) + (let ((tag (custom-face-edit-attribute-tag widget)) + (from (copy-marker (widget-get widget :from))) + (to (widget-get widget :to)) + (value (widget-value widget)) + (inhibit-read-only t) + (inhibit-modification-hooks t)) + (save-excursion + (goto-char from) + (widget-default-delete widget) + (insert tag ": *\n") + (widget-put widget :inactive + (cons value (cons from (- (point) from)))))))) + +(defun custom-face-edit-activate (widget) + "Make face widget WIDGET inactive for user modifications." + (let ((inactive (widget-get widget :inactive)) + (inhibit-read-only t) + (inhibit-modification-hooks t)) + (when (consp inactive) + (save-excursion + (goto-char (car (cdr inactive))) + (delete-region (point) (+ (point) (cdr (cdr inactive)))) + (widget-put widget :inactive nil) + (widget-apply widget :create) + (widget-value-set widget (car inactive)) + (widget-setup))))) + +(defun custom-face-edit-delete (widget) + "Remove widget from the buffer." + (let ((inactive (widget-get widget :inactive)) + (inhibit-read-only t) + (inhibit-modification-hooks t)) + (if (not inactive) + ;; Widget is alive, we don't have to do anything special + (widget-default-delete widget) + ;; WIDGET is already deleted because we did so to inactivate it; + ;; now just get rid of the label we put in its place. + (delete-region (car (cdr inactive)) + (+ (car (cdr inactive)) (cdr (cdr inactive)))) + (widget-put widget :inactive nil)))) + + +(defun custom-face-edit-attribute-tag (widget) + "Returns the first :tag property in WIDGET or one of its children." + (let ((tag (widget-get widget :tag))) + (or (and (not (equal tag "")) tag) + (let ((children (widget-get widget :children))) + (while (and (null tag) children) + (setq tag (custom-face-edit-attribute-tag (pop children)))) + tag)))) + ;;; The `custom-display' Widget. (define-widget 'custom-display 'menu-choice @@ -2546,7 +2639,7 @@ Match frames with dark backgrounds.") ;;; The `custom-face' Widget. (defface custom-face-tag-face - `((t (:bold t :height 1.2 :inherit variable-pitch))) + `((t (:weight bold :height 1.2 :inherit variable-pitch))) "Face used for face tags." :group 'custom-faces) @@ -2606,6 +2699,47 @@ Match frames with dark backgrounds.") (defconst custom-face-selected (widget-convert 'custom-face-selected) "Converted version of the `custom-face-selected' widget.") +(defun custom-filter-face-spec (spec filter-index &optional default-filter) + "Return a canonicalized version of SPEC using. +FILTER-INDEX is the index in the entry for each attribute in +`custom-face-attributes' at which the appropriate filter function can be +found, and DEFAULT-FILTER is the filter to apply for attributes that +don't specify one." + (mapcar (lambda (entry) + ;; Filter a single face-spec entry + (let ((tests (car entry)) + (unfiltered-attrs + ;; Handle both old- and new-style attribute syntax + (if (listp (car (cdr entry))) + (car (cdr entry)) + (cdr entry))) + (filtered-attrs nil)) + ;; Filter each face attribute + (while unfiltered-attrs + (let* ((attr (pop unfiltered-attrs)) + (pre-filtered-value (pop unfiltered-attrs)) + (filter + (or (nth filter-index (assq attr custom-face-attributes)) + default-filter)) + (filtered-value + (if filter + (funcall filter pre-filtered-value) + pre-filtered-value))) + (push filtered-value filtered-attrs) + (push attr filtered-attrs))) + ;; + (list tests filtered-attrs))) + spec)) + +(defun custom-pre-filter-face-spec (spec) + "Return SPEC changed as necessary for editing by the face customization widget. +SPEC must be a full face spec." + (custom-filter-face-spec spec 2)) + +(defun custom-post-filter-face-spec (spec) + "Return the customized SPEC in a form suitable for setting the face." + (custom-filter-face-spec spec 3)) + (defun custom-face-value-create (widget) "Create a list of the display specifications for WIDGET." (let ((buttons (widget-get widget :buttons)) @@ -2628,10 +2762,12 @@ Match frames with dark backgrounds.") (t ;; Create tag. (insert tag) + (widget-specify-sample widget begin (point)) (if (eq custom-buffer-style 'face) (insert " ") - (widget-specify-sample widget begin (point)) - (insert ": ")) + (if (string-match "face\\'" tag) + (insert ":") + (insert " face: "))) ;; Sample. (push (widget-create-child-and-convert widget 'item :format "(%{%t%})" @@ -2680,7 +2816,8 @@ Match frames with dark backgrounds.") (unless (widget-get widget :custom-form) (widget-put widget :custom-form custom-face-default-form)) (let* ((symbol (widget-value widget)) - (spec (or (get symbol 'saved-face) + (spec (or (get symbol 'customized-face) + (get symbol 'saved-face) (get symbol 'face-defface-spec) ;; Attempt to construct it. (list (list t (custom-face-attributes-get @@ -2692,6 +2829,7 @@ Match frames with dark backgrounds.") ;; edit it as the user has specified it. (if (not (face-spec-match-p symbol spec (selected-frame))) (setq spec (list (list t (face-attr-construct symbol (selected-frame)))))) + (setq spec (custom-pre-filter-face-spec spec)) (setq edit (widget-create-child-and-convert widget (cond ((and (eq form 'selected) @@ -2805,7 +2943,7 @@ Optional EVENT is the location for the menu." "Make the face attributes in WIDGET take effect." (let* ((symbol (widget-value widget)) (child (car (widget-get widget :children))) - (value (widget-value child)) + (value (custom-post-filter-face-spec (widget-value child))) (comment-widget (widget-get widget :comment-widget)) (comment (widget-value comment-widget))) (when (equal comment "") @@ -2813,7 +2951,11 @@ Optional EVENT is the location for the menu." ;; Make the comment invisible by hand if it's empty (custom-comment-hide comment-widget)) (put symbol 'customized-face value) - (face-spec-set symbol value) + (if (face-spec-choose value) + (face-spec-set symbol value) + ;; face-set-spec ignores empty attribute lists, so just give it + ;; something harmless instead. + (face-spec-set symbol '((t :foreground unspecified)))) (put symbol 'customized-face-comment comment) (put symbol 'face-comment comment) (custom-face-state-set widget) @@ -2828,14 +2970,18 @@ Optional EVENT is the location for the menu." "Prepare for saving WIDGET's face attributes, but don't write `.emacs'." (let* ((symbol (widget-value widget)) (child (car (widget-get widget :children))) - (value (widget-value child)) + (value (custom-post-filter-face-spec (widget-value child))) (comment-widget (widget-get widget :comment-widget)) (comment (widget-value comment-widget))) (when (equal comment "") (setq comment nil) ;; Make the comment invisible by hand if it's empty (custom-comment-hide comment-widget)) - (face-spec-set symbol value) + (if (face-spec-choose value) + (face-spec-set symbol value) + ;; face-set-spec ignores empty attribute lists, so just give it + ;; something harmless instead. + (face-spec-set symbol '((t :foreground unspecified)))) (put symbol 'saved-face value) (put symbol 'customized-face nil) (put symbol 'face-comment comment) @@ -2895,7 +3041,7 @@ restoring it to the state of a face that has never been customized." :convert-widget 'widget-value-convert-widget :button-prefix 'widget-push-button-prefix :button-suffix 'widget-push-button-suffix - :format "%t: %[select face%] %v" + :format "%{%t%}: %[select face%] %v" :tag "Face" :value 'default :value-create 'widget-face-value-create @@ -3001,22 +3147,22 @@ and so forth. The remaining group tags are shown with (defface custom-group-tag-face-1 `((((class color) (background dark)) - (:foreground "pink" :bold t :height 1.2 :inherit variable-pitch)) + (:foreground "pink" :weight bold :height 1.2 :inherit variable-pitch)) (((class color) (background light)) - (:foreground "red" :bold t :height 1.2 :inherit variable-pitch)) - (t (:bold t))) + (:foreground "red" :weight bold :height 1.2 :inherit variable-pitch)) + (t (:weight bold))) "Face used for group tags." :group 'custom-faces) (defface custom-group-tag-face `((((class color) (background dark)) - (:foreground "light blue" :bold t :height 1.2)) + (:foreground "light blue" :weight bold :height 1.2)) (((class color) (background light)) - (:foreground "blue" :bold t :height 1.2)) - (t (:bold t))) + (:foreground "blue" :weight bold :height 1.2)) + (t (:weight bold))) "Face used for low level group tags." :group 'custom-faces) @@ -3400,9 +3546,19 @@ to the new custom file. This will preserve your existing customizations." "Return the file name for saving customizations." (setq custom-file (or custom-file - user-init-file - (read-file-name "File for customizations: " - "~/" nil nil ".emacs")))) + (let ((user-init-file user-init-file) + (default-init-file + (if (eq system-type 'ms-dos) "~/_emacs" "~/.emacs"))) + (when (null user-init-file) + (if (or (file-exists-p default-init-file) + (and (eq system-type 'windows-nt) + (file-exists-p "~/_emacs"))) + ;; Started with -q, i.e. the file containing + ;; Custom settings hasn't been read. Saving + ;; settings there would overwrite other settings. + (error "Saving settings from \"emacs -q\" would overwrite existing customizations")) + (setq user-init-file default-init-file)) + user-init-file)))) (defun custom-save-delete (symbol) "Visit `custom-file' and delete all calls to SYMBOL from it. @@ -3431,7 +3587,17 @@ or (if there were none) at the end of the buffer." (setq first (point))))))) (if first (goto-char first) - (goto-char (point-max))))) + ;; Move in front of local variables, otherwise long Custom + ;; entries would make them ineffective. + (let ((pos (point-max)) + (case-fold-search t)) + (save-excursion + (goto-char (point-max)) + (search-backward "\n\^L" (max (- (point-max) 3000) (point-min)) + 'move) + (when (search-forward "Local Variables:" nil t) + (setq pos (line-beginning-position)))) + (goto-char pos))))) (defun custom-save-variables () "Save all customized variables in `custom-file'." @@ -3450,7 +3616,7 @@ or (if there were none) at the end of the buffer." (princ "\n")) (princ "(custom-set-variables ;; custom-set-variables was added by Custom -- don't edit or cut/paste it! - ;; Your init file must only contain one such instance.\n") + ;; Your init file should contain only one such instance.\n") (mapcar (lambda (symbol) (let ((value (get symbol 'saved-value)) @@ -3514,7 +3680,7 @@ or (if there were none) at the end of the buffer." (princ "\n")) (princ "(custom-set-faces ;; custom-set-faces was added by Custom -- don't edit or cut/paste it! - ;; Your init file must only contain one such instance.\n") + ;; Your init file should contain only one such instance.\n") (mapcar (lambda (symbol) (let ((value (get symbol 'saved-face)) @@ -3584,7 +3750,62 @@ or (if there were none) at the end of the buffer." (save-excursion (let ((default-major-mode nil)) (set-buffer (find-file-noselect (custom-file)))) - (save-buffer)))) + (let ((file-precious-flag t)) + (save-buffer))))) + +;;;###autoload +(defun customize-mark-to-save (symbol) + "Mark SYMBOL for later saving. + +If the default value of SYMBOL is different from the standard value, +set the `saved-value' property to a list whose car evaluates to the +default value. Otherwise, set it til nil. + +To actually save the value, call `custom-save-all'. + +Return non-nil iff the `saved-value' property actually changed." + (let* ((get (or (get symbol 'custom-get) 'default-value)) + (value (funcall get symbol)) + (saved (get symbol 'saved-value)) + (standard (get symbol 'standard-value)) + (comment (get symbol 'customized-variable-comment))) + ;; Save default value iff different from standard value. + (if (or (null standard) + (not (equal value (condition-case nil + (eval (car standard)) + (error nil))))) + (put symbol 'saved-value (list (custom-quote value))) + (put symbol 'saved-value nil)) + ;; Clear customized information (set, but not saved). + (put symbol 'customized-value nil) + ;; Save any comment that might have been set. + (when comment + (put symbol 'saved-variable-comment comment)) + (not (equal saved (get symbol 'saved-value))))) + +;;;###autoload +(defun customize-mark-as-set (symbol) + "Mark current value of SYMBOL as being set from customize. + +If the default value of SYMBOL is different from the saved value if any, +or else if it is different from the standard value, set the +`customized-value' property to a list whose car evaluates to the +default value. Otherwise, set it til nil. + +Return non-nil iff the `customized-value' property actually changed." + (let* ((get (or (get symbol 'custom-get) 'default-value)) + (value (funcall get symbol)) + (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))))) + (put symbol 'customized-value (list (custom-quote value))) + (put symbol 'customized-value nil)) + ;; Changed? + (not (equal customized (get symbol 'customized-value))))) ;;; The Customize Menu. @@ -3663,7 +3884,7 @@ The format is suitable for use with `easy-menu-define'." (setq name "Customize")) `(,name :filter (lambda (&rest junk) - (cdr (custom-menu-create ',symbol))))) + (custom-menu-create ',symbol)))) ;;; The Custom Mode. @@ -3671,6 +3892,8 @@ The format is suitable for use with `easy-menu-define'." "Keymap for `custom-mode'.") (unless custom-mode-map + ;; This keymap should be dense, but a dense keymap would prevent inheriting + ;; "\r" bindings from the parent map. (setq custom-mode-map (make-sparse-keymap)) (set-keymap-parent custom-mode-map widget-keymap) (suppress-keymap custom-mode-map) @@ -3765,10 +3988,11 @@ if that value is non-nil." (set (make-local-variable 'widget-push-button-suffix) "") (set (make-local-variable 'widget-link-prefix) "") (set (make-local-variable 'widget-link-suffix) "")) - (make-local-hook 'widget-edit-functions) (add-hook 'widget-edit-functions 'custom-state-buffer-message nil t) (run-hooks 'custom-mode-hook)) +(put 'custom-mode 'mode-class 'special) + (add-to-list 'debug-ignored-errors "^No user options have changed defaults in recent Emacs versions$")