;;; 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.
+;; 2005, 2006 Free Software Foundation, Inc.
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Maintainer: FSF
;; compatibility.
;; You can see (and modify and save) this unevaluated value by selecting
-;; "Show initial Lisp expression" from the Lisp interface. This will
+;; "Show Saved Lisp Expression" from the Lisp interface. This will
;; give you the unevaluated saved value, if any, otherwise the
;; unevaluated standard value.
;;; Utilities.
-(defun custom-quote (sexp)
- "Quote SEXP iff it is not self quoting."
- (if (or (memq sexp '(t nil))
- (keywordp sexp)
- (and (listp sexp)
- (memq (car sexp) '(lambda)))
- (stringp sexp)
- (numberp sexp)
- (vectorp sexp)
-;;; (and (fboundp 'characterp)
-;;; (characterp sexp))
- )
- sexp
- (list 'quote sexp)))
-
(defun custom-split-regexp-maybe (regexp)
"If REGEXP is a string, split it to a list at `\\|'.
You can get the original back with from the result with:
"Customization widgets in the current buffer.")
(defun Custom-set ()
- "Set changes in all modified options."
+ "Set the current value of all edited settings in the buffer."
(interactive)
- (if (y-or-n-p "Set all values according to this buffer? ")
- (let ((children custom-options))
+ (let ((children custom-options))
+ (if (or (and (= 1 (length children))
+ (memq (widget-type (car children))
+ '(custom-variable custom-face)))
+ (y-or-n-p "Set all values according to this buffer? "))
(mapc (lambda (child)
(when (eq (widget-get child :custom-state) 'modified)
(widget-apply child :custom-set)))
- children))
- (message "Aborted")))
+ children)
+ (message "Aborted"))))
(defun Custom-save ()
- "Set all modified group members and save them."
+ "Set all edited settings, then save all settings that have been set.
+If a setting was edited and set before, this saves it.
+If a setting was merely edited before, this sets it then saves it."
(interactive)
- (if (yes-or-no-p "Save all settings in this buffer? ")
- (let ((children custom-options))
- (mapc (lambda (child)
- (when (memq (widget-get child :custom-state)
- '(modified set changed rogue))
- (widget-apply child :custom-save)))
- children)
- (custom-save-all))
- (message "Aborted")))
+ (let ((children custom-options))
+ (if (or (and (= 1 (length children))
+ (memq (widget-type (car children))
+ '(custom-variable custom-face)))
+ (yes-or-no-p "Save all settings in this buffer? "))
+ (progn
+ (mapc (lambda (child)
+ (when (memq (widget-get child :custom-state)
+ '(modified set changed rogue))
+ (widget-apply child :custom-save)))
+ children)
+ (custom-save-all))
+ (message "Aborted"))))
(defvar custom-reset-menu
- '(("Show current settings" . Custom-reset-current)
- ("Show saved settings" . Custom-reset-saved)
+ '(("Undo Edits" . Custom-reset-current)
+ ("Reset to Saved" . Custom-reset-saved)
("Erase Customization (use standard values)" . Custom-reset-standard))
"Alist of actions for the `Reset' button.
The key is a string containing the name of the action, the value is a
(defun custom-reset (event)
"Select item from reset menu."
(let* ((completion-ignore-case t)
- (answer (widget-choose "Reset buffer"
+ (answer (widget-choose "Reset settings"
custom-reset-menu
event)))
(if answer
(funcall answer))))
(defun Custom-reset-current (&rest ignore)
- "Reset all modified group members to their current value."
+ "Reset all edited settings in the buffer to show their current values."
(interactive)
- (if (y-or-n-p "Update buffer text to show all current settings? ")
- (let ((children custom-options))
+ (let ((children custom-options))
+ (if (or (and (= 1 (length children))
+ (memq (widget-type (car children))
+ '(custom-variable custom-face)))
+ (y-or-n-p "Reset all settings' buffer text to show current values? "))
(mapc (lambda (widget)
(if (memq (widget-get widget :custom-state)
'(modified changed))
(widget-apply widget :custom-reset-current)))
- children))
- (message "Aborted")))
+ children)
+ (message "Aborted"))))
(defun Custom-reset-saved (&rest ignore)
- "Reset all modified or set group members to their saved value."
+ "Reset all edited or set settings in the buffer to their saved value.
+This also shows the saved values in the buffer."
(interactive)
- (if (y-or-n-p "Update buffer text to show all saved settings? ")
- (let ((children custom-options))
+ (let ((children custom-options))
+ (if (or (and (= 1 (length children))
+ (memq (widget-type (car children))
+ '(custom-variable custom-face)))
+ (y-or-n-p "Reset all settings (current values and buffer text) to saved values? "))
(mapc (lambda (widget)
(if (memq (widget-get widget :custom-state)
'(modified set changed rogue))
(widget-apply widget :custom-reset-saved)))
- children))
- (message "Aborted")))
+ children)
+ (message "Aborted"))))
(defun Custom-reset-standard (&rest ignore)
"Erase all customization (either current or saved) for the group members.
(if (or (and (= 1 (length children))
(memq (widget-type (car children))
'(custom-variable custom-face)))
- (yes-or-no-p "Really erase all customizations in this buffer? "))
+ (yes-or-no-p "Erase all customizations for settings in this buffer? "))
(mapc (lambda (widget)
(and (if (widget-get widget :custom-standard-value)
(widget-apply widget :custom-standard-value)
"Set customized value for %s to: "
current-prefix-arg))
(custom-load-symbol variable)
+ (custom-push-theme 'theme-value variable 'user 'set (custom-quote value))
(funcall (or (get variable 'custom-set) 'set-default) variable value)
(put variable 'customized-value (list (custom-quote value)))
(cond ((string= comment "")
(defvar customize-changed-options-previous-release "21.1"
"Version for `customize-changed-options' to refer back to by default.")
+;; Packages will update this variable, so make it available.
+;;;###autoload
+(defvar customize-package-emacs-version-alist nil
+ "Alist mapping versions of Emacs to versions of a package.
+These package versions are listed in the :package-version
+keyword used in `defcustom', `defgroup', and `defface'. Its
+elements look like this:
+
+ (PACKAGE (PVERSION . EVERSION)...)
+
+For each PACKAGE, which is a symbol, there are one or more
+elements that contain a package version PVERSION with an
+associated Emacs version EVERSION. These versions are strings.
+For example, the MH-E package updates this alist with the
+following:
+
+ (add-to-list 'customize-package-emacs-version-alist
+ '(MH-E (\"6.0\" . \"22.1\") (\"6.1\" . \"22.1\")
+ (\"7.0\" . \"22.1\") (\"7.1\" . \"22.1\")
+ (\"7.2\" . \"22.1\") (\"7.3\" . \"22.1\")
+ (\"7.4\" . \"22.1\") (\"8.0\" . \"22.1\")))
+
+The value of PACKAGE needs to be unique and it needs to match the
+PACKAGE value appearing in the :package-version keyword. Since
+the user might see the value in a error message, a good choice is
+the official name of the package, such as MH-E or Gnus.")
+
;;;###autoload
(defalias 'customize-changed 'customize-changed-options)
With argument SINCE-VERSION (a string), customize all settings
that were added or redefined since that version."
- (interactive "sCustomize options changed, since version (default all versions): ")
+ (interactive
+ (list
+ (read-from-minibuffer
+ (format "Customize options changed, since version (default %s): "
+ customize-changed-options-previous-release))))
(if (equal since-version "")
(setq since-version nil)
(unless (condition-case nil
(let (found)
(mapatoms
(lambda (symbol)
- (let ((version (get symbol 'custom-version)))
+ (let* ((package-version (get symbol 'custom-package-version))
+ (version
+ (or (and package-version
+ (customize-package-emacs-version symbol
+ package-version))
+ (get symbol 'custom-version))))
(if version
(when (customize-version-lessp since-version version)
(if (or (get symbol 'custom-group)
(error "No user option defaults have been changed since Emacs %s"
since-version))))
+(defun customize-package-emacs-version (symbol package-version)
+ "Return Emacs version of SYMBOL.
+PACKAGE-VERSION has the form (PACKAGE . VERSION). The VERSION of
+PACKAGE is looked up in the associated list
+`customize-package-emacs-version-alist' to find the version of
+Emacs that is associated with it."
+ (let (package-versions emacs-version)
+ ;; Use message instead of error since we want user to be able to
+ ;; see the rest of the symbols even if a package author has
+ ;; botched things up.
+ (cond ((not (listp package-version))
+ (message "Invalid package-version value for %s" symbol))
+ ((setq package-versions (assq (car package-version)
+ customize-package-emacs-version-alist))
+ (setq emacs-version
+ (cdr (assoc (cdr package-version) package-versions)))
+ (unless emacs-version
+ (message "%s version %s not found in %s" symbol
+ (cdr package-version)
+ "customize-package-emacs-version-alist")))
+ (t
+ (message "Package %s neglected to update %s"
+ (car package-version)
+ "customize-package-emacs-version-alist")))
+ emacs-version))
+
(defun customize-version-lessp (version1 version2)
;; Why are the versions strings, and given that they are, why aren't
;; they converted to numbers and compared as such here? -- fx
;;;###autoload
(defun customize-rogue ()
- "Customize all user variable modified outside customize."
+ "Customize all user variables modified outside customize."
(interactive)
(let ((found nil))
(mapatoms (lambda (symbol)
(if custom-raised-buttons
"`Raised' text indicates"
"Square brackets indicate")))
- (widget-create 'info-link
+ (widget-create 'custom-manual
:tag "Custom file"
- :button-face 'custom-link
- :mouse-face 'highlight
"(emacs)Saving Customizations")
(widget-insert
" for information on how to save in a different file.\n
See ")
- (widget-create 'info-link
+ (widget-create 'custom-manual
:tag "Help"
- :button-face 'custom-link
- :mouse-face 'highlight
:help-echo "Read the online help."
"(emacs)Easy Customization")
(widget-insert " for more information.\n\n")
- (widget-insert "Operate on everything in this buffer:\n "))
+ (widget-insert "Operate on all settings in this buffer that \
+are not marked HIDDEN:\n "))
(widget-insert " "))
+ (widget-create 'push-button
+ :tag "Set for Current Session"
+ :help-echo "\
+Make your editing in this buffer take effect for this session."
+ :action (lambda (widget &optional event)
+ (Custom-set)))
+ (if (not custom-buffer-verbose-help)
+ (progn
+ (widget-insert " ")
+ (widget-create 'custom-manual
+ :tag "Help"
+ :help-echo "Read the online help."
+ "(emacs)Easy Customization")))
+ (when (or custom-file user-init-file)
+ (widget-insert " ")
+ (widget-create 'push-button
+ :tag "Save for Future Sessions"
+ :help-echo "\
+Make your editing in this buffer take effect for future Emacs sessions.
+This updates your Emacs initialization file or creates a new one."
+ :action (lambda (widget &optional event)
+ (Custom-save))))
(if custom-reset-button-menu
(progn
(widget-insert " ")
(custom-reset event))))
(widget-insert "\n ")
(widget-create 'push-button
- :tag "Show Current Settings"
+ :tag "Undo Edits"
:help-echo "\
Reset all edited text in this buffer to reflect current values."
:action 'Custom-reset-current)
(widget-insert " ")
(widget-create 'push-button
- :tag "Show Saved Settings"
+ :tag "Reset to Saved"
:help-echo "\
Reset all settings in this buffer to their saved values."
:action 'Custom-reset-saved)
(widget-create 'push-button
:tag "Erase Customization"
:help-echo "\
-Un-customize all settings in this buffer--save them with standard values."
+Un-customize all settings in this buffer and save them with standard values."
:action 'Custom-reset-standard)))
- (widget-insert "\n ")
- (widget-create 'push-button
- :tag "Set for Current Session"
- :help-echo "\
-Make your editing in this buffer take effect for this session."
- :action (lambda (widget &optional event)
- (Custom-set)))
- (if (not custom-buffer-verbose-help)
- (progn
- (widget-insert " ")
- (widget-create 'info-link
- :tag "Help"
- :button-face 'custom-link
- :mouse-face 'highlight
- :help-echo "Read the online help."
- "(emacs)Easy Customization")))
- (when (or custom-file user-init-file)
- (widget-insert " ")
- (widget-create 'push-button
- :tag "Save for Future Sessions"
- :help-echo "\
-Make your editing in this buffer take effect for future Emacs sessions.
-This updates your Emacs initialization file or creates a new one."
- :action (lambda (widget &optional event)
- (Custom-save))))
(widget-insert " ")
(widget-create 'push-button
:tag "Finish"
(let ((custom-buffer-style 'tree))
(custom-toggle-parent widget)))
-(define-widget 'custom-browse-group-tag 'push-button
+(define-widget 'custom-browse-group-tag 'custom-group-link
"Show parent in other window when activated."
:tag "Group"
:tag-glyph "folder"
(let ((parent (widget-get widget :parent)))
(customize-group-other-window (widget-value parent))))
-(define-widget 'custom-browse-variable-tag 'push-button
+(define-widget 'custom-browse-variable-tag 'custom-group-link
"Show parent in other window when activated."
:tag "Option"
:tag-glyph "option"
(let ((parent (widget-get widget :parent)))
(customize-variable-other-window (widget-value parent))))
-(define-widget 'custom-browse-face-tag 'push-button
+(define-widget 'custom-browse-face-tag 'custom-group-link
"Show parent in other window when activated."
:tag "Face"
:tag-glyph "face"
:help-echo "Read the manual entry for this option."
:button-face 'custom-link
:mouse-face 'highlight
+ :pressed-face 'highlight
:tag "Manual")
;;; The `custom-magic' Widget.
:group 'custom-faces)
(defface custom-button-unraised
- '((((min-colors 88)
- (class color) (background light)) :foreground "blue1" :underline t)
- (((class color) (background light)) :foreground "blue" :underline t)
- (((min-colors 88)
- (class color) (background dark)) :foreground "cyan1" :underline t)
- (((class color) (background dark)) :foreground "cyan" :underline t)
- (t :underline t))
+ '((t :inherit underline))
"Face for custom buffer buttons if `custom-raised-buttons' is nil."
:version "22.1"
:group 'custom-faces)
'custom-button-pressed
'custom-button-pressed-unraised))
-(defface custom-documentation nil
+(defface custom-documentation '((t nil))
"Face used for documentation strings in customization buffers."
:group 'custom-faces)
;; backward-compatibility alias
(put 'custom-state-face 'face-alias 'custom-state)
(defface custom-link
- '((((min-colors 88)
- (class color) (background light)) :foreground "blue1" :underline t)
- (((class color) (background light)) :foreground "blue" :underline t)
- (((min-colors 88)
- (class color) (background dark)) :foreground "cyan1" :underline t)
- (((class color) (background dark)) :foreground "cyan" :underline t)
- (t :underline t))
- "Face for Info links in customization buffers."
- :group 'info)
+ '((t :inherit link))
+ "Face for links in customization buffers."
+ :version "22.1"
+ :group 'custom-faces)
(define-widget 'custom 'default
"Customize a user option."
(insert prefix))
(insert "See also ")
(while links
- (push (widget-create-child-and-convert widget (car links))
+ (push (widget-create-child-and-convert
+ widget (car links)
+ :button-face 'custom-link
+ :mouse-face 'highlight
+ :pressed-face 'highlight)
buttons)
(setq links (cdr links))
(cond ((null links)
(when links
(insert "\nParent documentation: ")
(while links
- (push (widget-create-child-and-convert widget (car links))
+ (push (widget-create-child-and-convert
+ widget (car links)
+ :button-face 'custom-link
+ :mouse-face 'highlight
+ :pressed-face 'highlight)
buttons)
(setq links (cdr links))
(cond ((null links)
;;; The `custom-comment' Widget.
;; like the editable field
-(defface custom-comment '((((class grayscale color)
+(defface custom-comment '((((type tty))
+ :background "yellow3"
+ :foreground "black")
+ (((class grayscale color)
(background light))
- (:background "gray85"))
+ :background "gray85")
(((class grayscale color)
(background dark))
- (:background "dim gray"))
+ :background "dim gray")
(t
- (:slant italic)))
+ :slant italic))
"Face used for comments on variables or faces"
:version "21.1"
:group 'custom-faces)
(get (widget-value widget) 'standard-value))
(defvar custom-variable-menu
- `(("Show current value" custom-redraw
+ `(("Set for Current Session" custom-variable-set
+ (lambda (widget)
+ (eq (widget-get widget :custom-state) 'modified)))
+ ,@(when (or custom-file user-init-file)
+ '(("Save for Future Sessions" custom-variable-save
+ (lambda (widget)
+ (memq (widget-get widget :custom-state)
+ '(modified set changed rogue))))))
+ ("Undo Edits" custom-redraw
(lambda (widget)
(and (default-boundp (widget-value widget))
(memq (widget-get widget :custom-state) '(modified changed)))))
- ("Show saved value" custom-variable-reset-saved
+ ("Reset to Saved" custom-variable-reset-saved
(lambda (widget)
(and (or (get (widget-value widget) 'saved-value)
(get (widget-value widget) 'saved-variable-comment))
(memq (widget-get widget :custom-state)
'(modified set changed rogue)))))
- ("Show backup value" custom-variable-reset-backup
- (lambda (widget)
- (get (widget-value widget) 'backup-value)))
- ("---" ignore ignore)
- ("Add comment" custom-comment-show custom-comment-invisible-p)
- ("Show value widget" custom-variable-edit
- (lambda (widget)
- (eq (widget-get widget :custom-form) 'lisp)))
- ("Show Lisp expression" custom-variable-edit-lisp
- (lambda (widget)
- (eq (widget-get widget :custom-form) 'edit)))
- ("---" ignore ignore)
,@(when (or custom-file user-init-file)
- '(("Erase customization" custom-variable-reset-standard
+ '(("Erase Customization" custom-variable-reset-standard
(lambda (widget)
(and (get (widget-value widget) 'standard-value)
(memq (widget-get widget :custom-state)
'(modified set changed saved rogue)))))))
- ("Set for current session" custom-variable-set
+ ("Set to Backup Value" custom-variable-reset-backup
(lambda (widget)
- (eq (widget-get widget :custom-state) 'modified)))
- ,@(when (or custom-file user-init-file)
- '(("Save for future sessions" custom-variable-save
- (lambda (widget)
- (memq (widget-get widget :custom-state)
- '(modified set changed rogue)))))))
+ (get (widget-value widget) 'backup-value)))
+ ("---" ignore ignore)
+ ("Add Comment" custom-comment-show custom-comment-invisible-p)
+ ("---" ignore ignore)
+ ("Show Current Value" custom-variable-edit
+ (lambda (widget)
+ (eq (widget-get widget :custom-form) 'lisp)))
+ ("Show Saved Lisp Expression" custom-variable-edit-lisp
+ (lambda (widget)
+ (eq (widget-get widget :custom-form) 'edit))))
"Alist of actions for the `custom-variable' widget.
Each entry has the form (NAME ACTION FILTER) where NAME is the name of
the menu entry, ACTION is the function to call on the widget when the
(defun custom-variable-reset-saved (widget)
"Restore the saved value for the variable being edited by WIDGET.
+This also updates the buffer to show that value.
The value that was current before this operation
becomes the backup value, so you can get it again."
(let* ((symbol (widget-value widget))
(message "Creating face editor...done"))))))
(defvar custom-face-menu
- `(("Show saved face" custom-face-reset-saved
+ `(("Set for Current Session" custom-face-set)
+ ,@(when (or custom-file user-init-file)
+ '(("Save for Future Sessions" custom-face-save)))
+ ("Undo Edits" custom-redraw
+ (lambda (widget)
+ (memq (widget-get widget :custom-state) '(modified changed))))
+ ("Reset to Saved" custom-face-reset-saved
(lambda (widget)
(or (get (widget-value widget) 'saved-face)
(get (widget-value widget) 'saved-face-comment))))
+ ,@(when (or custom-file user-init-file)
+ '(("Erase Customization" custom-face-reset-standard
+ (lambda (widget)
+ (get (widget-value widget) 'face-defface-spec)))))
("---" ignore ignore)
- ("Add comment" custom-comment-show custom-comment-invisible-p)
- ("Show all attributes" custom-face-edit-all
- (lambda (widget)
- (not (eq (widget-get widget :custom-form) 'all))))
- ("Show current attributes" custom-face-edit-selected
+ ("Add Comment" custom-comment-show custom-comment-invisible-p)
+ ("---" ignore ignore)
+ ("For Current Display" custom-face-edit-selected
(lambda (widget)
(not (eq (widget-get widget :custom-form) 'selected))))
- ("Show Lisp expression" custom-face-edit-lisp
+ ("For All Kinds of Displays" custom-face-edit-all
(lambda (widget)
- (not (eq (widget-get widget :custom-form) 'lisp))))
- ("---" ignore ignore)
- ,@(when (or custom-file user-init-file)
- '(("Erase customization" custom-face-reset-standard
- (lambda (widget)
- (get (widget-value widget) 'face-defface-spec)))))
- ("Set for current session" custom-face-set)
- ,@(when (or custom-file user-init-file)
- '(("Save for future sessions" custom-face-save-command))))
+ (not (eq (widget-get widget :custom-form) 'all))))
+ ("Show Lisp Expression" custom-face-edit-lisp
+ (lambda (widget)
+ (not (eq (widget-get widget :custom-form) 'lisp)))))
"Alist of actions for the `custom-face' widget.
Each entry has the form (NAME ACTION FILTER) where NAME is the name of
the menu entry, ACTION is the function to call on the widget when the
;; Make the comment invisible by hand if it's empty
(custom-comment-hide comment-widget))
(put symbol 'customized-face value)
+ (custom-push-theme 'theme-face symbol 'user 'set 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))))
- (custom-push-theme 'theme-face symbol 'user 'set value)
(put symbol 'customized-face-comment comment)
(put symbol 'face-comment comment)
(custom-face-state-set widget)
(custom-redraw-magic widget)))
-(defun custom-face-save-command (widget)
- "Save in `.emacs' the face attributes in WIDGET."
- (custom-face-save widget)
- (custom-save-all))
-
(defun custom-face-save (widget)
- "Prepare for saving WIDGET's face attributes, but don't write `.emacs'."
+ "Save in `.emacs' the face attributes in WIDGET."
(let* ((symbol (widget-value widget))
(child (car (widget-get widget :children)))
(value (custom-post-filter-face-spec (widget-value child)))
(setq comment nil)
;; Make the comment invisible by hand if it's empty
(custom-comment-hide comment-widget))
+ (custom-push-theme 'theme-face symbol 'user 'set value)
(if (face-spec-choose value)
(face-spec-set symbol value)
;; face-set-spec ignores empty attribute lists, so just give it
(face-spec-set symbol '((t :foreground unspecified))))
(unless (eq (widget-get widget :custom-state) 'standard)
(put symbol 'saved-face value))
- (custom-push-theme 'theme-face symbol 'user 'set value)
(put symbol 'customized-face nil)
(put symbol 'face-comment comment)
(put symbol 'customized-face-comment nil)
(custom-face-state-set widget)
(custom-redraw-magic widget)))
+;; For backward compatibility.
+(define-obsolete-function-alias 'custom-face-save-command 'custom-face-save
+ "22.1")
+
(defun custom-face-reset-saved (widget)
"Restore WIDGET to the face's default attributes."
(let* ((symbol (widget-value widget))
(put symbol 'customized-face nil)
(put symbol 'customized-face-comment nil)
(custom-push-theme 'theme-face symbol 'user 'reset)
+ (face-spec-set symbol value)
(custom-theme-recalc-face symbol)
(when (or (get symbol 'saved-face) (get symbol 'saved-face-comment))
(put symbol 'saved-face nil)
(put symbol 'saved-face-comment nil)
(custom-save-all))
(put symbol 'face-comment nil)
- (widget-value-set child value)
+ (widget-value-set child
+ (custom-pre-filter-face-spec
+ (list (list t (custom-face-attributes-get
+ symbol nil)))))
;; This call manages the comment visibility
(widget-value-set comment-widget "")
(custom-face-state-set widget)
(define-widget 'custom-group-link 'link
"Show parent in other window when activated."
+ :button-face 'custom-link
+ :mouse-face 'highlight
+ :pressed-face 'highlight
:help-echo "Create customization buffer for this group."
:action 'custom-group-link-action)
(insert "/\n")))))
(defvar custom-group-menu
- `(("Show current settings" custom-group-reset-current
- (lambda (widget)
- (memq (widget-get widget :custom-state) '(modified))))
- ("Show saved settings" custom-group-reset-saved
+ `(("Set for Current Session" custom-group-set
(lambda (widget)
- (memq (widget-get widget :custom-state) '(modified set))))
+ (eq (widget-get widget :custom-state) 'modified)))
,@(when (or custom-file user-init-file)
- '(("Show standard settings" custom-group-reset-standard
+ '(("Save for Future Sessions" custom-group-save
(lambda (widget)
- (memq (widget-get widget :custom-state) '(modified set saved))))))
- ("---" ignore ignore)
- ("Set for current session" custom-group-set
+ (memq (widget-get widget :custom-state) '(modified set))))))
+ ("Undo Edits" custom-group-reset-current
(lambda (widget)
- (eq (widget-get widget :custom-state) 'modified)))
+ (memq (widget-get widget :custom-state) '(modified))))
+ ("Reset to Saved" custom-group-reset-saved
+ (lambda (widget)
+ (memq (widget-get widget :custom-state) '(modified set))))
,@(when (or custom-file user-init-file)
- '(("Save for future sessions" custom-group-save
+ '(("Erase Customization" custom-group-reset-standard
(lambda (widget)
- (memq (widget-get widget :custom-state) '(modified set)))))))
+ (memq (widget-get widget :custom-state) '(modified set saved)))))))
"Alist of actions for the `custom-group' widget.
Each entry has the form (NAME ACTION FILTER) where NAME is the name of
the menu entry, ACTION is the function to call on the widget when the
(mapatoms
(lambda (symbol)
(if (and (get symbol 'saved-value)
- (eq 'user (car (car-safe (get symbol 'theme-value)))))
+ ;; ignore theme values
+ (or (null (get symbol 'theme-value))
+ (eq 'user (caar (get symbol 'theme-value)))))
(nconc saved-list (list symbol)))))
(setq saved-list (sort (cdr saved-list) 'string<))
(unless (bolp)
(define-key map "u" 'Custom-goto-parent)
(define-key map "n" 'widget-forward)
(define-key map "p" 'widget-backward)
- (define-key map [mouse-1] 'widget-move-and-invoke)
map)
"Keymap for `custom-mode'.")
,(customize-menu-create 'customize)
["Set" Custom-set t]
["Save" Custom-save t]
- ["Show current settings" Custom-reset-current t]
- ["Show saved settings" Custom-reset-saved t]
- ["Erase customizations" Custom-reset-standard t]
+ ["Undo Edits" Custom-reset-current t]
+ ["Reset to Saved" Custom-reset-saved t]
+ ["Erase Customization" Custom-reset-standard t]
["Info" (info "(emacs)Easy Customization") t]))
+(defvar custom-field-keymap
+ (let ((map (copy-keymap widget-field-keymap)))
+ (define-key map "\C-c\C-c" 'Custom-set)
+ (define-key map "\C-x\C-s" 'Custom-save)
+ map)
+ "Keymap used inside editable fields in customization buffers.")
+
+(widget-put (get 'editable-field 'widget-type) :keymap custom-field-keymap)
+
(defun Custom-goto-parent ()
"Go to the parent group listed at the top of this buffer.
If several parents are listed, go to the first of them."
The following commands are available:
-Move to next button or editable field. \\[widget-forward]
-Move to previous button or editable field. \\[widget-backward]
-\\<widget-field-keymap>\
+\\<widget-keymap>\
+Move to next button, link or editable field. \\[widget-forward]
+Move to previous button, link or editable field. \\[advertised-widget-backward]
+\\<custom-field-keymap>\
Complete content of editable text field. \\[widget-complete]
\\<custom-mode-map>\
-Invoke button under the mouse pointer. \\[Custom-move-and-invoke]
-Invoke button under point. \\[widget-button-press]
+Invoke button under the mouse pointer. \\[widget-button-click]
+Invoke button under point. \\[widget-button-press]
Set all options from current text. \\[Custom-set]
Make values in current text permanent. \\[Custom-save]
-Make text match actual option values. \\[Custom-reset-current]
-Reset options to permanent settings. \\[Custom-reset-saved]
+Make text match actual option values. \\[Custom-reset-current]
+Reset options to permanent settings. \\[Custom-reset-saved]
Erase customizations; set options
and buffer text to the standard values. \\[Custom-reset-standard]